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