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

📄 nrf905_send.lst

📁 嵌入式单片机控制温度传感的无线收发方案!
💻 LST
📖 第 1 页 / 共 5 页
字号:
(0108) #define TX_ADDRESS_3         TX_ADDRESS & 0xff         //发送有效地址第4字节
(0109) 
(0110) /*-----------------------------------------------
(0111)         nrf905命令控制字 author:HotPower
(0112) ------------------------------------------------*/
(0113) #define WC        0x00            // Write configuration register command
(0114) #define RC        0x10            // Read  configuration register command
(0115) #define WTP       0x20            // Write TX Payload  command
(0116) #define RTP       0x21            // Read  TX Payload  command
(0117) #define WTA       0x22            // Write TX Address  command
(0118) #define RTA       0x23            // Read  TX Address  command
(0119) #define RRP       0x24            // Read  RX Payload  command
(0120)  
(0121) void clear_Tx_Buf(void) //清空发送缓冲
(0122)   {
(0123)   int i;
(0124)   for (i=0;i<32;i++) 
_clear_Tx_Buf:
  i                    --> R16
    0171 2700      CLR	R16
    0172 2711      CLR	R17
(0125)   Tx_Buf[i]='';
    0173 E18B      LDI	R24,0x1B
    0174 E091      LDI	R25,1
    0175 01F8      MOVW	R30,R16
    0176 0FE8      ADD	R30,R24
    0177 1FF9      ADC	R31,R25
    0178 2422      CLR	R2
    0179 8220      STD	Z+0,R2
    017A 5F0F      SUBI	R16,0xFF
    017B 4F1F      SBCI	R17,0xFF
    017C 3200      CPI	R16,0x20
    017D E0E0      LDI	R30,0
    017E 071E      CPC	R17,R30
    017F F39C      BLT	0x0173
(0126)   }
    0180 9508      RET
_Read_nrf905Add:
    0181 D7D7      RCALL	push_gset2
(0127)   
(0128) void Read_nrf905Add(void)
(0129)   //读取nrf905的接受发送地址
(0130)   {
(0131)      Tx_Buf[0]=(int)RX_ADDRESS;//子机地址
    0182 E041      LDI	R20,1
    0183 E151      LDI	R21,0x11
    0184 E161      LDI	R22,0x11
    0185 E171      LDI	R23,0x11
    0186 011A      MOVW	R2,R20
    0187 9220011B  STS	_Tx_Buf,R2
(0132) 	 Tx_Buf[1]=0x03;//命令字
    0189 E083      LDI	R24,3
    018A 9380011C  STS	_Tx_Buf+1,R24
(0133)   }
    018C D7AF      RCALL	pop_gset2
    018D 9508      RET
(0134) 
(0135) //配置nRF905
(0136) void nrf905_Config(void)//通过向spi 向905写寄存器从而配置寄存器
(0137) {
(0138)   CLR(PORTB,CSN);                   // Spi 片选开,使能spi
_nrf905_Config:
    018E 98C2      CBI	0x18,2
(0139)   nrf905_SpiRW(WC);                // Write config command ,
    018F 2700      CLR	R16
    0190 D016      RCALL	_nrf905_SpiRW
(0140)   nrf905_SpiRW(CH_NO_BYTE);                      //中心频率低8位
    0191 E40C      LDI	R16,0x4C
    0192 D014      RCALL	_nrf905_SpiRW
(0141)   //nrf905_SpiRW(PA_PWR_10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
(0142)   nrf905_SpiRW(PA_PWR__10dBm | HFREQ_PLL_433MHz); //发射+10dBm,发射频率433MHz,中心频率第9位=0
    0193 2700      CLR	R16
    0194 D012      RCALL	_nrf905_SpiRW
(0143)   nrf905_SpiRW(TX_AFW_4BYTE | RX_AFW_4BYTE);     //接收地址宽度4字节,发送地址宽度4字节
    0195 E404      LDI	R16,0x44
    0196 D010      RCALL	_nrf905_SpiRW
(0144)   nrf905_SpiRW(RX_PW_32BYTE);                    //接收数据宽度32字节
    0197 E200      LDI	R16,0x20
    0198 D00E      RCALL	_nrf905_SpiRW
(0145)   nrf905_SpiRW(TX_PW_32BYTE);                    //发送数据宽度32字节
    0199 E200      LDI	R16,0x20
    019A D00C      RCALL	_nrf905_SpiRW
(0146)   nrf905_SpiRW(RX_ADDRESS_0);                    //接收有效地址第1字节
    019B E101      LDI	R16,0x11
    019C D00A      RCALL	_nrf905_SpiRW
(0147)   nrf905_SpiRW(RX_ADDRESS_1);                    //接收有效地址第2字节
    019D E101      LDI	R16,0x11
    019E D008      RCALL	_nrf905_SpiRW
(0148)   nrf905_SpiRW(RX_ADDRESS_2);                    //接收有效地址第3字节
    019F E101      LDI	R16,0x11
    01A0 D006      RCALL	_nrf905_SpiRW
(0149)   nrf905_SpiRW(RX_ADDRESS_3);                    //接收有效地址第4字节
    01A1 E001      LDI	R16,1
    01A2 D004      RCALL	_nrf905_SpiRW
(0150)   //nrf905_SpiRW(CRC16_EN | XOF_16MHz);            //CRC16模式使能,晶体振荡器频率16MHz
(0151)  nrf905_SpiRW(0x00);            //CRC16模式使能,晶体振荡器频率16MHz
    01A3 2700      CLR	R16
    01A4 D002      RCALL	_nrf905_SpiRW
(0152)   SET(PORTB,CSN);                 // Disable Spi
    01A5 9AC2      SBI	0x18,2
(0153) }
    01A6 9508      RET
