?? ptr4000.lst
字號(hào):
i --> R20
us --> R16
013D 940E01FE CALL push_gset1
(0217) }
(0218)
(0219) void DelayUs(uint us)
(0220) {uint i;
(0221) for (i=0;i<us;i++)
013F 2744 CLR R20
0140 2755 CLR R21
0141 C008 RJMP 0x014A
(0222) {NOP();NOP();NOP();NOP();NOP();NOP();
0142 0000 NOP
0143 0000 NOP
0144 0000 NOP
0145 0000 NOP
0146 0000 NOP
0147 0000 NOP
0148 5F4F SUBI R20,0xFF
0149 4F5F SBCI R21,0xFF
014A 1740 CP R20,R16
014B 0751 CPC R21,R17
014C F3A8 BCS 0x0142
014D 940E0201 CALL pop_gset1
014F 9508 RET
_nrf2401A_WR:
i --> R20
temp --> R22
val --> R16
0150 940E01FC CALL push_gset2
FILE: D:\IccAvr\Pei\PTR4000\nrf2401A.C
(0001) #include "config.h"
(0002)
(0003) extern void DelayMs(uchar ms);
(0004) extern void DelayUs(uint us);
(0005)
(0006) //注意:
(0007) //1、nef2401A配置字是先寫(xiě)第15字節(jié)的!!
(0008) //2、發(fā)送后要延時(shí)等發(fā)送結(jié)束后才能轉(zhuǎn)回接收模式,否則數(shù)據(jù)發(fā)送不出
(0009)
(0010)
(0011) #define SIZE 25 //最大數(shù)據(jù)包長(zhǎng)度 32-ADDR4-CRC2=26Byte
(0012) #define ADDRSIZE 4 //地址長(zhǎng)度Byte
(0013)
(0014) #define CH_NO 2 //頻段編號(hào)
(0015)
(0016) #define BPS_1M //編譯控制:1M or 250Kbps
(0017)
(0018) uchar TxBuf[SIZE],RxBuf[SIZE];
(0019)
(0020) /*-------------------------------------------------------------------------------------------
(0021) nrf2401A配置寄存器宏定義
(0022) nrf2401A配置寄存器(15Byte)
(0023) 工作頻率f=2.4G+CH_NO*1MHz
(0024) -------------------------------------------------------------------------------------------*/
(0025) #define RX_ADDRESS 0xCCCCCCCC //接收有效地址(本方)
(0026) #define TX_ADDRESS 0xCCCCCCCC //發(fā)送有效地址(對(duì)方)
(0027)
(0028) #define CH_NO_FREQ CH_NO<<1 //工作頻段 Byte1.7-2
(0029) #define RX_EN 1 //接收發(fā)送切換 Byte1.0 1接收 0發(fā)送
(0030)
(0031) #define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
(0032) #define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
(0033) #define CM_SHOCK 64 //收發(fā)模式ShockBurst Byte2.6
(0034) #define CM_DIRECT 0 //收發(fā)模式DirectMode Byte2.6
(0035) #define RFDR_1M 32 //空中Baud=1M Byte2.5
(0036) #define RFDR_250K 0 //空中Baud=250K Byte2.5
(0037) #define XOF_20MHz 4*4 //晶體振蕩器頻率20MHz Byte2.4~2
(0038) #define XOF_16MHz 3*4 //晶體振蕩器頻率16MHz
(0039) #define XOF_12MHz 2*4 //晶體振蕩器頻率12MHz
(0040) #define XOF_8MHz 1*4 //晶體振蕩器頻率8MHz
(0041) #define XOF_4MHz 0*4 //晶體振蕩器頻率4MHz
(0042) #define PA_PWR_0 0 //輸出功率-20dBm Byte2.1~0
(0043) #define PA_PWR_1 1 //輸出功率-10dBm
(0044) #define PA_PWR_2 2 //輸出功率-5dBm
(0045) #define PA_PWR_3 3 //輸出功率 0dBm
(0046)
(0047) #define ADDR_W (ADDRSIZE<<5) //地址位數(shù) Byte3.7~2
(0048) #define CRC_MODE_16BIT 2 //CRC16模式 Byte3.1 1
(0049) #define CRC_MODE_8BIT 0 //CRC8模式 Byte3.1
(0050) #define CRC_EN 1 //CRC使能 Byte3.0 1
(0051) #define CRC16_EN 3 //CRC16模式使能
(0052) #define CRC8_EN 1 //CRC8模式使能
(0053)
(0054) #define RX_ADDRESS_0 RX_ADDRESS & 0xff //通道1接收有效地址第1字節(jié) Byte4
(0055) #define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字節(jié) Byte5
(0056) #define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字節(jié) Byte6
(0057) #define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字節(jié) Byte7
(0058) #define RX_ADDRESS_4 0 //通道1接收有效地址第5字節(jié) Byte8
(0059)
(0060) #define RX_ADDRESS2 0 //Byte9,10,11,12,13字節(jié)為通道2接收地址
(0061)
(0062) #define DATA1_W SIZE*8 //接收通道1數(shù)據(jù)包長(zhǎng)度,Bit計(jì)算 Byte14
(0063) #define DATA2_W SIZE*8 //接收通道2數(shù)據(jù)包長(zhǎng)度,Bit計(jì)算 Byte15
(0064)
(0065) #define TX_ADDRESS_4 0 //發(fā)送有效地址第5字節(jié)
(0066) #define TX_ADDRESS_3 TX_ADDRESS >> 24 //發(fā)送有效地址第4字節(jié)
(0067) #define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //發(fā)送有效地址第3字節(jié)
(0068) #define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //發(fā)送有效地址第2字節(jié)
(0069) #define TX_ADDRESS_0 TX_ADDRESS & 0xff //發(fā)送有效地址第1字節(jié)
(0070)
(0071)
(0072) //寫(xiě)1Byte
(0073) void nrf2401A_WR(uchar val)
(0074) {uchar temp,i;
(0075) //MSB first 高位開(kāi)始,先輸出DATA,然后CLK_Up,再CLK_Dn
(0076) SET(DDRA,DATA);//置DATA輸出
0152 9AD5 SBI 0x1A,5
(0077) temp=val;
0153 2F60 MOV R22,R16
(0078)
(0079) for (i=0;i<8;i++)
0154 2744 CLR R20
0155 C00E RJMP 0x0164
(0080) {
(0081) if ((temp&0x80)>0)
0156 2422 CLR R2
0157 2F86 MOV R24,R22
0158 7880 ANDI R24,0x80
0159 1628 CP R2,R24
015A F410 BCC 0x015D
(0082) SET(PORTA,DATA);
015B 9ADD SBI 0x1B,5
015C C001 RJMP 0x015E
(0083) else
(0084) CLR(PORTA,DATA);
015D 98DD CBI 0x1B,5
(0085)
(0086) NOP();
015E 0000 NOP
(0087) SET(PORTA,CLK);
015F 9ADC SBI 0x1B,4
(0088) NOP();
0160 0000 NOP
(0089) CLR(PORTA,CLK);
0161 98DC CBI 0x1B,4
(0090)
(0091) temp=temp<<1;
0162 0F66 LSL R22
0163 9543 INC R20
0164 3048 CPI R20,0x8
0165 F380 BCS 0x0156
0166 940E01F3 CALL pop_gset2
0168 9508 RET
(0092) }
(0093) }
(0094)
(0095) //讀1Byte
(0096) uchar nrf2401A_RD()
(0097) {uchar temp,i;
(0098) //MSB first 高位開(kāi)始,先讀入DATA,然后CLK_Up,再CLK_Dn
(0099) CLR(DDRA,DATA);//置DATA輸入
_nrf2401A_RD:
i --> R16
temp --> R18
0169 98D5 CBI 0x1A,5
(0100) temp=0;
016A 2722 CLR R18
(0101)
(0102) for (i=0;i<8;i++)
016B 2700 CLR R16
016C C00C RJMP 0x0179
(0103) {
(0104) temp=temp<<1;
016D 0F22 LSL R18
(0105) if ((PINA&(1<<DATA))>0)
016E 2422 CLR R2
016F B389 IN R24,0x19
0170 7280 ANDI R24,0x20
0171 1628 CP R2,R24
0172 F408 BCC 0x0174
(0106) temp=temp|1;
0173 6021 ORI R18,1
(0107)
(0108) NOP();
0174 0000 NOP
(0109) SET(PORTA,CLK);
0175 9ADC SBI 0x1B,4
(0110) NOP();
0176 0000 NOP
(0111) CLR(PORTA,CLK);
0177 98DC CBI 0x1B,4
0178 9503 INC R16
0179 3008 CPI R16,0x8
017A F390 BCS 0x016D
(0112) }
(0113)
(0114) return temp;
017B 2F02 MOV R16,R18
017C 9508 RET
(0115) }
(0116)
(0117) //PwrDown->StandBy
(0118) void nrf2401A_StandBy()
(0119) {
(0120) SET(PORTA,PWR2);
_nrf2401A_StandBy:
017D 9AD8 SBI 0x1B,0
(0121) CLR(PORTA,CE);
017E 98D9 CBI 0x1B,1
(0122) CLR(PORTA,CS);
017F 98DA CBI 0x1B,2
0180 9508 RET
(0123) }
(0124)
(0125) //->PwrDown
(0126) void nrf2401A_Off()
(0127) {
(0128) CLR(PORTA,PWR2);
_nrf2401A_Off:
0181 98D8 CBI 0x1B,0
(0129) CLR(PORTA,CE);
0182 98D9 CBI 0x1B,1
(0130) CLR(PORTA,CS);
0183 98DA CBI 0x1B,2
0184 9508 RET
(0131) }
(0132)
(0133) //配置模式
(0134) void nrf2401A_RwOn()
(0135) {
(0136) SET(PORTA,PWR2);
_nrf2401A_RwOn:
0185 9AD8 SBI 0x1B,0
(0137) CLR(PORTA,CE);
0186 98D9 CBI 0x1B,1
(0138) SET(PORTA,CS);
0187 9ADA SBI 0x1B,2
0188 9508 RET
(0139)
(0140) }
(0141)
(0142) //工作模式
(0143) void nrf2401A_Run()
(0144) {
(0145) SET(PORTA,PWR2);
_nrf2401A_Run:
0189 9AD8 SBI 0x1B,0
(0146) CLR(PORTA,CS);//first
018A 98DA CBI 0x1B,2
(0147) SET(PORTA,CE);
018B 9AD9 SBI 0x1B,1
018C 9508 RET
(0148)
(0149) }
(0150)
(0151) //配置nRF2401A
(0152) void nrf2401A_Config(void)
(0153) {
(0154) nrf2401A_RwOn();//配置狀態(tài)
_nrf2401A_Config:
018D DFF7 RCALL _nrf2401A_RwOn
(0155)
(0156) nrf2401A_WR(DATA2_W);
018E EC08 LDI R16,0xC8
018F DFC0 RCALL _nrf2401A_WR
(0157) nrf2401A_WR(DATA1_W);
0190 EC08 LDI R16,0xC8
0191 DFBE RCALL _nrf2401A_WR
(0158) nrf2401A_WR(RX_ADDRESS2);
0192 2700 CLR R16
0193 DFBC RCALL _nrf2401A_WR
(0159) nrf2401A_WR(RX_ADDRESS2);
0194 2700 CLR R16
0195 DFBA RCALL _nrf2401A_WR
(0160) nrf2401A_WR(RX_ADDRESS2);
0196 2700 CLR R16
0197 DFB8 RCALL _nrf2401A_WR
(0161) nrf2401A_WR(RX_ADDRESS2);
0198 2700 CLR R16
0199 DFB6 RCALL _nrf2401A_WR
(0162) nrf2401A_WR(RX_ADDRESS2);
019A 2700 CLR R16
019B DFB4 RCALL _nrf2401A_WR
(0163) nrf2401A_WR(RX_ADDRESS_4);
019C 2700 CLR R16
019D DFB2 RCALL _nrf2401A_WR
(0164) nrf2401A_WR(RX_ADDRESS_3);
019E EC0C LDI R16,0xCC
019F DFB0 RCALL _nrf2401A_WR
(0165) nrf2401A_WR(RX_ADDRESS_2);
01A0 EC0C LDI R16,0xCC
01A1 DFAE RCALL _nrf2401A_WR
(0166) nrf2401A_WR(RX_ADDRESS_1);
01A2 EC0C LDI R16,0xCC
01A3 DFAC RCALL _nrf2401A_WR
(0167) nrf2401A_WR(RX_ADDRESS_0);
01A4 EC0C LDI R16,0xCC
01A5 DFAA RCALL _nrf2401A_WR
(0168) nrf2401A_WR(CRC16_EN|ADDR_W);//CRC16,AddrWidth
01A6 E803 LDI R16,0x83
01A7 DFA8 RCALL _nrf2401A_WR
(0169)
(0170) #ifdef BPS_1M
(0171) nrf2401A_WR(PA_PWR_3|XOF_16MHz|RFDR_1M|CM_SHOCK);//0dbm,16M,1Mbps,ShockBurst
01A8 E60F LDI R16,0x6F
01A9 DFA6 RCALL _nrf2401A_WR
(0172) #else
(0173) nrf2401A_WR(PA_PWR_3|XOF_16MHz|CM_SHOCK);//0dbm,16M,250Kbps,ShockBurst
(0174) #endif
(0175)
(0176) nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan
01AA E005 LDI R16,5
01AB DFA4 RCALL _nrf2401A_WR
(0177)
(0178) nrf2401A_StandBy();//執(zhí)行配置
01AC DFD0 RCALL _nrf2401A_StandBy
01AD 9508 RET
(0179) }
(0180)
(0181) //接收模式
(0182) void nrf2401A_RxOn()
(0183) {
(0184) nrf2401A_RwOn();
_nrf2401A_RxOn:
01AE DFD6 RCALL _nrf2401A_RwOn
(0185) nrf2401A_WR(CH_NO_FREQ|RX_EN); //RxMode,Chan
01AF E005 LDI R16,5
01B0 DF9F RCALL _nrf2401A_WR
(0186) nrf2401A_Run();
01B1 DFD7 RCALL _nrf2401A_Run
01B2 9508 RET
(0187) }
(0188)
(0189) //發(fā)送模式
(0190) void nrf2401A_TxOn()
(0191) {
(0192) nrf2401A_RwOn();
_nrf2401A_TxOn:
01B3 DFD1 RCALL _nrf2401A_RwOn
(0193) nrf2401A_WR(CH_NO_FREQ); //TxMode,Chan
01B4 E004 LDI R16,4
01B5 DF9A RCALL _nrf2401A_WR
(0194) nrf2401A_Run();
01B6 DFD2 RCALL _nrf2401A_Run
01B7 9508 RET
(0195) }
(0196)
(0197) //初始化nrf2401A
(0198) void nrf2401A_Init()
(0199) {
(0200) CLR(PORTA,CLK);//
_nrf2401A_Init:
01B8 98DC CBI 0x1B,4
(0201) nrf2401A_StandBy();
01B9 DFC3 RCALL _nrf2401A_StandBy
(0202) DelayMs(10);//!!!must >3ms
01BA E00A LDI R16,0xA
01BB 940E012F CALL _DelayMs
(0203) nrf2401A_Config();
01BD DFCF RCALL _nrf2401A_Config
(0204)
(0205) nrf2401A_RxOn();//接收狀態(tài)
01BE DFEF RCALL _nrf2401A_RxOn
01BF 9508 RET
(0206) }
(0207)
(0208)
(0209) //寫(xiě)Tx地址
(0210) void nrf2401A_SetTxAddr()
(0211) {
(0212) nrf2401A_WR(TX_ADDRESS_3);
_nrf2401A_SetTxAddr:
01C0 EC0C LDI R16,0xCC
01C1 DF8E RCALL _nrf2401A_WR
(0213) nrf2401A_WR(TX_ADDRESS_2);
01C2 EC0C LDI R16,0xCC
01C3 DF8C RCALL _nrf2401A_WR
(0214) nrf2401A_WR(TX_ADDRESS_1);
01C4 EC0C LDI R16,0xCC
01C5 DF8A RCALL _nrf2401A_WR
(0215) nrf2401A_WR(TX_ADDRESS_0);
01C6 EC0C LDI R16,0xCC
01C7 DF88 RCALL _nrf2401A_WR
01C8 9508 RET
_nrf2401A_SetData:
i --> R20
01C9 940E01FE CALL push_gset1
(0216)
(0217) }
(0218)
(0219) //寫(xiě)Tx數(shù)據(jù)
(0220) void nrf2401A_SetData()
(0221) {uchar i;
(0222)
(0223) for (i=0;i<SIZE;i++)
01CB 2744 CLR R20
01CC C009 RJMP 0x01D6
(0224) nrf2401A_WR(TxBuf[i]);
01CD E78D LDI R24,0x7D
01CE E090 LDI R25,0
01CF 2FE4 MOV R30,R20
01D0 27FF CLR R31
01D1 0FE8 ADD R30,R24
01D2 1FF9 ADC R31,R25
01D3 8100 LDD R16,Z+0
01D4 DF7B RCALL _nrf2401A_WR
01D5 9543 INC R20
01D6 3149 CPI R20,0x19
01D7 F3A8 BCS 0x01CD
01D8 940E0201 CALL pop_gset1
01DA 9508 RET
(0225)
(0226) }
(0227)
(0228) //發(fā)送TxBuf中的數(shù)據(jù)
(0229) void nrf2401A_SendData()
(0230) {
(0231) nrf2401A_TxOn();
_nrf2401A_SendData:
01DB DFD7 RCALL _nrf2401A_TxOn
(0232) SET(PORTA,CE);
01DC 9AD9 SBI 0x1B,1
(0233) nrf2401A_SetTxAddr();//寫(xiě)發(fā)送地址
01DD DFE2 RCALL _nrf2401A_SetTxAddr
(0234) nrf2401A_SetData();//寫(xiě)數(shù)據(jù)
01DE DFEA RCALL _nrf2401A_SetData
(0235) CLR(PORTA,CE);//啟動(dòng)發(fā)送
01DF 98D9 CBI 0x1B,1
01E0 9508 RET
_nrf2401A_ReadData:
i --> R20
01E1 940E01FE CALL push_gset1
(0236) //發(fā)送完畢后進(jìn)入StandBy
(0237)
(0238) }
(0239)
(0240)
(0241) //讀出接收到的數(shù)據(jù)
(0242) void nrf2401A_ReadData()
(0243) {uchar i;
(0244) for (i=0;i<SIZE;i++)
01E3 2744 CLR R20
01E4 C009 RJMP 0x01EE
(0245) {
(0246) RxBuf[i]=nrf2401A_RD();
FILE: <library>
01E5 DF83 RCALL _nrf2401A_RD
01E6 E684 LDI R24,0x64
01E7 E090 LDI R25,0
01E8 2FE4 MOV R30,R20
01E9 27FF CLR R31
01EA 0FE8 ADD R30,R24
01EB 1FF9 ADC R31,R25
01EC 8300 STD Z+0,R16
01ED 9543 INC R20
01EE 3149 CPI R20,0x19
01EF F3A8 BCS 0x01E5
01F0 940E0201 CALL pop_gset1
01F2 9508 RET
pop_gset2:
01F3 E0E2 LDI R30,2
01F4 940C0202 JMP pop
push_gset5:
01F6 92FA ST R15,-Y
01F7 92EA ST R14,-Y
push_gset4:
01F8 92DA ST R13,-Y
01F9 92CA ST R12,-Y
push_gset3:
01FA 92BA ST R11,-Y
01FB 92AA ST R10,-Y
push_gset2:
01FC 937A ST R23,-Y
01FD 936A ST R22,-Y
push_gset1:
01FE 935A ST R21,-Y
01FF 934A ST R20,-Y
0200 9508 RET
pop_gset1:
0201 E0E1 LDI R30,1
pop:
0202 9149 LD R20,Y+
0203 9159 LD R21,Y+
0204 FDE0 SBRC R30,0
0205 9508 RET
0206 9169 LD R22,Y+
0207 9179 LD R23,Y+
0208 FDE1 SBRC R30,1
0209 9508 RET
020A 90A9 LD R10,Y+
020B 90B9 LD R11,Y+
020C FDE2 SBRC R30,2
020D 9508 RET
020E 90C9 LD R12,Y+
020F 90D9 LD R13,Y+
0210 FDE3 SBRC R30,3
0211 9508 RET
0212 90E9 LD R14,Y+
0213 90F9 LD R15,Y+
0214 9508 RET
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -