📄 nrf.lst
字号:
_DelayUs:
i --> R20
us --> R16
163 934A ST R20,-Y
164 935A ST R21,-Y
(0016) }
(0017)
(0018) void DelayUs(uint us)
(0019) {
(0020) uint i;
(0021) for( i = 0; i < us; i++ )
165 2744 CLR R20
166 2755 CLR R21
167 C008 RJMP 0x0170
(0022) { NOP(); NOP(); NOP(); NOP(); NOP(); NOP(); }
168 0000 NOP
169 0000 NOP
16A 0000 NOP
16B 0000 NOP
16C 0000 NOP
16D 0000 NOP
16E 5F4F SUBI R20,0xFF
16F 4F5F SBCI R21,0xFF
170 1740 CP R20,R16
171 0751 CPC R21,R17
172 F3A8 BCS 0x0168
173 9159 LD R21,Y+
174 9149 LD R20,Y+
175 9508 RET
(0023) }
(0024) //-----------------------------------------------------------------
(0025)
(0026) //配置nRF905
(0027) void nrf905_Config(void)
(0028) {
(0029) CLR( PORT_SPI, CSN ); // Spi 片选开
_nrf905_Config:
176 98C4 CBI 0x18,4
(0030) nrf905_SpiRW(WC); // Write config command
177 2700 CLR R16
178 D027 RCALL _nrf905_SpiRW
(0031) nrf905_SpiRW(CH_NO_BYTE); //中心频率低8位
179 E40C LDI R16,0x4C
17A D025 RCALL _nrf905_SpiRW
(0032) nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
17B E00C LDI R16,0xC
17C D023 RCALL _nrf905_SpiRW
(0033) nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE); //接收地址宽度4字节,发送地址宽度4字节
17D E404 LDI R16,0x44
17E D021 RCALL _nrf905_SpiRW
(0034) nrf905_SpiRW(RX_PW_1BYTE); //接收数据宽度32字节
17F E001 LDI R16,1
180 D01F RCALL _nrf905_SpiRW
(0035) nrf905_SpiRW(TX_PW_1BYTE); //发送数据宽度32字节
181 E001 LDI R16,1
182 D01D RCALL _nrf905_SpiRW
(0036) nrf905_SpiRW(RX_ADDRESS_0); //接收有效地址第1字节
183 E102 LDI R16,0x12
184 D01B RCALL _nrf905_SpiRW
(0037) nrf905_SpiRW(RX_ADDRESS_1); //接收有效地址第2字节
185 E304 LDI R16,0x34
186 D019 RCALL _nrf905_SpiRW
(0038) nrf905_SpiRW(RX_ADDRESS_2); //接收有效地址第3字节
187 E506 LDI R16,0x56
188 D017 RCALL _nrf905_SpiRW
(0039) nrf905_SpiRW(RX_ADDRESS_3); //接收有效地址第4字节
189 E708 LDI R16,0x78
18A D015 RCALL _nrf905_SpiRW
(0040) nrf905_SpiRW(CRC16_EN | XOF_16MHz); //CRC16模式使能,晶体振荡器频率16MHz
18B ED08 LDI R16,0xD8
18C D013 RCALL _nrf905_SpiRW
(0041) SET( PORT_SPI, CSN ); // Disable Spi
18D 9AC4 SBI 0x18,4
18E 9508 RET
(0042) }
(0043)
(0044) //spi寄存器以及端口初始化
(0045) void SPI_Init(void)
(0046) {
(0047) DDR_SPI |= ( 1 << MOSI ) | ( 1 << MISO ) | ( 1 << SCK ) | ( 1 << CSN ); // 设置MOSI和SCK、SS为输出,其他为输入
_SPI_Init:
18F B387 IN R24,0x17
190 6F80 ORI R24,0xF0
191 BB87 OUT 0x17,R24
(0048) PORT_SPI |= ( 1 << MOSI ) | ( 1 << SCK ) | ( 1 << CSN );
192 B388 IN R24,0x18
193 6B80 ORI R24,0xB0
194 BB88 OUT 0x18,R24
(0049) SPCR |= ( 1 << SPE ) | ( 1 << MSTR ) | ( 0 << CPOL ) | ( 0 << SPR0); // 主机模式,fck/16, SPI方式0
195 B18D IN R24,0x0D
196 6580 ORI R24,0x50
197 B98D OUT 0x0D,R24
198 9508 RET
(0050) }
(0051)
(0052) //nRF端口初始化
(0053) void nrfport_init( void )
(0054) {
(0055) DDR_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 0 << DR ) | ( 1 << PWR );
_nrfport_init:
199 B387 IN R24,0x17
19A 6087 ORI R24,7
19B BB87 OUT 0x17,R24
(0056) PORT_NRF |= ( 1 << TX_EN ) | ( 1 << TRXCE ) | ( 1 << DR ) | ( 1 << PWR );
19C B388 IN R24,0x18
19D 608F ORI R24,0xF
19E BB88 OUT 0x18,R24
19F 9508 RET
(0057) }
(0058)
(0059) //spi读写函数
(0060) uchar nrf905_SpiRW( uchar val )
(0061) {
(0062) SPDR = val;
_nrf905_SpiRW:
val --> R16
1A0 B90F OUT 0x0F,R16
(0063) while ( ( SPSR & ( 1 << SPIF ) ) == 0 );
1A1 9B77 SBIS 0x0E,7
1A2 CFFE RJMP 0x01A1
(0064) return SPDR;
1A3 B10F IN R16,0x0F
1A4 9508 RET
(0065) }
(0066)
(0067) //Standby 和SPI 编程模式, 一般在初始化写配置信息时用到。
(0068) void nrf905_StandBy( void )
(0069) {
(0070) SET( PORT_NRF, PWR ); //PWR_UP = 1 上电
_nrf905_StandBy:
1A5 9AC2 SBI 0x18,2
(0071) CLR( PORT_NRF, TRXCE ); //TRX_CE = 0 关闭发送或接收
1A6 98C1 CBI 0x18,1
(0072) CLR( PORT_NRF, TX_EN ); //TX_EN = X 任意值, 当TRX_CE = 1时起作用
1A7 98C0 CBI 0x18,0
1A8 9508 RET
(0073) }
(0074)
(0075) //掉电和SPI 编程
(0076) void nrf905_Off( void )
(0077) {
(0078) CLR( PORT_NRF, PWR );
_nrf905_Off:
1A9 98C2 CBI 0x18,2
1AA 9508 RET
(0079) }
(0080)
(0081) //发送模式
(0082) void nrf905_TxOn( void )
(0083) {
(0084) SET( PORT_NRF, PWR ); //注意顺序
_nrf905_TxOn:
1AB 9AC2 SBI 0x18,2
(0085) SET( PORT_NRF, TX_EN ); //使能发送
1AC 9AC0 SBI 0x18,0
(0086) CLR( PORT_NRF, TRXCE ); //在这里还没有启动发送
1AD 98C1 CBI 0x18,1
1AE 9508 RET
(0087) }
(0088)
(0089) //启动发送
(0090) void nrf905_TxSend( void )
(0091) {
(0092) SET( PORT_NRF, TRXCE );
_nrf905_TxSend:
1AF 9AC1 SBI 0x18,1
(0093) DelayUs(20); //>10us
1B0 E104 LDI R16,0x14
1B1 E010 LDI R17,0
1B2 DFB0 RCALL _DelayUs
(0094) CLR( PORT_NRF, TRXCE ); //只发送一次
1B3 98C1 CBI 0x18,1
1B4 9508 RET
(0095) }
(0096)
(0097) //接收模式
(0098) void nrf905_RxOn( void )
(0099) {
(0100) SET( PORT_NRF, PWR ); //注意顺序
_nrf905_RxOn:
1B5 9AC2 SBI 0x18,2
(0101) CLR( PORT_NRF, TX_EN ); //maybe first
1B6 98C0 CBI 0x18,0
(0102) SET( PORT_NRF, TRXCE ); //
1B7 9AC1 SBI 0x18,1
1B8 9508 RET
(0103) }
(0104)
(0105) //初始化nrf905
(0106) void nrf905_Init( void )
(0107) {
(0108) nrfport_init(); //配置nrf端口
_nrf905_Init:
1B9 DFDF RCALL _nrfport_init
(0109)
(0110) nrf905_StandBy(); //掉电与spi编程模式
1BA DFEA RCALL _nrf905_StandBy
(0111)
(0112) DelayMs(10); //!!!must >3ms
1BB E00A LDI R16,0xA
1BC DF98 RCALL _DelayMs
(0113)
(0114) nrf905_Config(); //配置nrf
1BD DFB8 RCALL _nrf905_Config
(0115)
(0116) nrf905_RxOn(); //初始化为接收模式
1BE DFF6 RCALL _nrf905_RxOn
1BF 9508 RET
(0117) }
(0118)
(0119)
(0120) //写Tx地址
(0121) void nrf905_SetTxAddr( void )
(0122) {
(0123) CLR( PORT_SPI, CSN ); //启动spi
_nrf905_SetTxAddr:
1C0 98C4 CBI 0x18,4
(0124) nrf905_SpiRW( WTA ); //写Tx地址 写TX 地址1-4 字节写操作全部从字节0 开始
1C1 E202 LDI R16,0x22
1C2 DFDD RCALL _nrf905_SpiRW
(0125) nrf905_SpiRW( TX_ADDRESS_0 );
1C3 E102 LDI R16,0x12
1C4 DFDB RCALL _nrf905_SpiRW
(0126) nrf905_SpiRW( TX_ADDRESS_1 );
1C5 E304 LDI R16,0x34
1C6 DFD9 RCALL _nrf905_SpiRW
(0127) nrf905_SpiRW( TX_ADDRESS_2 );
1C7 E506 LDI R16,0x56
1C8 DFD7 RCALL _nrf905_SpiRW
(0128) nrf905_SpiRW( TX_ADDRESS_3 );
1C9 E708 LDI R16,0x78
1CA DFD5 RCALL _nrf905_SpiRW
(0129) SET( PORT_SPI, CSN );
1CB 9AC4 SBI 0x18,4
1CC 9508 RET
_nrf905_SetData:
set_data --> R10
1CD 92AA ST R10,-Y
1CE 2EA0 MOV R10,R16
(0130) }
(0131)
(0132) //写数据
(0133) void nrf905_SetData( uchar set_data )
(0134) {
(0135) CLR( PORT_SPI, CSN ); //启动spi
1CF 98C4 CBI 0x18,4
(0136) nrf905_SpiRW( WTP ); //写TxPayload 向发送数据寄存器写特征字
1D0 E200 LDI R16,0x20
1D1 DFCE RCALL _nrf905_SpiRW
(0137) nrf905_SpiRW( set_data ); //写数据
1D2 2D0A MOV R16,R10
1D3 DFCC RCALL _nrf905_SpiRW
(0138) SET( PORT_SPI, CSN) ; //关闭spi
1D4 9AC4 SBI 0x18,4
1D5 90A9 LD R10,Y+
1D6 9508 RET
(0139) }
(0140)
(0141) //等待发送结束
(0142) void nrf905_WaitSended( void )
(0143) {
(0144) while ( ( PIN_NRF &( 1 << DR ) ) == 0 );
_nrf905_WaitSended:
1D7 9BB3 SBIS 0x16,3
1D8 CFFE RJMP _nrf905_WaitSended
1D9 9508 RET
_nrf905_SendData:
tx_data --> R10
1DA 92AA ST R10,-Y
1DB 2EA0 MOV R10,R16
(0145) }
(0146)
(0147) //发送数据
(0148) void nrf905_SendData( uchar tx_data )
(0149) {
(0150) nrf905_TxOn(); //切换到发送模式
1DC DFCE RCALL _nrf905_TxOn
(0151) nrf905_SetTxAddr(); //写发送地址
1DD DFE2 RCALL _nrf905_SetTxAddr
(0152) nrf905_SetData( tx_data );//写数据
1DE 2D0A MOV R16,R10
1DF DFED RCALL _nrf905_SetData
(0153) nrf905_TxSend(); //启动发送
1E0 DFCE RCALL _nrf905_TxSend
(0154) nrf905_WaitSended(); //等待发送结束
1E1 DFF5 RCALL _nrf905_WaitSended
1E2 90A9 LD R10,Y+
1E3 9508 RET
_nrf905_ReadData:
i --> Y,+1
rx_tmp --> R10
1E4 92AA ST R10,-Y
(0155) //nrf905_Off();
(0156) }
(0157)
(0158) //读出接收到的数据
(0159) uchar nrf905_ReadData( void )
(0160) {
(0161) uchar i;
(0162) uchar rx_tmp; //定义读出的数据,暂存值
(0163)
(0164) CLR( PORT_SPI, CSN );
1E5 98C4 CBI 0x18,4
(0165) nrf905_SpiRW( RRP ); //读RxPayload,RRP, 读数据寄存器特征字, 说明的是从字节0开始读32个字节的数据
1E6 E204 LDI R16,0x24
1E7 DFB8 RCALL _nrf905_SpiRW
(0166) rx_tmp = nrf905_SpiRW( 0x00 );
1E8 2700 CLR R16
1E9 DFB6 RCALL _nrf905_SpiRW
1EA 2EA0 MOV R10,R16
(0167) SET( PORT_SPI, CSN );
1EB 9AC4 SBI 0x18,4
(0168) //while( PIN_NRF & ( 1 << DR ) ); //等待接收完成
(0169) return rx_tmp; //返回接收到的数据
1EC 90A9 LD R10,Y+
1ED 9508 RET
FILE: C:\DOCUME~1\Administrator\桌面\nrftest\delay.c
(0001) #define _DELAY_C_
(0002) #include "DELAY.H" //用户自己定义的头文件
(0003)
(0004) //1us延时函数
(0005) void delay_1us( void )
(0006) {
(0007) uint i = 1;
_delay_1us:
i --> R16
1EE E001 LDI R16,1
1EF E010 LDI R17,0
1F0 C001 RJMP 0x01F2
(0008) while( i-- )
(0009) {
(0010) asm("nop");
1F1 0000 NOP
1F2 0118 MOVW R2,R16
1F3 5001 SUBI R16,1
1F4 4010 SBCI R17,0
1F5 2022 TST R2
1F6 F7D1 BNE 0x01F1
1F7 2033 TST R3
1F8 F7C1 BNE 0x01F1
1F9 9508 RET
_delay_nus:
i --> R20
n --> R10
1FA 940E 0558 CALL push_xgset300C
1FC 0158 MOVW R10,R16
(0011) }
(0012) }
(0013)
(0014) //nus延时函数
(0015) void delay_nus( uint n )
(0016) {
(0017) uint i = 0;
1FD 2744 CLR R20
1FE 2755 CLR R21
(0018) for (i = 0; i < n; i++)
1FF C003 RJMP 0x0203
(0019) delay_1us();
200 DFED RCALL _delay_1us
201 5F4F SUBI R20,0xFF
202 4F5F SBCI R21,0xFF
203 154A CP R20,R10
204 055B CPC R21,R11
205 F3D0 BCS 0x0200
206 940C 055D JMP pop_xgset300C
(0020) }
(0021)
(0022) //1ms延时函数
(0023) void delay_1ms( void )
(0024) {
(0025) uint i;
(0026) for (i = 0; i < 1140; i++)
_delay_1ms:
i --> R16
208 2700 CLR R16
209 2711 CLR R17
20A C002 RJMP 0x020D
20B 5F0F SUBI R16,0xFF
20C 4F1F SBCI R17,0xFF
20D 3704 CPI R16,0x74
20E E0E4 LDI R30,4
20F 071E CPC R17,R30
210 F3D0 BCS 0x020B
211 9508 RET
_delay_nms:
i --> R20
n --> R10
212 940E 0558 CALL push_xgset300C
214 0158 MOVW R10,R16
(0027) {;}
(0028) }
(0029)
(0030) //nms延时函数
(0031) void delay_nms( uint n )
(0032) {
(0033) uint i = 0;
215 2744 CLR R20
216 2755 CLR R21
(0034) for (i = 0; i < n; i++)
217 C003 RJMP 0x021B
(0035) delay_1ms();
218 DFEF RCALL _delay_1ms
219 5F4F SUBI R20,0xFF
21A 4F5F SBCI R21,0xFF
21B 154A CP R20,R10
21C 055B CPC R21,R11
21D F3D0 BCS 0x0218
21E 940C 055D JMP pop_xgset300C
_delay_ns:
i --> R10
n --> R12
220 92AA ST R10,-Y
221 92CA ST R12,-Y
222 2EC0 MOV R12,R16
(0036) }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -