⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ptr4000.lst

📁 本附件是基于nrf2401的无线收发模块代码
💻 LST
📖 第 1 页 / 共 2 页
字号:
  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 + -