📄 slave.lst
字号:
__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 + -