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

📄 slave.lst

📁 这是用C编的nrf905的通讯程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
    01B5 2639      EOR	R3,R25
    01B6 BA22      OUT	0x12,R2
(0226)   if(RxBuf[3]==RX_PW_1BYTE)CPL(PORTD,LED); 
    01B7 91800069  LDS	R24,RxBuf+3
    01B9 3081      CPI	R24,1
    01BA F439      BNE	0x01C2
    01BB E880      LDI	R24,0x80
    01BC E090      LDI	R25,0
    01BD B222      IN	R2,0x12
    01BE 2433      CLR	R3
    01BF 2628      EOR	R2,R24
    01C0 2639      EOR	R3,R25
    01C1 BA22      OUT	0x12,R2
(0227)   if(RxBuf[4]==TX_PW_1BYTE)CPL(PORTD,LED); 
    01C2 9180006A  LDS	R24,0x6A
    01C4 3081      CPI	R24,1
    01C5 F439      BNE	0x01CD
    01C6 E880      LDI	R24,0x80
    01C7 E090      LDI	R25,0
    01C8 B222      IN	R2,0x12
    01C9 2433      CLR	R3
    01CA 2628      EOR	R2,R24
    01CB 2639      EOR	R3,R25
    01CC BA22      OUT	0x12,R2
(0228)   if(RxBuf[5]==(RX_ADDRESS_0))CPL(PORTD,LED); 
    01CD E847      LDI	R20,0x87
    01CE E050      LDI	R21,0
    01CF E060      LDI	R22,0
    01D0 E070      LDI	R23,0
    01D1 9020006B  LDS	R2,0x6B
    01D3 2433      CLR	R3
    01D4 2444      CLR	R4
    01D5 2455      CLR	R5
    01D6 1624      CP	R2,R20
    01D7 0635      CPC	R3,R21
    01D8 0646      CPC	R4,R22
    01D9 0657      CPC	R5,R23
    01DA F439      BNE	0x01E2
    01DB E880      LDI	R24,0x80
    01DC E090      LDI	R25,0
    01DD B222      IN	R2,0x12
    01DE 2433      CLR	R3
    01DF 2628      EOR	R2,R24
    01E0 2639      EOR	R3,R25
    01E1 BA22      OUT	0x12,R2
(0229)   if(RxBuf[6]==RX_ADDRESS_1)CPL(PORTD,LED); 
    01E2 E645      LDI	R20,0x65
    01E3 E050      LDI	R21,0
    01E4 E060      LDI	R22,0
    01E5 E070      LDI	R23,0
    01E6 9020006C  LDS	R2,0x6C
    01E8 2433      CLR	R3
    01E9 2444      CLR	R4
    01EA 2455      CLR	R5
    01EB 1624      CP	R2,R20
    01EC 0635      CPC	R3,R21
    01ED 0646      CPC	R4,R22
    01EE 0657      CPC	R5,R23
    01EF F439      BNE	0x01F7
    01F0 E880      LDI	R24,0x80
    01F1 E090      LDI	R25,0
    01F2 B222      IN	R2,0x12
    01F3 2433      CLR	R3
    01F4 2628      EOR	R2,R24
    01F5 2639      EOR	R3,R25
    01F6 BA22      OUT	0x12,R2
(0230)   //if(RxBuf[7]==RX_ADDRESS_2)CPL(PORTD,LED); 
(0231)   //if(RxBuf[8]==RX_ADDRESS_3)CPL(PORTD,LED); 
(0232)   //if(RxBuf[9]==(CRC16_EN | XOF_16MHz))CPL(PORTD,LED); 
(0233)   
(0234)   }
(0235)   SET(PORTB,CSN);  
    01F7 9AC4      SBI	0x18,4
    01F8 940E0401  CALL	pop_gset3
    01FA 9508      RET
(0236) }
(0237) 
(0238) //写Tx地址
(0239) void nrf905_SetTxAddr()
(0240) {
(0241)   CLR(PORTB,CSN);                   
_nrf905_SetTxAddr:
    01FB 98C4      CBI	0x18,4
(0242)   nrf905_SpiRW(WTA);  //写Tx地址  
    01FC E202      LDI	R16,0x22
    01FD DF5D      RCALL	_nrf905_SpiRW
(0243)   nrf905_SpiRW(TX_ADDRESS_0);
    01FE E102      LDI	R16,0x12
    01FF DF5B      RCALL	_nrf905_SpiRW
(0244)   nrf905_SpiRW(TX_ADDRESS_1);
    0200 E304      LDI	R16,0x34
    0201 DF59      RCALL	_nrf905_SpiRW
(0245)   nrf905_SpiRW(TX_ADDRESS_2);
    0202 E506      LDI	R16,0x56
    0203 DF57      RCALL	_nrf905_SpiRW
(0246)   nrf905_SpiRW(TX_ADDRESS_3);
    0204 E708      LDI	R16,0x78
    0205 DF55      RCALL	_nrf905_SpiRW
(0247)   SET(PORTB,CSN);  
    0206 9AC4      SBI	0x18,4
    0207 9508      RET
_nrf905_SetData:
  i                    --> R20
    0208 940E040C  CALL	push_gset1
(0248) }
(0249) 
(0250) //写Tx数据
(0251) void nrf905_SetData()
(0252) {uchar i;
(0253) 
(0254)   CLR(PORTB,CSN);                   
    020A 98C4      CBI	0x18,4
(0255)   nrf905_SpiRW(WTP);  //写TxPayload 
    020B E200      LDI	R16,0x20
    020C DF4E      RCALL	_nrf905_SpiRW
(0256)   for (i=0;i<SIZE;i++)
    020D 2744      CLR	R20
    020E C009      RJMP	0x0218
(0257)   { 
(0258)     nrf905_SpiRW(TxBuf[i]);
    020F EC8A      LDI	R24,0xCA
    0210 E090      LDI	R25,0
    0211 2FE4      MOV	R30,R20
    0212 27FF      CLR	R31
    0213 0FE8      ADD	R30,R24
    0214 1FF9      ADC	R31,R25
    0215 8100      LDD	R16,Z+0
    0216 DF44      RCALL	_nrf905_SpiRW
    0217 9543      INC	R20
    0218 3240      CPI	R20,0x20
    0219 F3A8      BCS	0x020F
(0259)   }
(0260)   
(0261)   SET(PORTB,CSN);  
    021A 9AC4      SBI	0x18,4
    021B 940E040F  CALL	pop_gset1
    021D 9508      RET
(0262) }
(0263) 
(0264) //等待发送结束
(0265) void nrf905_WaitSended()
(0266) {
(0267)    while ((PINB&(1<<DR))==0);
_nrf905_WaitSended:
    021E 9BB3      SBIS	0x16,3
    021F CFFE      RJMP	_nrf905_WaitSended
    0220 9508      RET
(0268) }
(0269) 
(0270) //发送TxBuf中的数据
(0271) void nrf905_SendData()
(0272) {
(0273)    nrf905_TxOn();//切换到发送模式
_nrf905_SendData:
    0221 DF49      RCALL	_nrf905_TxOn
(0274)    
(0275)    nrf905_SetTxAddr();//写发送地址
    0222 DFD8      RCALL	_nrf905_SetTxAddr
(0276)    nrf905_SetData();//写数据
    0223 DFE4      RCALL	_nrf905_SetData
(0277)    nrf905_TxSend();//启动发送
    0224 DF4A      RCALL	_nrf905_TxSend
(0278)    nrf905_WaitSended();//等待发送结束
    0225 DFF8      RCALL	_nrf905_WaitSended
    0226 9508      RET
(0279)    
(0280) }
(0281) 
(0282) //测试直接重新发送上次写入的数据
(0283) void nrf905_SendAgain()
(0284) {
(0285)    nrf905_TxOn();
_nrf905_SendAgain:
    0227 DF43      RCALL	_nrf905_TxOn
(0286)    nrf905_TxSend();
    0228 DF46      RCALL	_nrf905_TxSend
(0287)    nrf905_WaitSended();
    0229 DFF4      RCALL	_nrf905_WaitSended
    022A 9508      RET
_nrf905_ReadData:
  i                    --> R20
    022B 940E040C  CALL	push_gset1
(0288)    
(0289) }
(0290) 
(0291) //读出接收到的数据
(0292) void nrf905_ReadData()
(0293) {
(0294)   uchar i;
(0295) 
(0296)   CLR(PORTB,CSN);                   
    022D 98C4      CBI	0x18,4
(0297)   nrf905_SpiRW(RRP);  //读RxPayload 
    022E E204      LDI	R16,0x24
    022F DF2B      RCALL	_nrf905_SpiRW
(0298)   for (i=0;i<SIZE;i++)
    0230 2744      CLR	R20
    0231 C00A      RJMP	0x023C
(0299)   { 
(0300)     RxBuf[i]=nrf905_SpiRW(0);//read...
    0232 2700      CLR	R16
    0233 DF27      RCALL	_nrf905_SpiRW
    0234 E686      LDI	R24,0x66
    0235 E090      LDI	R25,0
    0236 2FE4      MOV	R30,R20
    0237 27FF      CLR	R31
    0238 0FE8      ADD	R30,R24
    0239 1FF9      ADC	R31,R25
    023A 8300      STD	Z+0,R16
    023B 9543      INC	R20
    023C 3240      CPI	R20,0x20
    023D F3A0      BCS	0x0232
(0301)   }
(0302)   
(0303)   SET(PORTB,CSN);  
    023E 9AC4      SBI	0x18,4
    023F 940E040F  CALL	pop_gset1
    0241 9508      RET
FILE: C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\slave.C
(0001) //SLAVE
(0002) 
(0003) //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
(0004) 
(0005) 
(0006) #include "config.h"
(0007) #include "nrf905.h"
(0008) 
(0009) #define MASTER  //编译控制是主机还是从机
(0010) 
(0011) 
(0012) #define T0N 25
(0013) void DelayUs(uint);
(0014) void DelayMs(uchar);
(0015) //32字节数据包发送时间 
(0016) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0017) #define RFTN 25  //发送测试间隔 10*20ms
(0018) 
(0019) bit bTimer,bRfSend;
(0020) uchar T0Cnt,RfCnt;
(0021) 
(0022) void port_init(void)
(0023) {
(0024)  PORTA = 0x00;
_port_init:
    0242 2422      CLR	R2
    0243 BA2B      OUT	0x1B,R2
(0025)  DDRA  = 0xff;
    0244 EF8F      LDI	R24,0xFF
    0245 BB8A      OUT	0x1A,R24
(0026)  PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
    0246 E48E      LDI	R24,0x4E
    0247 BB88      OUT	0x18,R24
(0027)  DDRB  = BIT(CSN)|BIT(MOSI)|BIT(SCK);
    0248 EB80      LDI	R24,0xB0
    0249 BB87      OUT	0x17,R24
(0028)  PORTC = 0x00; //m103 output only
    024A BA25      OUT	0x15,R2
(0029)  DDRC  = 0x00;
    024B BA24      OUT	0x14,R2
(0030)  PORTD = BIT(uPCLK);
    024C E280      LDI	R24,0x20
    024D BB82      OUT	0x12,R24
(0031)  DDRD  = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED)|0x07;
    024E ED8F      LDI	R24,0xDF
    024F BB81      OUT	0x11,R24
    0250 9508      RET
(0032) }
(0033) 
(0034) //TIMER0 initialize - prescale:1024
(0035) // WGM: Normal
(0036) // desired value: 20mSec
(0037) // actual value: 19.861mSec (0.7%)
(0038) void timer0_init(void)
(0039) {
(0040)  TCCR0 = 0x00; //stop
_timer0_init:
    0251 2422      CLR	R2
    0252 BE23      OUT	0x33,R2
(0041)  TCNT0 = 0x71; //set count
    0253 E781      LDI	R24,0x71
    0254 BF82      OUT	0x32,R24
(0042)  OCR0  = 0x8F;  //set compare
    0255 E88F      LDI	R24,0x8F
    0256 BF8C      OUT	0x3C,R24
(0043)  TCCR0 = 0x05; //start timer
    0257 E085      LDI	R24,5
    0258 BF83      OUT	0x33,R24
    0259 9508      RET
_timer0_ovf_isr:
    025A 922A      ST	R2,-Y
    025B 938A      ST	R24,-Y
    025C B62F      IN	R2,0x3F
    025D 922A      ST	R2,-Y
(0044) }
(0045) 
(0046) #pragma interrupt_handler timer0_ovf_isr:10
(0047) void timer0_ovf_isr(void)
(0048) {
(0049)  TCNT0 = 0x29; //reload counter value
    025E E289      LDI	R24,0x29
    025F BF82      OUT	0x32,R24
(0050)  
(0051)  if (--T0Cnt==0)
    0260 91800130  LDS	R24,T0Cnt
    0262 5081      SUBI	R24,1
    0263 2E28      MOV	R2,R24
    0264 92200130  STS	T0Cnt,R2
    0266 2388      TST	R24
    0267 F431      BNE	0x026E
(0052)    {T0Cnt=T0N;
    0268 E189      LDI	R24,0x19
    0269 93800130  STS	T0Cnt,R24
(0053)     bTimer=1;
    026B E081      LDI	R24,1
    026C 93800132  STS	bTimer,R24
(0054)     }
(0055) if (--RfCnt==0)
    026E 9180012F  LDS	R24,RfCnt
    0270 5081      SUBI	R24,1
    0271 2E28      MOV	R2,R24
    0272 9220012F  STS	RfCnt,R2
    0274 2388      TST	R24
    0275 F431      BNE	0x027C
(0056)    {RfCnt=RFTN;
    0276 E189      LDI	R24,0x19
    0277 9380012F  STS	RfCnt,R24
(0057)     bRfSend=1;
    0279 E081      LDI	R24,1
    027A 93800131  STS	bRfSend,R24
(0058)     }
    027C 9029      LD	R2,Y+
    027D BE2F      OUT	0x3F,R2
    027E 9189      LD	R24,Y+
    027F 9029      LD	R2,Y+
    0280 9518      RETI
(0059) }
(0060) 
(0061) 
(0062) 
(0063) //SPI initialize
(0064) void spi_init(void)
(0065) {uchar temp;
(0066) 
(0067)  SPCR = 0x51; //不使用SPI中断,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
_spi_init:
  temp                 --> R16
    0281 E581      LDI	R24,0x51
    0282 B98D      OUT	0x0D,R24
(0068)  SPSR = 0x00; //setup SPI
    0283 2422      CLR	R2
    0284 B82E      OUT	0x0E,R2
(0069)  
(0070)  temp = SPSR; //!!!
    0285 B10E      IN	R16,0x0E
(0071)  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
    0286 B10F      IN	R16,0x0F
    0287 9508      RET
(0072) }
(0073) 
(0074) 
(0075) 
(0076) 
(0077) //call this routine to initialize all peripherals
(0078) void init_devices(void)
(0079) {
(0080)  //stop errant interrupts until set up
(0081)  CLI(); //disable all interrupts
_init_devices:
    0288 94F8      BCLR	7
(0082)  port_init();
    0289 DFB8      RCALL	_port_init
(0083)  timer0_init();
    028A DFC6      RCALL	_timer0_init
(0084)  spi_init();
    028B DFF5      RCALL	_spi_init
(0085)  init_lcd();
    028C 940E0365  CALL	_init_lcd
(0086)  DISLCD();
    028E 9A91      SBI	0x12,1
(0087) 

⌨️ 快捷键说明

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