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

📄 master.lst

📁 这是用C编的nrf905的通讯程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    002C E5CF      LDI	R28,0x5F
    002D E0D4      LDI	R29,4
    002E BFCD      OUT	0x3D,R28
    002F BFDE      OUT	0x3E,R29
    0030 51C0      SUBI	R28,0x10
    0031 40D0      SBCI	R29,0
    0032 EA0A      LDI	R16,0xAA
    0033 8308      STD	Y+0,R16
    0034 2400      CLR	R0
    0035 E6E4      LDI	R30,0x64
    0036 E0F0      LDI	R31,0
    0037 E011      LDI	R17,1
    0038 33E2      CPI	R30,0x32
    0039 07F1      CPC	R31,R17
    003A F011      BEQ	0x003D
    003B 9201      ST	R0,Z+
    003C CFFB      RJMP	0x0038
    003D 8300      STD	Z+0,R16
    003E E5E4      LDI	R30,0x54
    003F E0F0      LDI	R31,0
    0040 E6A0      LDI	R26,0x60
    0041 E0B0      LDI	R27,0
    0042 E010      LDI	R17,0
    0043 35E8      CPI	R30,0x58
    0044 07F1      CPC	R31,R17
    0045 F021      BEQ	0x004A
    0046 95C8      LPM
    0047 9631      ADIW	R30,1
    0048 920D      ST	R0,X+
    0049 CFF9      RJMP	0x0043
    004A 940E0174  CALL	_main
_exit:
    004C CFFF      RJMP	_exit
FILE: C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
(0001) //master
(0002) 
(0003) //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) 
(0008) #include "config.h"
(0009) #include "nrf905.h"
(0010) 
(0011) #define MASTER  //编译控制是主机还是从机
(0012) 
(0013) 
(0014) 
(0015) #define T0N 25
(0016) void DelayUs(uint);
(0017) void DelayMs(uchar);
(0018) //32字节数据包发送时间 
(0019) //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
(0020) #define RFTN 25  //发送测试间隔 10*20ms
(0021) 
(0022) 
(0023) bit bTimer,bRfSend;
(0024) uchar T0Cnt,RfCnt;
(0025) 
(0026) void port_init(void)
(0027) {
(0028)  PORTA = 0x0F;
_port_init:
    004D E08F      LDI	R24,0xF
    004E BB8B      OUT	0x1B,R24
(0029)  DDRA  = 0xF0;
    004F EF80      LDI	R24,0xF0
    0050 BB8A      OUT	0x1A,R24
(0030)  PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
    0051 E48E      LDI	R24,0x4E
    0052 BB88      OUT	0x18,R24
(0031)  DDRB  = BIT(CSN)|BIT(MOSI)|BIT(SCK);
    0053 EB80      LDI	R24,0xB0
    0054 BB87      OUT	0x17,R24
(0032)  PORTC = 0x00;
    0055 2422      CLR	R2
    0056 BA25      OUT	0x15,R2
(0033)  DDRC  = 0x00;
    0057 BA24      OUT	0x14,R2
(0034)  PORTD = BIT(uPCLK)|BIT(2);
    0058 E284      LDI	R24,0x24
    0059 BB82      OUT	0x12,R24
(0035)  DDRD  = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED);
    005A ED88      LDI	R24,0xD8
    005B BB81      OUT	0x11,R24
    005C 9508      RET
(0036) }
(0037) 
(0038) 
(0039) //TIMER0 initialize - prescale:1024
(0040) // WGM: Normal
(0041) // desired value: 20mSec
(0042) // actual value: 19.861mSec (0.7%)
(0043) void timer0_init(void)
(0044) {
(0045)  TCCR0 = 0x00; //stop
_timer0_init:
    005D 2422      CLR	R2
    005E BE23      OUT	0x33,R2
(0046)  TCNT0 = 0x71; //set count
    005F E781      LDI	R24,0x71
    0060 BF82      OUT	0x32,R24
(0047)  OCR0  = 0x8F;  //set compare
    0061 E88F      LDI	R24,0x8F
    0062 BF8C      OUT	0x3C,R24
(0048)  TCCR0 = 0x05; //start timer
    0063 E085      LDI	R24,5
    0064 BF83      OUT	0x33,R24
    0065 9508      RET
_timer0_ovf_isr:
    0066 922A      ST	R2,-Y
    0067 938A      ST	R24,-Y
    0068 B62F      IN	R2,0x3F
    0069 922A      ST	R2,-Y
(0049) }
(0050) 
(0051) #pragma interrupt_handler timer0_ovf_isr:10
(0052) void timer0_ovf_isr(void)
(0053) {
(0054)  TCNT0 = 0x29; //reload counter value
    006A E289      LDI	R24,0x29
    006B BF82      OUT	0x32,R24
(0055)  
(0056)  if (--T0Cnt==0)
    006C 91800065  LDS	R24,T0Cnt
    006E 5081      SUBI	R24,1
    006F 2E28      MOV	R2,R24
    0070 92200065  STS	T0Cnt,R2
    0072 2388      TST	R24
    0073 F431      BNE	0x007A
(0057)    {T0Cnt=T0N;
    0074 E189      LDI	R24,0x19
    0075 93800065  STS	T0Cnt,R24
(0058)     bTimer=1;
    0077 E081      LDI	R24,1
    0078 93800067  STS	bTimer,R24
(0059)     }
(0060) if (--RfCnt==0)
    007A 91800064  LDS	R24,RfCnt
    007C 5081      SUBI	R24,1
    007D 2E28      MOV	R2,R24
    007E 92200064  STS	RfCnt,R2
    0080 2388      TST	R24
    0081 F431      BNE	0x0088
(0061)    {RfCnt=RFTN;
    0082 E189      LDI	R24,0x19
    0083 93800064  STS	RfCnt,R24
(0062)     bRfSend=1;
    0085 E081      LDI	R24,1
    0086 93800066  STS	bRfSend,R24
(0063)     }
    0088 9029      LD	R2,Y+
    0089 BE2F      OUT	0x3F,R2
    008A 9189      LD	R24,Y+
    008B 9029      LD	R2,Y+
    008C 9518      RETI
(0064) }
(0065) 
(0066) //SPI initialize
(0067) void spi_init(void)
(0068) {uchar temp;
(0069) 
(0070)  //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
(0071)  SPCR = 0x51; //不使用SPI中断,其它同上
_spi_init:
  temp                 --> R16
    008D E581      LDI	R24,0x51
    008E B98D      OUT	0x0D,R24
(0072)  SPSR = 0x00; //setup SPI
    008F 2422      CLR	R2
    0090 B82E      OUT	0x0E,R2
(0073)  
(0074)  temp = SPSR; //!!!
    0091 B10E      IN	R16,0x0E
(0075)  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
    0092 B10F      IN	R16,0x0F
    0093 9508      RET
(0076) }
(0077) 
(0078) 
(0079) //call this routine to initialize all peripherals
(0080) void init_devices(void)
(0081) {
(0082)  //stop errant interrupts until set up
(0083)  CLI(); //disable all interrupts
_init_devices:
    0094 94F8      BCLR	7
(0084)  port_init();
    0095 DFB7      RCALL	_port_init
(0085)  timer0_init();
    0096 DFC6      RCALL	_timer0_init
(0086)  
(0087)  spi_init();
    0097 DFF5      RCALL	_spi_init
(0088) 
(0089)  
(0090)  MCUCR = BIT(ISC01); //下降沿触发
    0098 E082      LDI	R24,2
    0099 BF85      OUT	0x35,R24
(0091)  GICR  = 0x00;
    009A 2422      CLR	R2
    009B BE2B      OUT	0x3B,R2
(0092)  TIMSK = 0x05; //timer interrupt sources
    009C E085      LDI	R24,5
    009D BF89      OUT	0x39,R24
(0093)  SEI(); //re-enable interrupts
    009E 9478      BSET	7
    009F 9508      RET
_RfRecvProc:
  i                    --> R20
    00A0 940E028C  CALL	push_gset1
(0094)  //all peripherals are now initialized
(0095) }
(0096) 
(0097) 
(0098) 
(0099) //接收处理
(0100) void RfRecvProc()
(0101) {uchar i;
(0102) 
(0103)    if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
    00A2 99B1      SBIC	0x16,1
    00A3 C001      RJMP	0x00A5
    00A4 C01D      RJMP	0x00C2
(0104)     
(0105)    if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
    00A5 99B3      SBIC	0x16,3
    00A6 C001      RJMP	0x00A8
    00A7 C01A      RJMP	0x00C2
(0106)    
(0107)    //已经接收到数据
(0108)    nrf905_ReadData();//读出...
    00A8 940E0267  CALL	_nrf905_ReadData
(0109)    for (i=0;i<SIZE;i++)
    00AA 2744      CLR	R20
    00AB C00D      RJMP	0x00B9
(0110)    { if (RxBuf[i]!=(i+i)) 
    00AC 2E24      MOV	R2,R20
    00AD 0E24      ADD	R2,R20
    00AE E689      LDI	R24,0x69
    00AF E090      LDI	R25,0
    00B0 2FE4      MOV	R30,R20
    00B1 27FF      CLR	R31
    00B2 0FE8      ADD	R30,R24
    00B3 1FF9      ADC	R31,R25
    00B4 8030      LDD	R3,Z+0
    00B5 1432      CP	R3,R2
    00B6 F009      BEQ	0x00B8
(0111)         return;
    00B7 C00A      RJMP	0x00C2
    00B8 9543      INC	R20
    00B9 3240      CPI	R20,0x20
    00BA F388      BCS	0x00AC
(0112)    }
(0113)    
(0114)    //数据接收正确...灯指示
(0115)    CPL(PORTD,LED);
    00BB E880      LDI	R24,0x80
    00BC E090      LDI	R25,0
    00BD B222      IN	R2,0x12
    00BE 2433      CLR	R3
    00BF 2628      EOR	R2,R24
    00C0 2639      EOR	R3,R25
    00C1 BA22      OUT	0x12,R2
    00C2 940E028F  CALL	pop_gset1
    00C4 9508      RET
_RfSendProc:
  i                    --> R20
    00C5 940E028C  CALL	push_gset1
(0116)    
(0117)    //从机回送数据包,这样双方都能指示是否收到有效数据包
(0118)    #ifndef MASTER
(0119)      //RfSendProc();
(0120)    #endif
(0121) }
(0122) 
(0123) //发送测试
(0124) void RfSendProc()
(0125) {uchar i;
(0126)    for (i=0;i<SIZE;i++) TxBuf[i]=key;
    00C7 2744      CLR	R20
    00C8 C00A      RJMP	0x00D3
    00C9 EC8D      LDI	R24,0xCD
    00CA E090      LDI	R25,0
    00CB 2FE4      MOV	R30,R20
    00CC 27FF      CLR	R31
    00CD 0FE8      ADD	R30,R24
    00CE 1FF9      ADC	R31,R25
    00CF 90200068  LDS	R2,key
    00D1 8220      STD	Z+0,R2
    00D2 9543      INC	R20
    00D3 3240      CPI	R20,0x20
    00D4 F3A0      BCS	0x00C9
(0127)    nrf905_SendData();//发送测试数据
    00D5 940E025D  CALL	_nrf905_SendData
(0128)    nrf905_RxOn();//重新回到接收状态
    00D7 940E01B2  CALL	_nrf905_RxOn
    00D9 940E028F  CALL	pop_gset1
    00DB 9508      RET
(0129) }
(0130) 
(0131) void TimerFunc()
(0132) {
(0133)    bTimer=0;
_TimerFunc:
    00DC 2422      CLR	R2
    00DD 92200067  STS	bTimer,R2
(0134)    //WDR();//clear WDT
(0135)    
(0136)    CPL(PORTD,LED);
    00DF E880      LDI	R24,0x80
    00E0 E090      LDI	R25,0
    00E1 B222      IN	R2,0x12
    00E2 2433      CLR	R3
    00E3 2628      EOR	R2,R24
    00E4 2639      EOR	R3,R25
    00E5 BA22      OUT	0x12,R2
    00E6 9508      RET
(0137)    //SPDR=66;
(0138) }
(0139) 
(0140) void SystemIni()
(0141) {
(0142)   T0Cnt=T0N;
_SystemIni:
    00E7 E189      LDI	R24,0x19
    00E8 93800065  STS	T0Cnt,R24
(0143)   RfCnt=RFTN;
    00EA 93800064  STS	RfCnt,R24
    00EC 9508      RET
_DelayMs:
  i                    --> R20
  ms                   --> R22
    00ED 940E028A  CALL	push_gset2
    00EF 2F60      MOV	R22,R16
(0144) }
(0145) 
(0146) void DelayMs(uchar ms)
(0147) {char i;
(0148) for (i=0;i<ms;i++)
    00F0 2744      CLR	R20
    00F1 C004      RJMP	0x00F6
(0149)   {DelayUs(1000);
    00F2 EE08      LDI	R16,0xE8
    00F3 E013      LDI	R17,3
    00F4 D006      RCALL	_DelayUs
    00F5 9543      INC	R20
    00F6 1746      CP	R20,R22
    00F7 F3D0      BCS	0x00F2
(0150)   }
(0151)   return;
    00F8 940E027E  CALL	pop_gset2
    00FA 9508      RET
_DelayUs:
  i                    --> R20
  us                   --> R16
    00FB 940E028C  CALL	push_gset1
(0152) }
(0153) 
(0154) void DelayUs(uint us)
(0155) {uint i;
(0156)   for (i=0;i<us;i++)
    00FD 2744      CLR	R20
    00FE 2755      CLR	R21
    00FF C008      RJMP	0x0108
(0157)   {NOP();NOP();NOP();NOP();NOP();NOP();
    0100 0000      NOP
    0101 0000      NOP
    0102 0000      NOP
    0103 0000      NOP
    0104 0000      NOP
    0105 0000      NOP
    0106 5F4F      SUBI	R20,0xFF
    0107 4F5F      SBCI	R21,0xFF
    0108 1740      CP	R20,R16
    0109 0751      CPC	R21,R17
    010A F3A8      BCS	0x0100
    010B 940E028F  CALL	pop_gset1
    010D 9508      RET
_int0_isr:
  i                    --> Y+1
  key_buf              --> R20
    010E 940E02A3  CALL	push_lset
    0110 940E028C  CALL	push_gset1
(0158)   }
(0159) }
(0160) 
(0161) 
(0162) 
(0163) 
(0164) ////////////////////////////key interrupt/////////////////////////////////
(0165) 
(0166) 
(0167) 
(0168) #pragma interrupt_handler int0_isr:iv_INT0
(0169) 
(0170) void int0_isr(void)
(0171) {
(0172) uchar key_buf=16,i;
    0112 E140      LDI	R20,0x10
(0173) GICR=0x00; //关闭中断使能
    0113 2422      CLR	R2
    0114 BE2B      OUT	0x3B,R2
(0174) DDRA=0xf0; //行列反转读取键盘的值
    0115 EF80      LDI	R24,0xF0

⌨️ 快捷键说明

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