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