📄 905receive.lst
字号:
(0030)
(0031) #define CH_NO_FREQ_422_4MHz 0x000 //工作频率422.4MHz(433MHz频段最低频率)
(0032) #define CH_NO_FREQ_422_5MHz 0x001 //工作频率422.5MHz
(0033) #define CH_NO_FREQ_425_0MHz 0x01a //工作频率425.0MHz
(0034) #define CH_NO_FREQ_427_5MHz 0x033 //工作频率427.5MHz
(0035)
(0036) #define CH_NO_FREQ_430_0MHz 0x04c //工作频率430.0MHz
(0037) #define CH_NO_FREQ_433_0MHz 0x06a //工作频率433.0MHz(433MHz频段基准频率)
(0038) #define CH_NO_FREQ_433_1MHz 0x06b //工作频率433.1MHz
(0039) #define CH_NO_FREQ_433_2MHz 0x06c //工作频率433.2MHz
(0040) #define CH_NO_FREQ_434_7MHz 0x07b //工作频率434.7MHz
(0041) #define CH_NO_FREQ_473_5MHz 0x1ff //工作频率473.5MHz(433MHz频段最高频率)
(0042)
(0043) #define CH_NO_FREQ_844_8MHz 0x000 //工作频率844.8MHz(868MHz频段最低频率)
(0044)
(0045) #define CH_NO_FREQ_862_0MHz 0x056 //工作频率862.0MHz
(0046) #define CH_NO_FREQ_868_0MHz 0x074 //工作频率868.0MHz(868MHz频段基准频率)
(0047) #define CH_NO_FREQ_868_2MHz 0x075 //工作频率868.2MHz
(0048) #define CH_NO_FREQ_868_4MHz 0x076 //工作频率868.4MHz
(0049) #define CH_NO_FREQ_869_8MHz 0x07d //工作频率869.8MHz
(0050) #define CH_NO_FREQ_895_8MHz 0x0ff //工作频率895.8MHz
(0051) #define CH_NO_FREQ_896_0MHz 0x100 //工作频率896.0MHz
(0052) #define CH_NO_FREQ_900_0MHz 0x114 //工作频率900.0MHz
(0053) #define CH_NO_FREQ_902_2MHz 0x11f //工作频率902.2MHz
(0054) #define CH_NO_FREQ_902_4MHz 0x120 //工作频率902.4MHz
(0055) #define CH_NO_FREQ_915_0MHz 0x15f //工作频率915.0MHz(915MHz频段基准频率)
(0056) #define CH_NO_FREQ_927_8MHz 0x19f //工作频率927.8MHz
(0057)
(0058) #define CH_NO_FREQ_947_0MHz 0x1ff //工作频率947.0MHz(915MHz频段最高频率)
(0059)
(0060) #define CH_NO_FREQ CH_NO_FREQ_430_0MHz //工作频率433.0MHz
(0061)
(0062)
(0063) #define CH_NO_BYTE CH_NO_FREQ & 0xff //工作频率低8位 Byte0 01101100
(0064)
(0065) #define AUTO_RETRAN 0x20 //重发数据包 Byte1.5 0
(0066) #define RX_RED_PWR 0x10 //接收低功耗模式 Byte1.4 0
(0067) #define PA_PWR__10dBm 0x00 //输出功率-10dBm Byte1.3~2 00
(0068) #define PA_PWR_2dBm 0x04 //输出功率+2dBm Byte1.3~2
(0069) #define PA_PWR_6dBm 0x08 //输出功率+6dBm Byte1.3~2
(0070) #define PA_PWR_10dBm 0x0c //输出功率+10dBm Byte1.3~2
(0071) #define HFREQ_PLL_433MHz 0x00 //工作在433MHz频段 Byte1.1 0
(0072) #define HFREQ_PLL_868MHz 0x02 //工作在868MHz频段 Byte1.1
(0073) #define HFREQ_PLL_915MHz 0x02 //工作在915MHz频段 Byte1.1
(0074) #define CH_NO_BIT8 CH_NO_FREQ >> 8 //工作频率第9位 Byte1.0 0
(0075)
(0076) #define TX_AFW_1BYTE 1 * 16 //发送地址宽度1字节 Byte2.7~4
(0077) #define TX_AFW_2BYTE 2 * 16 //发送地址宽度2字节 Byte2.7~4
(0078) #define TX_AFW_3BYTE 3 * 16 //发送地址宽度3字节 Byte2.7~4
(0079) #define TX_AFW_4BYTE 4 * 16 //发送地址宽度4字节 Byte2.7~4 100
(0080) #define RX_AFW_1BYTE 1 //接收地址宽度1字节 Byte2.3~0
(0081) #define RX_AFW_2BYTE 2 //接收地址宽度2字节 Byte2.3~0
(0082) #define RX_AFW_3BYTE 3 //接收地址宽度3字节 Byte2.3~0
(0083) #define RX_AFW_4BYTE 4 //接收地址宽度4字节 Byte2.3~0 100
(0084)
(0085) #define RX_PW_1BYTE 1 //接收数据宽度1字节 Byte3.5~0
(0086) #define RX_PW_32BYTE 32 //接收数据宽度32字节 Byte3.5~0 00100000
(0087) #define TX_PW_1BYTE 1 //发送数据宽度1字节 Byte4.5~0
(0088) #define TX_PW_32BYTE 32 //发送数据宽度32字节 Byte4.5~0 00100000
(0089)
(0090) #define RX_ADDRESS_0 RX_ADDRESS >> 24 //接收有效地址第1字节 Byte5 11100111
(0091) #define RX_ADDRESS_1 (RX_ADDRESS >> 16) & 0xff //接收有效地址第2字节 Byte6 11100111
(0092) #define RX_ADDRESS_2 (RX_ADDRESS >> 8) & 0xff //接收有效地址第3字节 Byte7 11100111
(0093) #define RX_ADDRESS_3 RX_ADDRESS & 0xff //接收有效地址第4字节 Byte8 11100111
(0094)
(0095) #define CRC_MODE_16BIT 0x80 //CRC16模式 Byte9.7 1
(0096) #define CRC_MODE_8BIT 0x00 //CRC8模式 Byte9.7
(0097) #define CRC_EN 0x40 //CRC使能 Byte9.6 1
(0098) #define CRC16_EN 0xc0 //CRC16模式使能 Byte9.7~6 11
(0099) #define CRC8_EN 0x40 //CRC8模式使能 Byte9.7~6
(0100) #define XOF_20MHz 0x20 //晶体振荡器频率20MHz Byte9.5~3
(0101) #define XOF_16MHz 0x18 //晶体振荡器频率16MHz Byte9.5~3 100
(0102) #define XOF_12MHz 0x10 //晶体振荡器频率12MHz Byte9.5~3
(0103) #define XOF_8MHz 0x08 //晶体振荡器频率8MHz Byte9.5~3
(0104) #define XOF_4MHz 0x00 //晶体振荡器频率4MHz Byte9.5~3
(0105) #define UP_CLK_EN 0x40 //输出时钟使能 Byte9.2 1
(0106) #define UP_CLK_FREQ_500kHz 0x03 //输出时钟频率500kHz Byte9.1~0 11
(0107) #define UP_CLK_FREQ_1MHz 0x02 //输出时钟频率1MHz Byte9.1~0
(0108) #define UP_CLK_FREQ_2MHz 0x01 //输出时钟频率2MHz Byte9.1~0
(0109) #define UP_CLK_FREQ_4MHz 0x00 //输出时钟频率4MHz Byte9.1~0
(0110)
(0111) #define UP_CLK_EN_500kHz 0x43 //输出时钟频率500kHz Byte9.2~0 111
(0112) #define UP_CLK_EN_1MHz 0x42 //输出时钟频率1MHz Byte9.2~0
(0113) #define UP_CLK_EN_2MHz 0x41 //输出时钟频率2MHz Byte9.2~0
(0114) #define UP_CLK_EN_4MHz 0x40 //输出时钟频率4MHz Byte9.2~0
(0115)
(0116) #define TX_ADDRESS_0 TX_ADDRESS >> 24 //发送有效地址第1字节
(0117) #define TX_ADDRESS_1 (TX_ADDRESS >> 16) & 0xff //发送有效地址第2字节
(0118) #define TX_ADDRESS_2 (TX_ADDRESS >> 8) & 0xff //发送有效地址第3字节
(0119) #define TX_ADDRESS_3 TX_ADDRESS & 0xff //发送有效地址第4字节
(0120)
(0121) /*-----------------------------------------------
(0122) nrf905命令控制字 author:HotPower
(0123) ------------------------------------------------*/
(0124) #define WC 0x00 // Write configuration register command
(0125) #define RC 0x10 // Read configuration register command
(0126) #define WTP 0x20 // Write TX Payload command
(0127) #define RTP 0x21 // Read TX Payload command
(0128) #define WTA 0x22 // Write TX Address command
(0129) #define RTA 0x23 // Read TX Address command
(0130) #define RRP 0x24 // Read RX Payload command
(0131)
(0132) void clear_Tx_Buf(void) //清空发送缓冲
(0133) {
(0134) int i;
(0135) for (i=0;i<SIZE;i++)
_clear_Tx_Buf:
i --> R16
019B 2700 CLR R16
019C 2711 CLR R17
(0136) Tx_Buf[i]='';
019D EF8B LDI R24,0xFB
019E E090 LDI R25,0
019F 01F8 MOVW R30,R16
01A0 0FE8 ADD R30,R24
01A1 1FF9 ADC R31,R25
01A2 2422 CLR R2
01A3 8220 STD Z+0,R2
01A4 5F0F SUBI R16,0xFF
01A5 4F1F SBCI R17,0xFF
01A6 3200 CPI R16,0x20
01A7 E0E0 LDI R30,0
01A8 071E CPC R17,R30
01A9 F39C BLT 0x019D
(0137) }
01AA 9508 RET
(0138) void clear_Rx_Buf(void)//清空接收缓冲
(0139) {
(0140) int i;
(0141) for (i=0;i<SIZE;i++)
_clear_Rx_Buf:
i --> R16
01AB 2700 CLR R16
01AC 2711 CLR R17
(0142) Rx_Buf[i]='';
01AD ED8B LDI R24,0xDB
01AE E090 LDI R25,0
01AF 01F8 MOVW R30,R16
01B0 0FE8 ADD R30,R24
01B1 1FF9 ADC R31,R25
01B2 2422 CLR R2
01B3 8220 STD Z+0,R2
01B4 5F0F SUBI R16,0xFF
01B5 4F1F SBCI R17,0xFF
01B6 3200 CPI R16,0x20
01B7 E0E0 LDI R30,0
01B8 071E CPC R17,R30
01B9 F39C BLT 0x01AD
(0143) }
01BA 9508 RET
_Read_nrf905Add:
RX_ADD --> R16
01BB D3B5 RCALL push_gset2
(0144)
(0145) //读取EEPROM的内容,0x00处开始一个字节为主机地址,当启用EEPROM时请把注释去掉
(0146) void Read_nrf905Add(void)
(0147) {
(0148) unsigned char RX_ADD=0xAA;
01BC EA0A LDI R16,0xAA
(0149) // EEPROM_READ(0x00,RX_ADD);//从0x00开始读取主机地址
(0150) RX_ADDRESS=RX_ADDRESS&0x11111100;//先清除最低8位
01BD E040 LDI R20,0
01BE E151 LDI R21,0x11
01BF E161 LDI R22,0x11
01C0 E171 LDI R23,0x11
01C1 9040008D LDS R4,0x8D
01C3 9050008E LDS R5,0x8E
01C5 9020008B LDS R2,0x8B
01C7 9030008C LDS R3,0x8C
01C9 2224 AND R2,R20
01CA 2235 AND R3,R21
01CB 2246 AND R4,R22
01CC 2257 AND R5,R23
01CD 9230008C STS 0x8C,R3
01CF 9220008B STS 0x8B,R2
01D1 9250008E STS 0x8E,R5
01D3 9240008D STS 0x8D,R4
(0151) RX_ADDRESS=RX_ADDRESS|RX_ADD;//再将新地址送到接收地址
01D5 2E20 MOV R2,R16
01D6 2433 CLR R3
01D7 2444 CLR R4
01D8 2455 CLR R5
01D9 9080008D LDS R8,0x8D
01DB 9090008E LDS R9,0x8E
01DD 9060008B LDS R6,0x8B
01DF 9070008C LDS R7,0x8C
01E1 2862 OR R6,R2
01E2 2873 OR R7,R3
01E3 2884 OR R8,R4
01E4 2895 OR R9,R5
01E5 9270008C STS 0x8C,R7
01E7 9260008B STS 0x8B,R6
01E9 9290008E STS 0x8E,R9
01EB 9280008D STS 0x8D,R8
(0152) }
01ED D368 RCALL pop_gset2
01EE 9508 RET
_Change_TX_ADD:
TX_ADD --> R16
01EF D381 RCALL push_gset2
(0153)
(0154) //改变nrf905的发送地址
(0155) void Change_TX_ADD(unsigned char TX_ADD)
(0156) {
(0157) TX_ADDRESS=TX_ADDRESS&0xffffff00;//先清除最低8位
01F0 E040 LDI R20,0
01F1 EF5F LDI R21,0xFF
01F2 EF6F LDI R22,0xFF
01F3 EF7F LDI R23,0xFF
01F4 90400091 LDS R4,0x91
01F6 90500092 LDS R5,0x92
01F8 9020008F LDS R2,0x8F
01FA 90300090 LDS R3,0x90
01FC 2224 AND R2,R20
01FD 2235 AND R3,R21
01FE 2246 AND R4,R22
01FF 2257 AND R5,R23
0200 92300090 STS 0x90,R3
0202 9220008F STS 0x8F,R2
0204 92500092 STS 0x92,R5
0206 92400091 STS 0x91,R4
(0158) TX_ADDRESS=TX_ADDRESS|TX_ADD;//再将新地址送到发送地址
0208 2E20 MOV R2,R16
0209 2433 CLR R3
020A 2444 CLR R4
020B 2455 CLR R5
020C 90800091 LDS R8,0x91
020E 90900092 LDS R9,0x92
0210 9060008F LDS R6,0x8F
0212 90700090 LDS R7,0x90
0214 2862 OR R6,R2
0215 2873 OR R7,R3
0216 2884 OR R8,R4
0217 2895 OR R9,R5
0218 92700090 STS 0x90,R7
021A 9260008F STS 0x8F,R6
021C 92900092 STS 0x92,R9
021E 92800091 STS 0x91,R8
(0159) }
0220 D335 RCALL pop_gset2
0221 9508 RET
_nrf905_Config:
0222 D34E RCALL push_gset2
(0160)
(0161) //配置nRF905
(0162) void nrf905_Config(void)//通过向spi 向905写寄存器从而配置寄存器
(0163) {
(0164)
(0165) CLR(PORTB,CSN); // Spi 片选开,使能spi
0223 98C2 CBI 0x18,2
(0166) nrf905_SpiRW(WC); // Write config command ,
0224 2700 CLR R16
0225 D05F RCALL _nrf905_SpiRW
(0167) nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
0226 E40C LDI R16,0x4C
0227 D05D RCALL _nrf905_SpiRW
(0168) nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
0228 E00C LDI R16,0xC
0229 D05B RCALL _nrf905_SpiRW
(0169) nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
022A E404 LDI R16,0x44
022B D059 RCALL _nrf905_SpiRW
(0170) nrf905_SpiRW(RX_PW_32BYTE); //接收数据宽度32字节
022C E200 LDI R16,0x20
022D D057 RCALL _nrf905_SpiRW
(0171) nrf905_SpiRW(TX_PW_32BYTE); //发送数据宽度32字节
022E E200 LDI R16,0x20
022F D055 RCALL _nrf905_SpiRW
(0172) nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
0230 E188 LDI R24,0x18
0231 E090 LDI R25,0
0232 9040008D LDS R4,0x8D
0234 9050008E LDS R5,0x8E
0236 9020008B LDS R2,0x8B
0238 9030008C LDS R3,0x8C
023A 938A ST R24,-Y
023B 0181 MOVW R16,R2
023C 0192 MOVW R18,R4
023D D376 RCALL lsr32
023E D046 RCALL _nrf905_SpiRW
(0173) nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
023F EF4F LDI R20,0xFF
0240 E050 LDI R21,0
0241 E060 LDI R22,0
0242 E070 LDI R23,0
0243 9040008D LDS R4,0x8D
0245 9050008E LDS R5,0x8E
0247 9020008B LDS R2,0x8B
0249 9030008C LDS R3,0x8C
024B 0112 MOVW R2,R4
024C 2444 CLR R4
024D 2455 CLR R5
024E 2224 AND R2,R20
024F 2235 AND R3,R21
0250 2246 AND R4,R22
0251 2257 AND R5,R23
0252 2D02 MOV R16,R2
0253 D031 RCALL _nrf905_SpiRW
(0174) nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
0254 E088 LDI R24,0x8
0255 E090 LDI R25,0
0256 9040008D LDS R4,0x8D
0258 9050008E LDS R5,0x8E
025A 9020008B LDS R2,0x8B
025C 9030008C LDS R3,0x8C
025E 938A ST R24,-Y
025F 0181 MOVW R16,R2
0260 0192 MOVW R18,R4
0261 D352 RCALL lsr32
0262 0118 MOVW R2,R16
0263 0129 MOVW R4,R18
0264 EF4F LDI R20,0xFF
0265 E050 LDI R21,0
0266 E060 LDI R22,0
0267 E070 LDI R23,0
0268 2224 AND R2,R20
0269 2235 AND R3,R21
026A 2246 AND R4,R22
026B 2257 AND R5,R23
026C 2D02 MOV R16,R2
026D D017 RCALL _nrf905_SpiRW
(0175) nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
026E EF4F LDI R20,0xFF
026F E050 LDI R21,0
0270 E060 LDI R22,0
0271 E070 LDI R23,0
0272 9040008D LDS R4,0x8D
0274 9050008E LDS R5,0x8E
0276 9020008B LDS R2,0x8B
0278 9030008C LDS R3,0x8C
027A 2224 AND R2,R20
027B 2235 AND R3,R21
027C 2246 AND R4,R22
027D 2257 AND R5,R23
027E 2D02 MOV R16,R2
027F D005 RCALL _nrf905_SpiRW
(0176) nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
0280 ED08 LDI R16,0xD8
0281 D003 RCALL _nrf905_SpiRW
(0177) SET(PORTB,CSN); // Disable Spi
0282 9AC2 SBI 0x18,2
(0178) }
0283 D2D2 RCALL pop_gset2
0284 9508 RET
_nrf905_SpiRW:
temp --> R20
val --> R16
0285 D2D4 RCALL push_gset1
(0179)
(0180) /*-----------------------------------------------
(0181) 控制nrf905的 SPI读写一体化函数
(0182) ------------------------------------------------*/
(0183) uchar nrf905_SpiRW(uchar val)
(0184) {
(0185) uchar temp;
(0186)
(0187) SPDR=val;
0286 B90F OUT 0x0F,R16
(0188) while ((SPSR&(1<<SPIF))==0);//置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中断使能位置位,就会引发SPI 中断
0287 9B77 SBIS 0x0E,7
0288 CFFE RJMP 0x0287
(0189) temp=SPDR;
0289 B14F IN R20,0x0F
(0190) return temp;
028A 2F04 MOV R16,R20
028B D2D1 RCALL pop_gset1
028C 9508 RET
(0191) }
(0192)
(0193) /*-----------------------------------------------
(0194) 设置为StandBy模式
(0195) ------------------------------------------------*/
(0196) void nrf905_StandBy(void)
(0197) {
(0198) SET(PORTD,PWR);//上电
_nrf905_StandBy:
028D 9A95 SBI 0x12,5
(0199) CLR(PORTD,TRXCE);
028E 9896 CBI 0x12,6
(0200) CLR(PORTD,TX_EN);
028F 9897 CBI 0x12,7
(0201) }
0290 9508 RET
(0202)
(0203) //->PwrDown
(0204) void nrf905_Off(void)
(0205) {
(0206) CLR(PORTD,PWR);
_nrf905_Off:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -