📄 ptr4000.lst
字号:
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配置字是先写第15字节的!!
(0008) //2、发送后要延时等发送结束后才能转回接收模式,否则数据发送不出
(0009)
(0010)
(0011) #define SIZE 25 //最大数据包长度 32-ADDR4-CRC2=26Byte
(0012) #define ADDRSIZE 4 //地址长度Byte
(0013)
(0014) #define CH_NO 2 //频段编号
(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 //发送有效地址(对方)
(0027)
(0028) #define CH_NO_FREQ CH_NO<<1 //工作频段 Byte1.7-2
(0029) #define RX_EN 1 //接收发送切换 Byte1.0 1接收 0发送
(0030)
(0031) #define RX2EN_YES 128 //第2接收通道使能1 Byte2.7
(0032) #define RX2EN_NO 0 //第2接收通道使能0 Byte2.7
(0033) #define CM_SHOCK 64 //收发模式ShockBurst Byte2.6
(0034) #define CM_DIRECT 0 //收发模式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) //地址位数 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字节 Byte4
(0055) #define RX_ADDRESS_1 (RX_ADDRESS >> 8) & 0xff //通道1接收有效地址第2字节 Byte5
(0056) #define RX_ADDRESS_2 (RX_ADDRESS >> 16) & 0xff //通道1接收有效地址第3字节 Byte6
(0057) #define RX_ADDRESS_3 RX_ADDRESS >> 24 //通道1接收有效地址第4字节 Byte7
(0058) #define RX_ADDRESS_4 0 //通道1接收有效地址第5字节 Byte8
(0059)
(0060) #define RX_ADDRESS2 0 //Byte9,10,11,12,13字节为通道2接收地址
(0061)
(0062) #define DATA1_W SIZE*8 //接收通道1数据包长度,Bit计算 Byte14
(0063) #define DATA2_W SIZE*8 //接收通道2数据包长度,Bit计算 Byte15
(0064)
(0065) #define TX_ADDRESS_4 0 //发送有效地址第5字节
(0066) #define TX_ADDRESS_3 TX_ADDRESS >> 24 //发送有效地址第4字节
(0067) #define TX_ADDRESS_2 (TX_ADDRESS >> 16) & 0xff //发送有效地址第3字节
(0068) #define TX_ADDRESS_1 (TX_ADDRESS >> 8) & 0xff //发送有效地址第2字节
(0069) #define TX_ADDRESS_0 TX_ADDRESS & 0xff //发送有效地址第1字节
(0070)
(0071)
(0072) //写1Byte
(0073) void nrf2401A_WR(uchar val)
(0074) {uchar temp,i;
(0075) //MSB first 高位开始,先输出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 高位开始,先读入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();//配置状态
_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();//执行配置
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) //发送模式
(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();//接收状态
01BE DFEF RCALL _nrf2401A_RxOn
01BF 9508 RET
(0206) }
(0207)
(0208)
(0209) //写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) //写Tx数据
(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) //发送TxBuf中的数据
(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();//写发送地址
01DD DFE2 RCALL _nrf2401A_SetTxAddr
(0234) nrf2401A_SetData();//写数据
01DE DFEA RCALL _nrf2401A_SetData
(0235) CLR(PORTA,CE);//启动发送
01DF 98D9 CBI 0x1B,1
01E0 9508 RET
_nrf2401A_ReadData:
i --> R20
01E1 940E01FE CALL push_gset1
(0236) //发送完毕后进入StandBy
(0237)
(0238) }
(0239)
(0240)
(0241) //读出接收到的数据
(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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -