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

📄 ptr8000.lst

📁 本代码实现了两块无线收发模块prt8000(核心芯片nrf905)的通信功能
💻 LST
📖 第 1 页 / 共 3 页
字号:
(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 + -