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

📄 slave.lst

📁 这是用C编的nrf905的通讯程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0121 E5CF      LDI	R28,0x5F
    0122 E0D4      LDI	R29,4
    0123 BFCD      OUT	0x3D,R28
    0124 BFDE      OUT	0x3E,R29
    0125 51C0      SUBI	R28,0x10
    0126 40D0      SBCI	R29,0
    0127 EA0A      LDI	R16,0xAA
    0128 8308      STD	Y+0,R16
    0129 2400      CLR	R0
    012A E6E6      LDI	R30,0x66
    012B E0F0      LDI	R31,0
    012C E011      LDI	R17,1
    012D 33E5      CPI	R30,0x35
    012E 07F1      CPC	R31,R17
    012F F011      BEQ	0x0132
    0130 9201      ST	R0,Z+
    0131 CFFB      RJMP	0x012D
    0132 8300      STD	Z+0,R16
    0133 E3EB      LDI	R30,0x3B
    0134 E0F2      LDI	R31,2
    0135 E6A0      LDI	R26,0x60
    0136 E0B0      LDI	R27,0
    0137 E012      LDI	R17,2
    0138 34E1      CPI	R30,0x41
    0139 07F1      CPC	R31,R17
    013A F021      BEQ	0x013F
    013B 95C8      LPM
    013C 9631      ADIW	R30,1
    013D 920D      ST	R0,X+
    013E CFF9      RJMP	0x0138
    013F 940E0305  CALL	_main
_exit:
    0141 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\nrf905.C
(0001) #include "config.h"
(0002) #include "nrf905.h"
(0003) #define B //对应地址
(0004) 
(0005) 
(0006) uchar TxBuf[bufSIZE],RxBuf[bufSIZE];
(0007) 
(0008) uchar nrf905_SpiRW(uchar val);
(0009) void nrf905_StandBy(void);
(0010) void nrf905_Off(void);
(0011) void nrf905_TxOn(void);
(0012) void nrf905_TxSend(void);
(0013) void nrf905_RxOn(void);
(0014) void nrf905_Init(void);
(0015) void nrf905_SpiTest(void);
(0016) void nrf905_SetTxAddr(void);
(0017) 
(0018) /*-------------------------------------------------------------------------------------------
(0019) nrf905配置寄存器宏定义 author:HotPower
(0020)         nrf905配置寄存器(10Byte)
(0021) 工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz
(0022) -------------------------------------------------------------------------------------------*/
(0023) #ifdef A
(0024)        #define TX_ADDRESS           0x87654321               //接收有效地址(本方)
(0025)        #define RX_ADDRESS           0x12345678               //发送有效地址(对方)
(0026) #endif
(0027) #ifdef B
(0028)  #define TX_ADDRESS           0x12345678               //接收有效地址(本方)
(0029)  #define RX_ADDRESS           0x87654321               //发送有效地址(对方)
(0030) #endif
(0031) 
(0032) #define CH_NO_FREQ_422_4MHz  0x000                     //工作频率422.4MHz(433MHz频段最低频率)
(0033) #define CH_NO_FREQ_422_5MHz  0x001                     //工作频率422.5MHz
(0034) #define CH_NO_FREQ_425_0MHz  0x01a                     //工作频率425.0MHz
(0035) #define CH_NO_FREQ_427_5MHz  0x033                     //工作频率427.5MHz
(0036) 
(0037) #define CH_NO_FREQ_430_0MHz  0x04c                     //工作频率430.0MHz
(0038) #define CH_NO_FREQ_433_0MHz  0x06a                     //工作频率433.0MHz(433MHz频段基准频率)
(0039) #define CH_NO_FREQ_433_1MHz  0x06b                     //工作频率433.1MHz
(0040) #define CH_NO_FREQ_433_2MHz  0x06c                     //工作频率433.2MHz
(0041) #define CH_NO_FREQ_434_7MHz  0x07b                     //工作频率434.7MHz
(0042) #define CH_NO_FREQ_473_5MHz  0x1ff                     //工作频率473.5MHz(433MHz频段最高频率)
(0043) 
(0044) #define CH_NO_FREQ_844_8MHz  0x000                     //工作频率844.8MHz(868MHz频段最低频率)
(0045) 
(0046) #define CH_NO_FREQ_862_0MHz  0x056                     //工作频率862.0MHz
(0047) #define CH_NO_FREQ_868_0MHz  0x074                     //工作频率868.0MHz(868MHz频段基准频率)
(0048) #define CH_NO_FREQ_868_2MHz  0x075                     //工作频率868.2MHz
(0049) #define CH_NO_FREQ_868_4MHz  0x076                     //工作频率868.4MHz
(0050) #define CH_NO_FREQ_869_8MHz  0x07d                     //工作频率869.8MHz
(0051) #define CH_NO_FREQ_895_8MHz  0x0ff                     //工作频率895.8MHz
(0052) #define CH_NO_FREQ_896_0MHz  0x100                     //工作频率896.0MHz
(0053) #define CH_NO_FREQ_900_0MHz  0x114                     //工作频率900.0MHz
(0054) #define CH_NO_FREQ_902_2MHz  0x11f                     //工作频率902.2MHz
(0055) #define CH_NO_FREQ_902_4MHz  0x120                     //工作频率902.4MHz
(0056) #define CH_NO_FREQ_915_0MHz  0x15f                     //工作频率915.0MHz(915MHz频段基准频率)
(0057) #define CH_NO_FREQ_927_8MHz  0x19f                     //工作频率927.8MHz
(0058) 
(0059) #define CH_NO_FREQ_947_0MHz  0x1ff                     //工作频率947.0MHz(915MHz频段最高频率)
(0060) 
(0061) #define CH_NO_FREQ           CH_NO_FREQ_430_0MHz       //工作频率433.0MHz
(0062) 
(0063) 
(0064) #define CH_NO_BYTE           (CH_NO_FREQ & 0xff)         //工作频率低8位       Byte0       01101100
(0065) 
(0066) #define AUTO_RETRAN          0x20                      //重发数据包          Byte1.5     0
(0067) #define RX_RED_PWR           0x10                      //接收低功耗模式      Byte1.4     0
(0068) #define PA_PWR__10dBm        0x00                      //输出功率-10dBm      Byte1.3~2   00
(0069) #define PA_PWR_2dBm          0x04                      //输出功率+2dBm       Byte1.3~2
(0070) #define PA_PWR_6dBm          0x08                      //输出功率+6dBm       Byte1.3~2
(0071) #define PA_PWR_10dBm         0x0c                      //输出功率+10dBm      Byte1.3~2   
(0072) #define HFREQ_PLL_433MHz     0x00                      //工作在433MHz频段    Byte1.1     0
(0073) #define HFREQ_PLL_868MHz     0x02                      //工作在868MHz频段    Byte1.1
(0074) #define HFREQ_PLL_915MHz     0x02                      //工作在915MHz频段    Byte1.1
(0075) #define CH_NO_BIT8           (CH_NO_FREQ >> 8)           //工作频率第9位       Byte1.0     0
(0076) 
(0077) #define TX_AFW_1BYTE         (1 * 16)                    //发送地址宽度1字节   Byte2.7~4
(0078) #define TX_AFW_2BYTE         (2 * 16)                    //发送地址宽度2字节   Byte2.7~4
(0079) #define TX_AFW_3BYTE         (3 * 16)                    //发送地址宽度3字节   Byte2.7~4
(0080) #define TX_AFW_4BYTE         (4 * 16)                    //发送地址宽度4字节   Byte2.7~4   100
(0081) #define RX_AFW_1BYTE         1                         //接收地址宽度1字节   Byte2.3~0
(0082) #define RX_AFW_2BYTE         2                         //接收地址宽度2字节   Byte2.3~0
(0083) #define RX_AFW_3BYTE         3                         //接收地址宽度3字节   Byte2.3~0
(0084) #define RX_AFW_4BYTE         4                         //接收地址宽度4字节   Byte2.3~0   100
(0085) 
(0086) #define RX_PW_1BYTE          1                         //接收数据宽度1字节   Byte3.5~0
(0087) #define RX_PW_32BYTE         32                        //接收数据宽度32字节  Byte3.5~0   00100000
(0088) #define TX_PW_1BYTE          1                         //发送数据宽度1字节   Byte4.5~0 
(0089) #define TX_PW_32BYTE         32                        //发送数据宽度32字节  Byte4.5~0   00100000
(0090) 
(0091) #define RX_ADDRESS_0         (RX_ADDRESS >> 24)          //接收有效地址第1字节 Byte5       11100111
(0092) #define RX_ADDRESS_1         ((RX_ADDRESS >> 16) & 0xff) //接收有效地址第2字节 Byte6       11100111 
(0093) #define RX_ADDRESS_2         ((RX_ADDRESS >> 8) & 0xff)  //接收有效地址第3字节 Byte7       11100111
(0094) #define RX_ADDRESS_3         (RX_ADDRESS & 0xff)         //接收有效地址第4字节 Byte8       11100111
(0095)        
(0096) #define CRC_MODE_16BIT       0x80                      //CRC16模式           Byte9.7     1
(0097) #define CRC_MODE_8BIT        0x00                      //CRC8模式            Byte9.7     
(0098) #define CRC_EN               0x40                      //CRC使能             Byte9.6     1
(0099) #define CRC16_EN             0xc0                      //CRC16模式使能       Byte9.7~6   11
(0100) #define CRC8_EN              0x40                      //CRC8模式使能        Byte9.7~6
(0101) #define XOF_20MHz            0x20                      //晶体振荡器频率20MHz Byte9.5~3
(0102) #define XOF_16MHz            0x18                      //晶体振荡器频率16MHz Byte9.5~3   100
(0103) #define XOF_12MHz            0x10                      //晶体振荡器频率12MHz Byte9.5~3
(0104) #define XOF_8MHz             0x08                      //晶体振荡器频率8MHz  Byte9.5~3
(0105) #define XOF_4MHz             0x00                      //晶体振荡器频率4MHz  Byte9.5~3
(0106) #define UP_CLK_EN            0x40                      //输出时钟使能        Byte9.2     1
(0107) #define UP_CLK_FREQ_500kHz   0x03                      //输出时钟频率500kHz  Byte9.1~0   11
(0108) #define UP_CLK_FREQ_1MHz     0x02                      //输出时钟频率1MHz    Byte9.1~0
(0109) #define UP_CLK_FREQ_2MHz     0x01                      //输出时钟频率2MHz    Byte9.1~0
(0110) #define UP_CLK_FREQ_4MHz     0x00                      //输出时钟频率4MHz    Byte9.1~0
(0111) 
(0112) #define UP_CLK_EN_500kHz     0x43                      //输出时钟频率500kHz  Byte9.2~0   111
(0113) #define UP_CLK_EN_1MHz       0x42                      //输出时钟频率1MHz    Byte9.2~0
(0114) #define UP_CLK_EN_2MHz       0x41                      //输出时钟频率2MHz    Byte9.2~0
(0115) #define UP_CLK_EN_4MHz       0x40                      //输出时钟频率4MHz    Byte9.2~0
(0116) 
(0117) #define TX_ADDRESS_0         (TX_ADDRESS >> 24)          //发送有效地址第1字节
(0118) #define TX_ADDRESS_1         ((TX_ADDRESS >> 16) & 0xff) //发送有效地址第2字节
(0119) #define TX_ADDRESS_2         ((TX_ADDRESS >> 8) & 0xff)  //发送有效地址第3字节
(0120) #define TX_ADDRESS_3         ((TX_ADDRESS >> 0) & 0xff)         //发送有效地址第4字节
(0121) 
(0122) /*-----------------------------------------------
(0123)         nrf905命令控制字 author:HotPower
(0124) ------------------------------------------------*/
(0125) #define WC        0x00            // Write configuration register command
(0126) #define RC        0x10            // Read  configuration register command
(0127) #define WTP       0x20            // Write TX Payload  command
(0128) #define RTP       0x21            // Read  TX Payload  command
(0129) #define WTA       0x22            // Write TX Address  command
(0130) #define RTA       0x23            // Read  TX Address  command
(0131) #define RRP       0x24            // Read  RX Payload  command
(0132)  
(0133) 
(0134) //配置nRF905
(0135) void nrf905_Config(void)
(0136) {
(0137)   CLR(PORTB,CSN);                   // Spi 片选开
_nrf905_Config:
    0142 98C4      CBI	0x18,4
(0138)   nrf905_SpiRW(WC);                // Write config command
    0143 2700      CLR	R16
    0144 D016      RCALL	_nrf905_SpiRW
(0139)   nrf905_SpiRW(CH_NO_BYTE);                      //中心频率低8位
    0145 E40C      LDI	R16,0x4C
    0146 D014      RCALL	_nrf905_SpiRW
(0140)   nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
    0147 E00C      LDI	R16,0xC
    0148 D012      RCALL	_nrf905_SpiRW
(0141)   nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
    0149 E404      LDI	R16,0x44
    014A D010      RCALL	_nrf905_SpiRW
(0142)   nrf905_SpiRW(RX_PW_32BYTE);                    //接收数据宽度32字节
    014B E200      LDI	R16,0x20
    014C D00E      RCALL	_nrf905_SpiRW
(0143)   nrf905_SpiRW(TX_PW_32BYTE);                    //发送数据宽度32字节
    014D E200      LDI	R16,0x20
    014E D00C      RCALL	_nrf905_SpiRW
(0144)   nrf905_SpiRW(RX_ADDRESS_0);                    //接收有效地址第1字节
    014F E807      LDI	R16,0x87
    0150 D00A      RCALL	_nrf905_SpiRW
(0145)   nrf905_SpiRW(RX_ADDRESS_1);                    //接收有效地址第2字节
    0151 E605      LDI	R16,0x65
    0152 D008      RCALL	_nrf905_SpiRW
(0146)   nrf905_SpiRW(RX_ADDRESS_2);                    //接收有效地址第3字节
    0153 E403      LDI	R16,0x43
    0154 D006      RCALL	_nrf905_SpiRW
(0147)   nrf905_SpiRW(RX_ADDRESS_3);                    //接收有效地址第4字节
    0155 E201      LDI	R16,0x21
    0156 D004      RCALL	_nrf905_SpiRW
(0148)   nrf905_SpiRW(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
    0157 ED08      LDI	R16,0xD8
    0158 D002      RCALL	_nrf905_SpiRW
(0149)   SET(PORTB,CSN);                 // Disable Spi
    0159 9AC4      SBI	0x18,4
    015A 9508      RET
_nrf905_SpiRW:
  temp                 --> R20
  val                  --> R16
    015B 940E040C  CALL	push_gset1
(0150) }
(0151) 
(0152) uchar nrf905_SpiRW(uchar val) 
(0153) {uchar temp;
(0154) 
(0155)     SPDR=val;
    015D B90F      OUT	0x0F,R16
(0156) 	while ((SPSR&(1<<SPIF))==0);
    015E 9B77      SBIS	0x0E,7
    015F CFFE      RJMP	0x015E
(0157) 	temp=SPDR;
    0160 B14F      IN	R20,0x0F
(0158) 	return temp;
    0161 2F04      MOV	R16,R20
    0162 940E040F  CALL	pop_gset1
    0164 9508      RET
(0159) }
(0160) 
(0161) //PwrDown->StandBy
(0162) void nrf905_StandBy()
(0163) {
(0164)    SET(PORTD,PWR);
_nrf905_StandBy:
    0165 9A96      SBI	0x12,6
(0165)    CLR(PORTD,TRXCE);
    0166 9893      CBI	0x12,3
(0166)    CLR(PORTD,TX_EN);
    0167 9894      CBI	0x12,4
    0168 9508      RET
(0167) }
(0168) 
(0169) //->PwrDown
(0170) void nrf905_Off()
(0171) {
(0172)   CLR(PORTD,PWR);
_nrf905_Off:
    0169 9896      CBI	0x12,6
    016A 9508      RET
(0173) }
(0174) 
(0175) //->ShockBurst Send
(0176) void nrf905_TxOn()
(0177) {
(0178)   SET(PORTD,PWR);
_nrf905_TxOn:
    016B 9A96      SBI	0x12,6
(0179)   SET(PORTD,TX_EN);
    016C 9A94      SBI	0x12,4
(0180)   CLR(PORTD,TRXCE);
    016D 9893      CBI	0x12,3
    016E 9508      RET
(0181) }
(0182) 
(0183) //->ShockBurst Send
(0184) void nrf905_TxSend()
(0185) {
(0186)   SET(PORTD,TRXCE);
_nrf905_TxSend:
    016F 9A93      SBI	0x12,3
(0187)   DelayUs(20);//>10us
    0170 E104      LDI	R16,0x14
    0171 E010      LDI	R17,0
    0172 940E02F2  CALL	_DelayUs
(0188)   CLR(PORTD,TRXCE);//只发送一次
    0174 9893      CBI	0x12,3
    0175 9508      RET
(0189) }
(0190) 
(0191) //->ShockBurst Recv
(0192) void nrf905_RxOn()
(0193) {
(0194)   SET(PORTD,PWR);
_nrf905_RxOn:
    0176 9A96      SBI	0x12,6
(0195)   CLR(PORTD,TX_EN);//maybe first
    0177 9894      CBI	0x12,4
(0196)   SET(PORTD,TRXCE);
    0178 9A93      SBI	0x12,3
    0179 9508      RET
(0197) }
(0198) 
(0199) //初始化nrf905
(0200) void nrf905_Init()
(0201) {
(0202)    nrf905_StandBy();
_nrf905_Init:
    017A DFEA      RCALL	_nrf905_StandBy
(0203)    DelayMs(10);//!!!must >3ms
    017B E00A      LDI	R16,0xA
    017C 940E02E4  CALL	_DelayMs
(0204)    nrf905_Config();
    017E DFC3      RCALL	_nrf905_Config
(0205)    
(0206)    nrf905_SpiTest();//test...
    017F D002      RCALL	_nrf905_SpiTest
(0207)    nrf905_RxOn();
    0180 DFF5      RCALL	_nrf905_RxOn
    0181 9508      RET
_nrf905_SpiTest:
  i                    --> R10
    0182 940E0408  CALL	push_gset3
(0208) }
(0209) 
(0210) //测试:通过读配置,判断SPI操作是否正确
(0211) void nrf905_SpiTest()
(0212) {uchar i;
(0213)   CLR(PORTB,CSN);                   
    0184 98C4      CBI	0x18,4
(0214)   nrf905_SpiRW(RC);  //读配置
    0185 E100      LDI	R16,0x10
    0186 DFD4      RCALL	_nrf905_SpiRW
(0215)   for (i=0;i<10;i++)
    0187 24AA      CLR	R10
    0188 C00A      RJMP	0x0193
(0216)   { 
(0217)     RxBuf[i]=nrf905_SpiRW(0);//read from nrf905
    0189 2700      CLR	R16
    018A DFD0      RCALL	_nrf905_SpiRW
    018B E686      LDI	R24,0x66
    018C E090      LDI	R25,0
    018D 2DEA      MOV	R30,R10
    018E 27FF      CLR	R31
    018F 0FE8      ADD	R30,R24
    0190 1FF9      ADC	R31,R25
    0191 8300      STD	Z+0,R16
    0192 94A3      INC	R10
    0193 2D8A      MOV	R24,R10
    0194 308A      CPI	R24,0xA
    0195 F398      BCS	0x0189
(0218)   }
(0219)  
(0220)  
(0221)  //for (i=0;i<10;i++)
(0222)   { 
(0223)   if(RxBuf[0]==CH_NO_BYTE)CPL(PORTD,LED); 
    0196 91800066  LDS	R24,RxBuf
    0198 348C      CPI	R24,0x4C
    0199 F439      BNE	0x01A1
    019A E880      LDI	R24,0x80
    019B E090      LDI	R25,0
    019C B222      IN	R2,0x12
    019D 2433      CLR	R3
    019E 2628      EOR	R2,R24
    019F 2639      EOR	R3,R25
    01A0 BA22      OUT	0x12,R2
(0224)   if(RxBuf[1]==(PA_PWR_10dBm | HFREQ_PLL_433MHz))CPL(PORTD,LED); 
    01A1 91800067  LDS	R24,RxBuf+1
    01A3 308C      CPI	R24,0xC
    01A4 F439      BNE	0x01AC
    01A5 E880      LDI	R24,0x80
    01A6 E090      LDI	R25,0
    01A7 B222      IN	R2,0x12
    01A8 2433      CLR	R3
    01A9 2628      EOR	R2,R24
    01AA 2639      EOR	R3,R25
    01AB BA22      OUT	0x12,R2
(0225)   if(RxBuf[2]==(TX_AFW_4BYTE | RX_AFW_4BYTE))CPL(PORTD,LED); 
    01AC 91800068  LDS	R24,RxBuf+2
    01AE 3484      CPI	R24,0x44
    01AF F439      BNE	0x01B7
    01B0 E880      LDI	R24,0x80
    01B1 E090      LDI	R25,0
    01B2 B222      IN	R2,0x12
    01B3 2433      CLR	R3
    01B4 2628      EOR	R2,R24

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -