📄 ptr8000.lst
字号:
(0198) {uchar i;
(0199) CLR(PORTB,CSN);
9F 98C4 CBI 0x18,4
(0200) nrf905_SpiRW(RC); //读配置
A0 E100 LDI R16,0x10
A1 DFD7 RCALL _nrf905_SpiRW
(0201) for (i=0;i<10;i++)
A2 2744 CLR R20
A3 C00A RJMP 0x00AE
(0202) {
(0203) RxBuf[i]= nrf905_SpiRW(0);//read from nrf905
A4 2700 CLR R16
A5 DFD3 RCALL _nrf905_SpiRW
A6 E680 LDI R24,0x60
A7 E090 LDI R25,0
A8 2FE4 MOV R30,R20
A9 27FF CLR R31
AA 0FE8 ADD R30,R24
AB 1FF9 ADC R31,R25
AC 8300 STD Z+0,R16
AD 9543 INC R20
AE 304A CPI R20,0xA
AF F3A0 BCS 0x00A4
(0204) }
(0205) SET(PORTB,CSN);
B0 9AC4 SBI 0x18,4
B1 9149 LD R20,Y+
B2 9508 RET
(0206) }
(0207)
(0208) //写Tx地址
(0209) void nrf905_SetTxAddr()
(0210) {
(0211) CLR(PORTB,CSN);
_nrf905_SetTxAddr:
B3 98C4 CBI 0x18,4
(0212) nrf905_SpiRW(WTA); //写Tx地址
B4 E202 LDI R16,0x22
B5 DFC3 RCALL _nrf905_SpiRW
(0213) nrf905_SpiRW(TX_ADDRESS_0);
B6 E102 LDI R16,0x12
B7 DFC1 RCALL _nrf905_SpiRW
(0214) nrf905_SpiRW(TX_ADDRESS_1);
B8 E304 LDI R16,0x34
B9 DFBF RCALL _nrf905_SpiRW
(0215) nrf905_SpiRW(TX_ADDRESS_2);
BA E506 LDI R16,0x56
BB DFBD RCALL _nrf905_SpiRW
(0216) nrf905_SpiRW(TX_ADDRESS_3);
BC E708 LDI R16,0x78
BD DFBB RCALL _nrf905_SpiRW
(0217) SET(PORTB,CSN);
BE 9AC4 SBI 0x18,4
BF 9508 RET
_nrf905_SetData:
i --> R20
C0 934A ST R20,-Y
(0218) }
(0219)
(0220) //写Tx数据
(0221) void nrf905_SetData()
(0222) {uchar i;
(0223)
(0224) CLR(PORTB,CSN);
C1 98C4 CBI 0x18,4
(0225) nrf905_SpiRW(WTP); //写TxPayload
C2 E200 LDI R16,0x20
C3 DFB5 RCALL _nrf905_SpiRW
(0226) for (i=0;i<SIZE;i++)
C4 2744 CLR R20
C5 C009 RJMP 0x00CF
(0227) {
(0228) nrf905_SpiRW(TxBuf[i]);
C6 E880 LDI R24,0x80
C7 E090 LDI R25,0
C8 2FE4 MOV R30,R20
C9 27FF CLR R31
CA 0FE8 ADD R30,R24
CB 1FF9 ADC R31,R25
CC 8100 LDD R16,Z+0
CD DFAB RCALL _nrf905_SpiRW
CE 9543 INC R20
CF 3240 CPI R20,0x20
D0 F3A8 BCS 0x00C6
(0229) }
(0230)
(0231) SET(PORTB,CSN);
D1 9AC4 SBI 0x18,4
D2 9149 LD R20,Y+
D3 9508 RET
(0232) }
(0233)
(0234) //等待发送结束
(0235) void nrf905_WaitSended()
(0236) {
(0237) while ((PIND&(1<<DR))==0);
_nrf905_WaitSended:
D4 9B84 SBIS 0x10,4
D5 CFFE RJMP _nrf905_WaitSended
D6 9508 RET
(0238) }
(0239)
(0240) //发送TxBuf中的数据
(0241) void nrf905_SendData()
(0242) {
(0243) nrf905_TxOn();//切换到发送模式
_nrf905_SendData:
D7 DFAF RCALL _nrf905_TxOn
(0244) nrf905_SetTxAddr();//写发送地址
D8 DFDA RCALL _nrf905_SetTxAddr
(0245) nrf905_SetData();//写数据
D9 DFE6 RCALL _nrf905_SetData
(0246) nrf905_TxSend();//启动发送
DA DFB0 RCALL _nrf905_TxSend
(0247) nrf905_WaitSended();//等待发送结束
DB DFF8 RCALL _nrf905_WaitSended
DC 9508 RET
(0248)
(0249) }
(0250)
(0251) //测试直接重新发送上次写入的数据
(0252) void nrf905_SendAgain()
(0253) {
(0254) nrf905_TxOn();
_nrf905_SendAgain:
DD DFA9 RCALL _nrf905_TxOn
(0255) nrf905_TxSend();
DE DFAC RCALL _nrf905_TxSend
(0256) nrf905_WaitSended();
DF DFF4 RCALL _nrf905_WaitSended
E0 9508 RET
_nrf905_ReadData:
i --> R20
E1 934A ST R20,-Y
(0257)
(0258) }
(0259)
(0260) //读出接收到的数据
(0261) void nrf905_ReadData()
(0262) {
(0263) uchar i;
(0264)
(0265) CLR(PORTB,CSN);
E2 98C4 CBI 0x18,4
(0266) nrf905_SpiRW(RRP); //读RxPayload
E3 E204 LDI R16,0x24
E4 DF94 RCALL _nrf905_SpiRW
(0267) for (i=0;i<SIZE;i++)
E5 2744 CLR R20
E6 C00A RJMP 0x00F1
(0268) {
(0269) RxBuf[i]=nrf905_SpiRW(0);//read...
E7 2700 CLR R16
E8 DF90 RCALL _nrf905_SpiRW
E9 E680 LDI R24,0x60
EA E090 LDI R25,0
EB 2FE4 MOV R30,R20
EC 27FF CLR R31
ED 0FE8 ADD R30,R24
EE 1FF9 ADC R31,R25
EF 8300 STD Z+0,R16
F0 9543 INC R20
F1 3240 CPI R20,0x20
F2 F3A0 BCS 0x00E7
(0270) }
(0271)
(0272) SET(PORTB,CSN);
F3 9AC4 SBI 0x18,4
F4 9149 LD R20,Y+
F5 9508 RET
FILE: E:\无线通信\nRF905\ptr8000\PTR8000.C
(0001) //ICC-AVR application builder : 2006-4-4 11:28:26
(0002) // Target : M16 PTR8000模块简单测试
(0003) // Crystal: 11.059Mhz
(0004)
(0005) //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
(0006)
(0007) #include <iom16v.h>
(0008) #include <macros.h>
(0009)
(0010) #include "config.h"
(0011) #include "nrf905.h"
(0012)
(0013) #define MASTER //编译控制是主机还是从机
(0014)
(0015) #define T0N 25
(0016)
(0017) //32字节数据包发送时间
(0018) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0019) #define RFTN 10 //发送测试间隔 10*20ms
(0020)
(0021) bit bTimer,bRfSend;
(0022) uchar T0Cnt,RfCnt;
(0023)
(0024) void port_init(void)
(0025) {
(0026) PORTA = 0x08;
_port_init:
F6 E088 LDI R24,0x8
F7 BB8B OUT 0x1B,R24
(0027) DDRA = 0x37;
F8 E387 LDI R24,0x37
F9 BB8A OUT 0x1A,R24
(0028) PORTB = 0x50;
FA E580 LDI R24,0x50
FB BB88 OUT 0x18,R24
(0029) DDRB = 0xBF;
FC EB8F LDI R24,0xBF
FD BB87 OUT 0x17,R24
(0030) PORTC = 0x00; //m103 output only
FE 2422 CLR R2
FF BA25 OUT 0x15,R2
(0031) DDRC = 0x00;
100 BA24 OUT 0x14,R2
(0032) PORTD = 0x1C;
101 E18C LDI R24,0x1C
102 BB82 OUT 0x12,R24
(0033) DDRD = 0x80;
103 E880 LDI R24,0x80
104 BB81 OUT 0x11,R24
105 9508 RET
(0034) }
(0035)
(0036) //TIMER0 initialize - prescale:1024
(0037) // WGM: Normal
(0038) // desired value: 20mSec
(0039) // actual value: 19.908mSec (0.5%)
(0040) void timer0_init(void)
(0041) {
(0042) TCCR0 = 0x00; //stop
_timer0_init:
106 2422 CLR R2
107 BE23 OUT 0x33,R2
(0043) TCNT0 = 0x29; //set count
108 E289 LDI R24,0x29
109 BF82 OUT 0x32,R24
(0044) OCR0 = 0xD7; //set compare
10A ED87 LDI R24,0xD7
10B BF8C OUT 0x3C,R24
(0045) TCCR0 = 0x05; //start timer
10C E085 LDI R24,5
10D BF83 OUT 0x33,R24
10E 9508 RET
_timer0_ovf_isr:
10F 922A ST R2,-Y
110 938A ST R24,-Y
111 B62F IN R2,0x3F
112 922A ST R2,-Y
(0046) }
(0047)
(0048) #pragma interrupt_handler timer0_ovf_isr:10
(0049) void timer0_ovf_isr(void)
(0050) {
(0051) TCNT0 = 0x29; //reload counter value
113 E289 LDI R24,0x29
114 BF82 OUT 0x32,R24
(0052)
(0053) if (--T0Cnt==0)
115 9180 00A1 LDS R24,T0Cnt
117 5081 SUBI R24,1
118 2E28 MOV R2,R24
119 9220 00A1 STS T0Cnt,R2
11B 2388 TST R24
11C F431 BNE 0x0123
(0054) {T0Cnt=T0N;
11D E189 LDI R24,0x19
11E 9380 00A1 STS T0Cnt,R24
(0055) bTimer=1;
120 E081 LDI R24,1
121 9380 00A3 STS bTimer,R24
(0056) }
(0057) if (--RfCnt==0)
123 9180 00A0 LDS R24,RfCnt
125 5081 SUBI R24,1
126 2E28 MOV R2,R24
127 9220 00A0 STS RfCnt,R2
129 2388 TST R24
12A F431 BNE 0x0131
(0058) {RfCnt=RFTN;
12B E08A LDI R24,0xA
12C 9380 00A0 STS RfCnt,R24
(0059) bRfSend=1;
12E E081 LDI R24,1
12F 9380 00A2 STS bRfSend,R24
(0060) }
131 9029 LD R2,Y+
132 BE2F OUT 0x3F,R2
133 9189 LD R24,Y+
134 9029 LD R2,Y+
135 9518 RETI
(0061) }
(0062)
(0063) //TIMER1 initialize - prescale:8
(0064) // WGM: 0) Normal, TOP=0xFFFF
(0065) // desired value: 10mSec
(0066) // actual value: 9.999mSec (0.0%)
(0067) void timer1_init(void)
(0068) {
(0069) TCCR1B = 0x00; //stop
_timer1_init:
136 2422 CLR R2
137 BC2E OUT 0x2E,R2
(0070) TCNT1H = 0xCA; //setup
138 EC8A LDI R24,0xCA
139 BD8D OUT 0x2D,R24
(0071) TCNT1L = 0x01;
13A E081 LDI R24,1
13B BD8C OUT 0x2C,R24
(0072) OCR1AH = 0x35;
13C E385 LDI R24,0x35
13D BD8B OUT 0x2B,R24
(0073) OCR1AL = 0xFF;
13E EF8F LDI R24,0xFF
13F BD8A OUT 0x2A,R24
(0074) OCR1BH = 0x35;
140 E385 LDI R24,0x35
141 BD89 OUT 0x29,R24
(0075) OCR1BL = 0xFF;
142 EF8F LDI R24,0xFF
143 BD88 OUT 0x28,R24
(0076) ICR1H = 0x35;
144 E385 LDI R24,0x35
145 BD87 OUT 0x27,R24
(0077) ICR1L = 0xFF;
146 EF8F LDI R24,0xFF
147 BD86 OUT 0x26,R24
(0078) TCCR1A = 0x00;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -