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

📄 master.lst

📁 这是用C编的nrf905的通讯程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
    0116 BB8A      OUT	0x1A,R24
(0175) PORTA=0x0f;
    0117 E08F      LDI	R24,0xF
    0118 BB8B      OUT	0x1B,R24
(0176) if((~PINA)&0x01)
    0119 B229      IN	R2,0x19
    011A 2433      CLR	R3
    011B 9420      COM	R2
    011C 9430      COM	R3
    011D FE20      SBRS	R2,0
    011E C002      RJMP	0x0121
(0177) key_buf=0;
    011F 2744      CLR	R20
    0120 C016      RJMP	0x0137
(0178) else if((~PINA)&0x02)
    0121 B229      IN	R2,0x19
    0122 2433      CLR	R3
    0123 9420      COM	R2
    0124 9430      COM	R3
    0125 FE21      SBRS	R2,1
    0126 C002      RJMP	0x0129
(0179) key_buf=1;
    0127 E041      LDI	R20,1
    0128 C00E      RJMP	0x0137
(0180) else if((~PINA)&0x04)
    0129 B229      IN	R2,0x19
    012A 2433      CLR	R3
    012B 9420      COM	R2
    012C 9430      COM	R3
    012D FE22      SBRS	R2,2
    012E C002      RJMP	0x0131
(0181) key_buf=2;
    012F E042      LDI	R20,2
    0130 C006      RJMP	0x0137
(0182) else if((~PINA)&0x08)
    0131 B229      IN	R2,0x19
    0132 2433      CLR	R3
    0133 9420      COM	R2
    0134 9430      COM	R3
    0135 FC23      SBRC	R2,3
(0183) key_buf=3;
    0136 E043      LDI	R20,3
(0184) DDRA=0x0f;
    0137 E08F      LDI	R24,0xF
    0138 BB8A      OUT	0x1A,R24
(0185) PORTA=0xf0;
    0139 EF80      LDI	R24,0xF0
    013A BB8B      OUT	0x1B,R24
(0186) DelayUs(4000);
    013B EA00      LDI	R16,0xA0
    013C E01F      LDI	R17,0xF
    013D DFBD      RCALL	_DelayUs
(0187) if((~PINA)&0x10)
    013E B229      IN	R2,0x19
    013F 2433      CLR	R3
    0140 9420      COM	R2
    0141 9430      COM	R3
    0142 FE24      SBRS	R2,4
    0143 C001      RJMP	0x0145
(0188) key_buf+=0;
    0144 C019      RJMP	0x015E
(0189) else if((~PINA)&0x20)
    0145 B229      IN	R2,0x19
    0146 2433      CLR	R3
    0147 9420      COM	R2
    0148 9430      COM	R3
    0149 FE25      SBRS	R2,5
    014A C002      RJMP	0x014D
(0190) key_buf+=4;
    014B 5F4C      SUBI	R20,0xFC
    014C C011      RJMP	0x015E
(0191) else if((~PINA)&0x40)
    014D B229      IN	R2,0x19
    014E 2433      CLR	R3
    014F 9420      COM	R2
    0150 9430      COM	R3
    0151 FE26      SBRS	R2,6
    0152 C002      RJMP	0x0155
(0192) key_buf+=8;
    0153 5F48      SUBI	R20,0xF8
    0154 C009      RJMP	0x015E
(0193) else if((~PINA)&0x80)
    0155 B229      IN	R2,0x19
    0156 2433      CLR	R3
    0157 9420      COM	R2
    0158 9430      COM	R3
    0159 FE27      SBRS	R2,7
    015A C002      RJMP	0x015D
(0194) key_buf+=12;
    015B 5F44      SUBI	R20,0xF4
    015C C001      RJMP	0x015E
(0195) else
(0196) key_buf=16;
    015D E140      LDI	R20,0x10
(0197) 
(0198) if(key_buf!=16)
    015E 3140      CPI	R20,0x10
    015F F041      BEQ	0x0168
(0199) {
(0200) key=key_buf;
    0160 93400068  STS	key,R20
(0201) 
(0202) RfSendProc();
    0162 DF62      RCALL	_RfSendProc
(0203) key_buf=16;
    0163 E140      LDI	R20,0x10
(0204) 
(0205) while((~PINA)&0xf0) ;//检测按键是否释放,若没有释放就一直循环
    0164 B389      IN	R24,0x19
    0165 9580      COM	R24
    0166 7F80      ANDI	R24,0xF0
    0167 F7E1      BNE	0x0164
(0206) }
(0207) 
(0208) DDRA=0xf0;
    0168 EF80      LDI	R24,0xF0
    0169 BB8A      OUT	0x1A,R24
(0209) PORTA=0x0f;
    016A E08F      LDI	R24,0xF
    016B BB8B      OUT	0x1B,R24
(0210) GIFR=0x40;
    016C E480      LDI	R24,0x40
    016D BF8A      OUT	0x3A,R24
(0211) GICR=0x40; //中断复位
    016E BF8B      OUT	0x3B,R24
    016F 940E028F  CALL	pop_gset1
    0171 940E02BA  CALL	pop_lset
    0173 9518      RETI
(0212) }
(0213) 
(0214) 
(0215) ///////////////////////key over/////////////////////////////////////////
(0216) 
(0217) 
(0218) 
(0219) 
(0220) 
(0221) void main()
(0222) {
(0223)    init_devices();
_main:
    0174 DF1F      RCALL	_init_devices
(0224)    SystemIni();
    0175 DF71      RCALL	_SystemIni
(0225)    nrf905_Init();
    0176 940E01B6  CALL	_nrf905_Init
(0226)    GICR  = BIT(INT0);
    0178 E480      LDI	R24,0x40
    0179 BF8B      OUT	0x3B,R24
    017A C001      RJMP	0x017C
(0227) 
(0228)    while (1)
(0229)    {  
(0230)      RfRecvProc();//接收处理
    017B DF24      RCALL	_RfRecvProc
    017C CFFE      RJMP	0x017B
    017D 9508      RET
FILE: C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\nrf905.C
(0001) #include "config.h"
(0002) #include "nrf905.h"
(0003) #define A //对应地址
(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:
    017E 98C4      CBI	0x18,4
(0138)   nrf905_SpiRW(WC);                // Write config command
    017F 2700      CLR	R16
    0180 D016      RCALL	_nrf905_SpiRW
(0139)   nrf905_SpiRW(CH_NO_BYTE);                      //中心频率低8位
    0181 E40C      LDI	R16,0x4C
    0182 D014      RCALL	_nrf905_SpiRW
(0140)   nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
    0183 E00C      LDI	R16,0xC
    0184 D012      RCALL	_nrf905_SpiRW
(0141)   nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
    0185 E404      LDI	R16,0x44
    0186 D010      RCALL	_nrf905_SpiRW
(0142)   nrf905_SpiRW(RX_PW_32BYTE);                    //接收数据宽度32字节
    0187 E200      LDI	R16,0x20
    0188 D00E      RCALL	_nrf905_SpiRW
(0143)   nrf905_SpiRW(TX_PW_32BYTE);                    //发送数据宽度32字节
    0189 E200      LDI	R16,0x20
    018A D00C      RCALL	_nrf905_SpiRW
(0144)   nrf905_SpiRW(RX_ADDRESS_0);                    //接收有效地址第1字节
    018B E102      LDI	R16,0x12
    018C D00A      RCALL	_nrf905_SpiRW
(0145)   nrf905_SpiRW(RX_ADDRESS_1);                    //接收有效地址第2字节
    018D E304      LDI	R16,0x34
    018E D008      RCALL	_nrf905_SpiRW
(0146)   nrf905_SpiRW(RX_ADDRESS_2);                    //接收有效地址第3字节
    018F E506      LDI	R16,0x56
    0190 D006      RCALL	_nrf905_SpiRW
(0147)   nrf905_SpiRW(RX_ADDRESS_3);                    //接收有效地址第4字节
    0191 E708      LDI	R16,0x78
    0192 D004      RCALL	_nrf905_SpiRW
(0148)   nrf905_SpiRW(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
    0193 ED08      LDI	R16,0xD8
    0194 D002      RCALL	_nrf905_SpiRW
(0149)   SET(PORTB,CSN);                 // Disable Spi
    0195 9AC4      SBI	0x18,4
    0196 9508      RET
_nrf905_SpiRW:
  temp                 --> R20
  val                  --> R16
    0197 940E028C  CALL	push_gset1
(0150) }
(0151) 
(0152) uchar nrf905_SpiRW(uchar val) 
(0153) {uchar temp;
(0154) 
(0155)     SPDR=val;
    0199 B90F      OUT	0x0F,R16
(0156) 	while ((SPSR&(1<<SPIF))==0);
    019A 9B77      SBIS	0x0E,7
    019B CFFE      RJMP	0x019A
(0157) 	temp=SPDR;
    019C B14F      IN	R20,0x0F
(0158) 	return temp;
    019D 2F04      MOV	R16,R20
    019E 940E028F  CALL	pop_gset1
    01A0 9508      RET
(0159) }
(0160) 
(0161) //PwrDown->StandBy
(0162) void nrf905_StandBy()
(0163) {
(0164)    SET(PORTD,PWR);
_nrf905_StandBy:
    01A1 9A96      SBI	0x12,6
(0165)    CLR(PORTD,TRXCE);
    01A2 9893      CBI	0x12,3
(0166)    CLR(PORTD,TX_EN);
    01A3 9894      CBI	0x12,4
    01A4 9508      RET
(0167) }
(0168) 
(0169) //->PwrDown
(0170) void nrf905_Off()
(0171) {
(0172)   CLR(PORTD,PWR);
_nrf905_Off:
    01A5 9896      CBI	0x12,6
    01A6 9508      RET
(0173) }
(0174) 
(0175) //->ShockBurst Send
(0176) void nrf905_TxOn()
(0177) {
(0178)   SET(PORTD,PWR);
_nrf905_TxOn:
    01A7 9A96      SBI	0x12,6
(0179)   SET(PORTD,TX_EN);
    01A8 9A94      SBI	0x12,4
(0180)   CLR(PORTD,TRXCE);
    01A9 9893      CBI	0x12,3
    01AA 9508      RET
(0181) }
(0182) 
(0183) //->ShockBurst Send
(0184) void nrf905_TxSend()
(0185) {
(0186)   SET(PORTD,TRXCE);
_nrf905_TxSend:
    01AB 9A93      SBI	0x12,3
(0187)   DelayUs(20);//>10us
    01AC E104      LDI	R16,0x14
    01AD E010      LDI	R17,0
    01AE 940E00FB  CALL	_DelayUs
(0188)   CLR(PORTD,TRXCE);//只发送一次
    01B0 9893      CBI	0x12,3
    01B1 9508      RET
(0189) }
(0190) 
(0191) //->ShockBurst Recv
(0192) void nrf905_RxOn()

⌨️ 快捷键说明

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