_nrf905_SpiRW:
  temp                 --> R20
  val                  --> R16
    01A7 D79A      RCALL	push_gset1
(0154) 
(0155) uchar nrf905_SpiRW(uchar val) 
(0156) {
(0157)     uchar temp;
(0158) 
(0159)     SPDR=val;
    01A8 B90F      OUT	0x0F,R16
(0160) 	while ((SPSR&(1<<SPIF))==0);//置位后,只要SPSR 寄存器的SPIF 和SREG 寄存器的全局中断使能位置位,就会引发SPI 中断
    01A9 9B77      SBIS	0x0E,7
    01AA CFFE      RJMP	0x01A9
(0161) 	temp=SPDR;
    01AB B14F      IN	R20,0x0F
(0162) 	return temp;
    01AC 2F04      MOV	R16,R20
    01AD D797      RCALL	pop_gset1
    01AE 9508      RET
(0163) }
(0164) 
(0165) //PwrDown->StandBy
(0166) void nrf905_StandBy(void)
(0167) {
(0168)    SET(PORTD,PWR);//上电
_nrf905_StandBy:
    01AF 9A95      SBI	0x12,5
(0169)    CLR(PORTD,TRXCE);
    01B0 9896      CBI	0x12,6
(0170)    CLR(PORTD,TX_EN);
    01B1 9897      CBI	0x12,7
(0171) }
    01B2 9508      RET
(0172) 
(0173) //->PwrDown
(0174) void nrf905_Off(void)
(0175) {
(0176)   CLR(PORTD,PWR);
_nrf905_Off:
    01B3 9895      CBI	0x12,5
(0177) }
    01B4 9508      RET
(0178) 
(0179) //->ShockBurst Send
(0180) void nrf905_TxOn(void)
(0181) {
(0182)   SET(PORTD,PWR);
_nrf905_TxOn:
    01B5 9A95      SBI	0x12,5
(0183)   SET(PORTD,TX_EN);
    01B6 9A97      SBI	0x12,7
(0184)   CLR(PORTD,TRXCE);
    01B7 9896      CBI	0x12,6
(0185) }
    01B8 9508      RET
(0186) 
(0187) //->ShockBurst Send
(0188) void nrf905_TxSend(void)
(0189) {
(0190)   SET(PORTD,TRXCE);
_nrf905_TxSend:
    01B9 9A96      SBI	0x12,6
(0191)   delay_us(20);//>10us
    01BA E104      LDI	R16,0x14
    01BB E010      LDI	R17,0
    01BC D0AE      RCALL	_delay_us
(0192)   CLR(PORTD,TRXCE);//只发送一次
    01BD 9896      CBI	0x12,6
(0193) 
(0194) }
    01BE 9508      RET
(0195) 
(0196) 
(0197) 
(0198) //初始化nrf905
(0199) void nrf905_Init(void)
(0200) {
(0201)    nrf905_StandBy();
_nrf905_Init:
    01BF DFEF      RCALL	_nrf905_StandBy
(0202)    delay_10ms(2);//!!!must >3ms
    01C0 E002      LDI	R16,2
    01C1 E010      LDI	R17,0
    01C2 D085      RCALL	_delay_10ms
(0203)    nrf905_Config();
(0204)    
(0205)  // nrf905_SpiTest();//test... 测试:通过读配置,判断SPI操作是否正确
(0206)   // nrf905_RxOn();//enable nrf905接收
(0207) }
    01C3 CFCA      RJMP	_nrf905_Config
_nrf905_SpiTest:
  i                    --> R20
    01C4 D77D      RCALL	push_gset1
(0208) 
(0209) 
(0210) //测试:通过读配置,判断SPI操作是否正确
(0211) void nrf905_SpiTest(void)
(0212) {
(0213)   uchar i;
(0214)   CLR(PORTB,CSN);                   
    01C5 98C2      CBI	0x18,2
(0215)   nrf905_SpiRW(RC);  //读配置
    01C6 E100      LDI	R16,0x10
    01C7 DFDF      RCALL	_nrf905_SpiRW
(0216)   for (i=0;i<10;i++)
    01C8 2744      CLR	R20
    01C9 C00A      RJMP	0x01D4
(0217)   { 
(0218)    Rx_Buf[i]=nrf905_SpiRW(0);//read from nrf905
    01CA 2700      CLR	R16
    01CB DFDB      RCALL	_nrf905_SpiRW
    01CC EF8B      LDI	R24,0xFB
    01CD E090      LDI	R25,0
    01CE 2FE4      MOV	R30,R20
    01CF 27FF      CLR	R31
    01D0 0FE8      ADD	R30,R24
    01D1 1FF9      ADC	R31,R25
    01D2 8300      STD	Z+0,R16
    01D3 9543      INC	R20
    01D4 304A      CPI	R20,0xA
    01D5 F3A0      BCS	0x01CA
(0219)   }
(0220)   SET(PORTB,CSN);  
    01D6 9AC2      SBI	0x18,2
(0221) 
(0222) }
    01D7 D76D      RCALL	pop_gset1
    01D8 9508      RET
(0223) 
(0224) 
(0225) //写Tx地址
(0226) void nrf905_SetTxAddr(void)
(0227) {
(0228)   CLR(PORTB,CSN);                   
_nrf905_SetTxAddr:
    01D9 98C2      CBI	0x18,2
(0229)   nrf905_SpiRW(WTA);  //写Tx地址  
    01DA E202      LDI	R16,0x22
    01DB DFCB      RCALL	_nrf905_SpiRW
(0230)   nrf905_SpiRW(TX_ADDRESS_0);
    01DC E101      LDI	R16,0x11
    01DD DFC9      RCALL	_nrf905_SpiRW
(0231)   nrf905_SpiRW(TX_ADDRESS_1);
    01DE E101      LDI	R16,0x11
    01DF DFC7      RCALL	_nrf905_SpiRW
(0232)   nrf905_SpiRW(TX_ADDRESS_2);
    01E0 E101      LDI	R16,0x11
    01E1 DFC5      RCALL	_nrf905_SpiRW
(0233)   nrf905_SpiRW(TX_ADDRESS_3);
    01E2 E101      LDI	R16,0x11
    01E3 DFC3      RCALL	_nrf905_SpiRW
(0234)   SET(PORTB,CSN);  
    01E4 9AC2      SBI	0x18,2
(0235) }
    01E5 9508      RET
_nrf905_SetData:
  i                    --> R20
    01E6 D75B      RCALL	push_gset1
(0236) 
(0237) //写Tx数据
(0238) void nrf905_SetData(void)
(0239) {uchar i;
(0240)   
(0241)   CLR(PORTB,CSN);                   
    01E7 98C2      CBI	0x18,2
(0242)   nrf905_SpiRW(WTP);  //写TxPayload 
    01E8 E200      LDI	R16,0x20
    01E9 DFBD      RCALL	_nrf905_SpiRW
(0243)   for (i=0;i<SIZE;i++)
    01EA 2744      CLR	R20
    01EB C009      RJMP	0x01F5
(0244)   { 
(0245)     nrf905_SpiRW(Tx_Buf[i]);
    01EC E18B      LDI	R24,0x1B
    01ED E091      LDI	R25,1
    01EE 2FE4      MOV	R30,R20
    01EF 27FF      CLR	R31
    01F0 0FE8      ADD	R30,R24
    01F1 1FF9      ADC	R31,R25
    01F2 8100      LDD	R16,Z+0
    01F3 DFB3      RCALL	_nrf905_SpiRW
    01F4 9543      INC	R20
    01F5 3240      CPI	R20,0x20
    01F6 F3A8      BCS	0x01EC
(0246)   }
(0247)   
(0248)   SET(PORTB,CSN);  
    01F7 9AC2      SBI	0x18,2
(0249)  
(0250) }
    01F8 D74C      RCALL	pop_gset1
    01F9 9508      RET
(0251) 
(0252) //等待发送结束
(0253) void nrf905_WaitSended(void)
(0254) {
(0255)    while ((PIND&(1<<DR))==0);
_nrf905_WaitSended:
    01FA 9B82      SBIS	0x10,2
    01FB CFFE      RJMP	_nrf905_WaitSended
(0256) }
    01FC 9508      RET
(0257) 
(0258) //发送TxBuf中的数据
(0259) void nrf905_SendData(void)
(0260) {
(0261)    nrf905_TxOn();//切换到发送模式
_nrf905_SendData:
    01FD DFB7      RCALL	_nrf905_TxOn
(0262)    delay_10ms(2);
    01FE E002      LDI	R16,2
    01FF E010      LDI	R17,0
    0200 D047      RCALL	_delay_10ms
(0263)    nrf905_SetTxAddr();//写发送地址WTA
    0201 DFD7      RCALL	_nrf905_SetTxAddr
(0264)    nrf905_SetData();//写数据WTP
    0202 DFE3      RCALL	_nrf905_SetData
(0265)    nrf905_TxSend();//启动发送
    0203 DFB5      RCALL	_nrf905_TxSend
(0266)    nrf905_WaitSended();//等待发送结束
(0267)    
(0268) }
    0204 CFF5      RJMP	_nrf905_WaitSended
(0269) 
(0270) //测试直接重新发送上次写入的数据
(0271) void nrf905_SendAgain(void)
(0272) {
(0273)    nrf905_TxOn();
_nrf905_SendAgain:
    0205 DFAF      RCALL	_nrf905_TxOn
(0274)    nrf905_TxSend();
    0206 DFB2      RCALL	_nrf905_TxSend
(0275)    nrf905_WaitSended();
(0276)    
(0277) }
    0207 CFF2      RJMP	_nrf905_WaitSended
(0278) 
(0279) 
(0280) 
(0281) //发送测试
(0282) void RfSendProc(void)
(0283) {
(0284)   // puts_hh("Into send process code");
(0285)    nrf905_SendData();//发送测试数据
_RfSendProc:
    0208 DFF4      RCALL	_nrf905_SendData
(0286)    nrf905_Off();//断开电源
(0287)   // puts_hh(Tx_Buf);//向串口打印数据
(0288) }
    0209 CFA9      RJMP	_nrf905_Off
FILE: E:\公司用\atmega8l\final\nrf905_send1\timer.c
(0001) //ICC-AVR application builder : 2008-7-29 14:35:46
(0002) // Target : M8
(0003) // Crystal: 4.0000Mhz
(0004) #include "confg.h"
(0005) 
(0006) unsigned int i=0,count=0,flag=0;
(0007) int number;
(0008) 
(0009) //TIMER0 initialisation - prescale:1024
(0010) // WGM: Normal
(0011) // desired value: 10mSec
(0012) // actual value: 9.984mSec (0.2%)
(0013) void timer0_init(void)
(0014) {
(0015) 
(0016)   TCCR0 = 0x00; //stop
_timer0_init:
    020A 2422      CLR	R2
    020B BE23      OUT	0x33,R2
(0017)  TCNT0 = 0x64; //set count
    020C E684      LDI	R24,0x64
    020D BF82      OUT	0x32,R24
(0018)  TCCR0 = 0x04; //start timer
    020E E084      LDI	R24,4
    020F BF83      OUT	0x33,R24
(0019) }
    0210 9508      RET
_time0:
    0211 922A      ST	R2,-Y
    0212 923A      ST	R3,-Y
    0213 938A      ST	R24,-Y
    0214 939A      ST	R25,-Y
    0215 B62F      IN	R2,0x3F
    0216 922A      ST	R2,-Y
(0020) 
(0021) 
(0022) #pragma interrupt_handler time0:10
(0023) void time0(void)
(0024) {
(0025)   TCNT0 = 0x64; //set count
    0217 E684      LDI	R24,0x64
    0218 BF82      OUT	0x32,R24
(0026)   count++;
    0219 918000B1  LDS	R24,0xB1
    021B 919000B2  LDS	R25,0xB2
    021D 9601      ADIW	R24,1
    021E 939000B2  STS	0xB2,R25
    0220 938000B1  STS	0xB1,R24

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -