📄 nrf905_send.lst
字号:
(0108) #define TX_ADDRESS_3 TX_ADDRESS & 0xff //发送有效地址第4字节
(0109)
(0110) /*-----------------------------------------------
(0111) nrf905命令控制字 author:HotPower
(0112) ------------------------------------------------*/
(0113) #define WC 0x00 // Write configuration register command
(0114) #define RC 0x10 // Read configuration register command
(0115) #define WTP 0x20 // Write TX Payload command
(0116) #define RTP 0x21 // Read TX Payload command
(0117) #define WTA 0x22 // Write TX Address command
(0118) #define RTA 0x23 // Read TX Address command
(0119) #define RRP 0x24 // Read RX Payload command
(0120)
(0121) void clear_Tx_Buf(void) //清空发送缓冲
(0122) {
(0123) int i;
(0124) for (i=0;i<32;i++)
_clear_Tx_Buf:
i --> R16
0171 2700 CLR R16
0172 2711 CLR R17
(0125) Tx_Buf[i]='';
0173 E18B LDI R24,0x1B
0174 E091 LDI R25,1
0175 01F8 MOVW R30,R16
0176 0FE8 ADD R30,R24
0177 1FF9 ADC R31,R25
0178 2422 CLR R2
0179 8220 STD Z+0,R2
017A 5F0F SUBI R16,0xFF
017B 4F1F SBCI R17,0xFF
017C 3200 CPI R16,0x20
017D E0E0 LDI R30,0
017E 071E CPC R17,R30
017F F39C BLT 0x0173
(0126) }
0180 9508 RET
_Read_nrf905Add:
0181 D7D7 RCALL push_gset2
(0127)
(0128) void Read_nrf905Add(void)
(0129) //读取nrf905的接受发送地址
(0130) {
(0131) Tx_Buf[0]=(int)RX_ADDRESS;//子机地址
0182 E041 LDI R20,1
0183 E151 LDI R21,0x11
0184 E161 LDI R22,0x11
0185 E171 LDI R23,0x11
0186 011A MOVW R2,R20
0187 9220011B STS _Tx_Buf,R2
(0132) Tx_Buf[1]=0x03;//命令字
0189 E083 LDI R24,3
018A 9380011C STS _Tx_Buf+1,R24
(0133) }
018C D7AF RCALL pop_gset2
018D 9508 RET
(0134)
(0135) //配置nRF905
(0136) void nrf905_Config(void)//通过向spi 向905写寄存器从而配置寄存器
(0137) {
(0138) CLR(PORTB,CSN); // Spi 片选开,使能spi
_nrf905_Config:
018E 98C2 CBI 0x18,2
(0139) nrf905_SpiRW(WC); // Write config command ,
018F 2700 CLR R16
0190 D016 RCALL _nrf905_SpiRW
(0140) nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
0191 E40C LDI R16,0x4C
0192 D014 RCALL _nrf905_SpiRW
(0141) //nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
(0142) nrf905_SpiRW(PA_PWR__10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
0193 2700 CLR R16
0194 D012 RCALL _nrf905_SpiRW
(0143) nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
0195 E404 LDI R16,0x44
0196 D010 RCALL _nrf905_SpiRW
(0144) nrf905_SpiRW(RX_PW_32BYTE); //接收数据宽度32字节
0197 E200 LDI R16,0x20
0198 D00E RCALL _nrf905_SpiRW
(0145) nrf905_SpiRW(TX_PW_32BYTE); //发送数据宽度32字节
0199 E200 LDI R16,0x20
019A D00C RCALL _nrf905_SpiRW
(0146) nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
019B E101 LDI R16,0x11
019C D00A RCALL _nrf905_SpiRW
(0147) nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
019D E101 LDI R16,0x11
019E D008 RCALL _nrf905_SpiRW
(0148) nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
019F E101 LDI R16,0x11
01A0 D006 RCALL _nrf905_SpiRW
(0149) nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
01A1 E001 LDI R16,1
01A2 D004 RCALL _nrf905_SpiRW
(0150) //nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
(0151) nrf905_SpiRW(0x00); //CRC16模式使能,晶体振荡器频率16MHz
01A3 2700 CLR R16
01A4 D002 RCALL _nrf905_SpiRW
(0152) SET(PORTB,CSN); // Disable Spi
01A5 9AC2 SBI 0x18,2
(0153) }
01A6 9508 RET
_nrf905_SpiRW:
temp --> R20
val --> R16
01A7 D79A RCALL push_gset1
(0154)
(0155) uchar nrf905_SpiRW(uchar val)
(0156) {
(0157) uchar temp;
(0158)
(0159) SPDR=val;
01A8 B90F OUT 0x0F,R16
(0160) while ((SPSR&(1<<SPIF))==0);//置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中断使能位置位,就会引发SPI 中断
01A9 9B77 SBIS 0x0E,7
01AA CFFE RJMP 0x01A9
(0161) temp=SPDR;
01AB B14F IN R20,0x0F
(0162) return temp;
01AC 2F04 MOV R16,R20
01AD D797 RCALL pop_gset1
01AE 9508 RET
(0163) }
(0164)
(0165) //PwrDown->StandBy
(0166) void nrf905_StandBy(void)
(0167) {
(0168) SET(PORTD,PWR);//上电
_nrf905_StandBy:
01AF 9A95 SBI 0x12,5
(0169) CLR(PORTD,TRXCE);
01B0 9896 CBI 0x12,6
(0170) CLR(PORTD,TX_EN);
01B1 9897 CBI 0x12,7
(0171) }
01B2 9508 RET
(0172)
(0173) //->PwrDown
(0174) void nrf905_Off(void)
(0175) {
(0176) CLR(PORTD,PWR);
_nrf905_Off:
01B3 9895 CBI 0x12,5
(0177) }
01B4 9508 RET
(0178)
(0179) //->ShockBurst Send
(0180) void nrf905_TxOn(void)
(0181) {
(0182) SET(PORTD,PWR);
_nrf905_TxOn:
01B5 9A95 SBI 0x12,5
(0183) SET(PORTD,TX_EN);
01B6 9A97 SBI 0x12,7
(0184) CLR(PORTD,TRXCE);
01B7 9896 CBI 0x12,6
(0185) }
01B8 9508 RET
(0186)
(0187) //->ShockBurst Send
(0188) void nrf905_TxSend(void)
(0189) {
(0190) SET(PORTD,TRXCE);
_nrf905_TxSend:
01B9 9A96 SBI 0x12,6
(0191) delay_us(20);//>10us
01BA E104 LDI R16,0x14
01BB E010 LDI R17,0
01BC D0AE RCALL _delay_us
(0192) CLR(PORTD,TRXCE);//只发送一次
01BD 9896 CBI 0x12,6
(0193)
(0194) }
01BE 9508 RET
(0195)
(0196)
(0197)
(0198) //初始化nrf905
(0199) void nrf905_Init(void)
(0200) {
(0201) nrf905_StandBy();
_nrf905_Init:
01BF DFEF RCALL _nrf905_StandBy
(0202) delay_10ms(2);//!!!must >3ms
01C0 E002 LDI R16,2
01C1 E010 LDI R17,0
01C2 D085 RCALL _delay_10ms
(0203) nrf905_Config();
(0204)
(0205) // nrf905_SpiTest();//test... 测试:通过读配置,判断SPI操作是否正确
(0206) // nrf905_RxOn();//enable nrf905接收
(0207) }
01C3 CFCA RJMP _nrf905_Config
_nrf905_SpiTest:
i --> R20
01C4 D77D RCALL push_gset1
(0208)
(0209)
(0210) //测试:通过读配置,判断SPI操作是否正确
(0211) void nrf905_SpiTest(void)
(0212) {
(0213) uchar i;
(0214) CLR(PORTB,CSN);
01C5 98C2 CBI 0x18,2
(0215) nrf905_SpiRW(RC); //读配置
01C6 E100 LDI R16,0x10
01C7 DFDF RCALL _nrf905_SpiRW
(0216) for (i=0;i<10;i++)
01C8 2744 CLR R20
01C9 C00A RJMP 0x01D4
(0217) {
(0218) Rx_Buf[i]=nrf905_SpiRW(0);//read from nrf905
01CA 2700 CLR R16
01CB DFDB RCALL _nrf905_SpiRW
01CC EF8B LDI R24,0xFB
01CD E090 LDI R25,0
01CE 2FE4 MOV R30,R20
01CF 27FF CLR R31
01D0 0FE8 ADD R30,R24
01D1 1FF9 ADC R31,R25
01D2 8300 STD Z+0,R16
01D3 9543 INC R20
01D4 304A CPI R20,0xA
01D5 F3A0 BCS 0x01CA
(0219) }
(0220) SET(PORTB,CSN);
01D6 9AC2 SBI 0x18,2
(0221)
(0222) }
01D7 D76D RCALL pop_gset1
01D8 9508 RET
(0223)
(0224)
(0225) //写Tx地址
(0226) void nrf905_SetTxAddr(void)
(0227) {
(0228) CLR(PORTB,CSN);
_nrf905_SetTxAddr:
01D9 98C2 CBI 0x18,2
(0229) nrf905_SpiRW(WTA); //写Tx地址
01DA E202 LDI R16,0x22
01DB DFCB RCALL _nrf905_SpiRW
(0230) nrf905_SpiRW(TX_ADDRESS_0);
01DC E101 LDI R16,0x11
01DD DFC9 RCALL _nrf905_SpiRW
(0231) nrf905_SpiRW(TX_ADDRESS_1);
01DE E101 LDI R16,0x11
01DF DFC7 RCALL _nrf905_SpiRW
(0232) nrf905_SpiRW(TX_ADDRESS_2);
01E0 E101 LDI R16,0x11
01E1 DFC5 RCALL _nrf905_SpiRW
(0233) nrf905_SpiRW(TX_ADDRESS_3);
01E2 E101 LDI R16,0x11
01E3 DFC3 RCALL _nrf905_SpiRW
(0234) SET(PORTB,CSN);
01E4 9AC2 SBI 0x18,2
(0235) }
01E5 9508 RET
_nrf905_SetData:
i --> R20
01E6 D75B RCALL push_gset1
(0236)
(0237) //写Tx数据
(0238) void nrf905_SetData(void)
(0239) {uchar i;
(0240)
(0241) CLR(PORTB,CSN);
01E7 98C2 CBI 0x18,2
(0242) nrf905_SpiRW(WTP); //写TxPayload
01E8 E200 LDI R16,0x20
01E9 DFBD RCALL _nrf905_SpiRW
(0243) for (i=0;i<SIZE;i++)
01EA 2744 CLR R20
01EB C009 RJMP 0x01F5
(0244) {
(0245) nrf905_SpiRW(Tx_Buf[i]);
01EC E18B LDI R24,0x1B
01ED E091 LDI R25,1
01EE 2FE4 MOV R30,R20
01EF 27FF CLR R31
01F0 0FE8 ADD R30,R24
01F1 1FF9 ADC R31,R25
01F2 8100 LDD R16,Z+0
01F3 DFB3 RCALL _nrf905_SpiRW
01F4 9543 INC R20
01F5 3240 CPI R20,0x20
01F6 F3A8 BCS 0x01EC
(0246) }
(0247)
(0248) SET(PORTB,CSN);
01F7 9AC2 SBI 0x18,2
(0249)
(0250) }
01F8 D74C RCALL pop_gset1
01F9 9508 RET
(0251)
(0252) //等待发送结束
(0253) void nrf905_WaitSended(void)
(0254) {
(0255) while ((PIND&(1<<DR))==0);
_nrf905_WaitSended:
01FA 9B82 SBIS 0x10,2
01FB CFFE RJMP _nrf905_WaitSended
(0256) }
01FC 9508 RET
(0257)
(0258) //发送TxBuf中的数据
(0259) void nrf905_SendData(void)
(0260) {
(0261) nrf905_TxOn();//切换到发送模式
_nrf905_SendData:
01FD DFB7 RCALL _nrf905_TxOn
(0262) delay_10ms(2);
01FE E002 LDI R16,2
01FF E010 LDI R17,0
0200 D047 RCALL _delay_10ms
(0263) nrf905_SetTxAddr();//写发送地址WTA
0201 DFD7 RCALL _nrf905_SetTxAddr
(0264) nrf905_SetData();//写数据WTP
0202 DFE3 RCALL _nrf905_SetData
(0265) nrf905_TxSend();//启动发送
0203 DFB5 RCALL _nrf905_TxSend
(0266) nrf905_WaitSended();//等待发送结束
(0267)
(0268) }
0204 CFF5 RJMP _nrf905_WaitSended
(0269)
(0270) //测试直接重新发送上次写入的数据
(0271) void nrf905_SendAgain(void)
(0272) {
(0273) nrf905_TxOn();
_nrf905_SendAgain:
0205 DFAF RCALL _nrf905_TxOn
(0274) nrf905_TxSend();
0206 DFB2 RCALL _nrf905_TxSend
(0275) nrf905_WaitSended();
(0276)
(0277) }
0207 CFF2 RJMP _nrf905_WaitSended
(0278)
(0279)
(0280)
(0281) //发送测试
(0282) void RfSendProc(void)
(0283) {
(0284) // puts_hh("Into send process code");
(0285) nrf905_SendData();//发送测试数据
_RfSendProc:
0208 DFF4 RCALL _nrf905_SendData
(0286) nrf905_Off();//断开电源
(0287) // puts_hh(Tx_Buf);//向串口打印数据
(0288) }
0209 CFA9 RJMP _nrf905_Off
FILE: E:\公司用\atmega8l\final\nrf905_send1\timer.c
(0001) //ICC-AVR application builder : 2008-7-29 14:35:46
(0002) // Target : M8
(0003) // Crystal: 4.0000Mhz
(0004) #include "confg.h"
(0005)
(0006) unsigned int i=0,count=0,flag=0;
(0007) int number;
(0008)
(0009) //TIMER0 initialisation - prescale:1024
(0010) // WGM: Normal
(0011) // desired value: 10mSec
(0012) // actual value: 9.984mSec (0.2%)
(0013) void timer0_init(void)
(0014) {
(0015)
(0016) TCCR0 = 0x00; //stop
_timer0_init:
020A 2422 CLR R2
020B BE23 OUT 0x33,R2
(0017) TCNT0 = 0x64; //set count
020C E684 LDI R24,0x64
020D BF82 OUT 0x32,R24
(0018) TCCR0 = 0x04; //start timer
020E E084 LDI R24,4
020F BF83 OUT 0x33,R24
(0019) }
0210 9508 RET
_time0:
0211 922A ST R2,-Y
0212 923A ST R3,-Y
0213 938A ST R24,-Y
0214 939A ST R25,-Y
0215 B62F IN R2,0x3F
0216 922A ST R2,-Y
(0020)
(0021)
(0022) #pragma interrupt_handler time0:10
(0023) void time0(void)
(0024) {
(0025) TCNT0 = 0x64; //set count
0217 E684 LDI R24,0x64
0218 BF82 OUT 0x32,R24
(0026) count++;
0219 918000B1 LDS R24,0xB1
021B 919000B2 LDS R25,0xB2
021D 9601 ADIW R24,1
021E 939000B2 STS 0xB2,R25
0220 938000B1 STS 0xB1,R24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -