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

📄 nrf.lst

📁 基于m16的nrf905接收发送程序
💻 LST
📖 第 1 页 / 共 5 页
字号:
_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 + -