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

📄 master.lis

📁 这是用C编的nrf905的通讯程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module master.C
                        .area data(ram, con, rel)
 0000           _X:
 0000                   .blkb 1
                        .area idata
 0000 0A                .byte 10
                        .area data(ram, con, rel)
 0001                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
 0001                   .dbsym s X _X c
 0001           _Y:
 0001                   .blkb 1
                        .area idata
 0001 02                .byte 2
                        .area data(ram, con, rel)
 0002                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
 0002                   .dbsym s Y _Y c
                        .area text(rom, con, rel)
 0000                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905/config.h
 0000                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 27
 0000           ; //master
 0000           ; 
 0000           ; //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
 0000           ; 
 0000           ; #include <iom16v.h>
 0000           ; #include <macros.h>
 0000           ; 
 0000           ; #include "config.h"
 0000           ; #include "nrf905.h"
 0000           ; 
 0000           ; #define MASTER  //编译控制是主机还是从机
 0000           ; 
 0000           ; 
 0000           ; 
 0000           ; #define T0N 25
 0000           ; void DelayUs(uint);
 0000           ; void DelayMs(uchar);
 0000           ; //32字节数据包发送时间 
 0000           ; //=650us_StartUp+200us_Preamble+(4+32+2)Byts*8Bit/50000bps*1000000us=6.6ms
 0000           ; #define RFTN 25  //发送测试间隔 10*20ms
 0000           ; 
 0000           ; 
 0000           ; bit bTimer,bRfSend;
 0000           ; uchar T0Cnt,RfCnt;
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 28
 0000           ;  PORTA = 0x0F;
 0000 8FE0              ldi R24,15
 0002 8BBB              out 0x1b,R24
 0004                   .dbline 29
 0004           ;  DDRA  = 0xF0;
 0004 80EF              ldi R24,240
 0006 8ABB              out 0x1a,R24
 0008                   .dbline 30
 0008           ;  PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
 0008 8EE4              ldi R24,78
 000A 88BB              out 0x18,R24
 000C                   .dbline 31
 000C           ;  DDRB  = BIT(CSN)|BIT(MOSI)|BIT(SCK);
 000C 80EB              ldi R24,176
 000E 87BB              out 0x17,R24
 0010                   .dbline 32
 0010           ;  PORTC = 0x00;
 0010 2224              clr R2
 0012 25BA              out 0x15,R2
 0014                   .dbline 33
 0014           ;  DDRC  = 0x00;
 0014 24BA              out 0x14,R2
 0016                   .dbline 34
 0016           ;  PORTD = BIT(uPCLK)|BIT(2);
 0016 84E2              ldi R24,36
 0018 82BB              out 0x12,R24
 001A                   .dbline 35
 001A           ;  DDRD  = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED);
 001A 88ED              ldi R24,216
 001C 81BB              out 0x11,R24
 001E                   .dbline -2
 001E           L1:
 001E                   .dbline 0 ; func end
 001E 0895              ret
 0020                   .dbend
 0020                   .dbfunc e timer0_init _timer0_init fV
                        .even
 0020           _timer0_init::
 0020                   .dbline -1
 0020                   .dbline 44
 0020           ; }
 0020           ; 
 0020           ; 
 0020           ; //TIMER0 initialize - prescale:1024
 0020           ; // WGM: Normal
 0020           ; // desired value: 20mSec
 0020           ; // actual value: 19.861mSec (0.7%)
 0020           ; void timer0_init(void)
 0020           ; {
 0020                   .dbline 45
 0020           ;  TCCR0 = 0x00; //stop
 0020 2224              clr R2
 0022 23BE              out 0x33,R2
 0024                   .dbline 46
 0024           ;  TCNT0 = 0x71; //set count
 0024 81E7              ldi R24,113
 0026 82BF              out 0x32,R24
 0028                   .dbline 47
 0028           ;  OCR0  = 0x8F;  //set compare
 0028 8FE8              ldi R24,143
 002A 8CBF              out 0x3c,R24
 002C                   .dbline 48
 002C           ;  TCCR0 = 0x05; //start timer
 002C 85E0              ldi R24,5
 002E 83BF              out 0x33,R24
 0030                   .dbline -2
 0030           L2:
 0030                   .dbline 0 ; func end
 0030 0895              ret
 0032                   .dbend
                        .area vector(rom, abs)
                        .org 36
 0024 0C941900          jmp _timer0_ovf_isr
                        .area text(rom, con, rel)
 0032                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\master.C
 0032                   .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
                        .even
 0032           _timer0_ovf_isr::
 0032 2A92              st -y,R2
 0034 8A93              st -y,R24
 0036 2FB6              in R2,0x3f
 0038 2A92              st -y,R2
 003A                   .dbline -1
 003A                   .dbline 53
 003A           ; }
 003A           ; 
 003A           ; #pragma interrupt_handler timer0_ovf_isr:10
 003A           ; void timer0_ovf_isr(void)
 003A           ; {
 003A                   .dbline 54
 003A           ;  TCNT0 = 0x29; //reload counter value
 003A 89E2              ldi R24,41
 003C 82BF              out 0x32,R24
 003E                   .dbline 56
 003E           ;  
 003E           ;  if (--T0Cnt==0)
 003E 80910100          lds R24,_T0Cnt
 0042 8150              subi R24,1
 0044 282E              mov R2,R24
 0046 20920100          sts _T0Cnt,R2
 004A 8823              tst R24
 004C 31F4              brne L4
 004E                   .dbline 57
 004E           ;    {T0Cnt=T0N;
 004E                   .dbline 57
 004E 89E1              ldi R24,25
 0050 80930100          sts _T0Cnt,R24
 0054                   .dbline 58
 0054           ;     bTimer=1;
 0054 81E0              ldi R24,1
 0056 80930300          sts _bTimer,R24
 005A                   .dbline 59
 005A           ;     }
 005A           L4:
 005A                   .dbline 60
 005A 80910000          lds R24,_RfCnt
 005E 8150              subi R24,1
 0060 282E              mov R2,R24
 0062 20920000          sts _RfCnt,R2
 0066 8823              tst R24
 0068 31F4              brne L6
 006A                   .dbline 61
 006A                   .dbline 61
 006A 89E1              ldi R24,25
 006C 80930000          sts _RfCnt,R24
 0070                   .dbline 62
 0070 81E0              ldi R24,1
 0072 80930200          sts _bRfSend,R24
 0076                   .dbline 63
 0076           L6:
 0076                   .dbline -2
 0076           L3:
 0076 2990              ld R2,y+
 0078 2FBE              out 0x3f,R2
 007A 8991              ld R24,y+
 007C 2990              ld R2,y+
 007E                   .dbline 0 ; func end
 007E 1895              reti
 0080                   .dbend
 0080                   .dbfunc e spi_init _spi_init fV
 0080           ;           temp -> R16
                        .even
 0080           _spi_init::
 0080                   .dbline -1
 0080                   .dbline 68
 0080           ; if (--RfCnt==0)
 0080           ;    {RfCnt=RFTN;
 0080           ;     bRfSend=1;
 0080           ;     }
 0080           ; }
 0080           ; 
 0080           ; //SPI initialize
 0080           ; void spi_init(void)
 0080           ; {uchar temp;
 0080                   .dbline 71
 0080           ; 
 0080           ;  //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
 0080           ;  SPCR = 0x51; //不使用SPI中断,其它同上
 0080 81E5              ldi R24,81
 0082 8DB9              out 0xd,R24
 0084                   .dbline 72
 0084           ;  SPSR = 0x00; //setup SPI
 0084 2224              clr R2
 0086 2EB8              out 0xe,R2
 0088                   .dbline 74
 0088           ;  
 0088           ;  temp = SPSR; //!!!
 0088 0EB1              in R16,0xe
 008A                   .dbline 75
 008A           ;  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
 008A 0FB1              in R16,0xf
 008C                   .dbline -2
 008C           L8:
 008C                   .dbline 0 ; func end
 008C 0895              ret
 008E                   .dbsym r temp 16 c
 008E                   .dbend
 008E                   .dbfunc e init_devices _init_devices fV
                        .even
 008E           _init_devices::
 008E                   .dbline -1
 008E                   .dbline 81
 008E           ; }
 008E           ; 
 008E           ; 
 008E           ; //call this routine to initialize all peripherals
 008E           ; void init_devices(void)
 008E           ; {
 008E                   .dbline 83
 008E           ;  //stop errant interrupts until set up
 008E           ;  CLI(); //disable all interrupts
 008E F894              cli
 0090                   .dbline 84
 0090           ;  port_init();
 0090 B7DF              xcall _port_init
 0092                   .dbline 85
 0092           ;  timer0_init();
 0092 C6DF              xcall _timer0_init
 0094                   .dbline 87
 0094           ;  
 0094           ;  spi_init();
 0094 F5DF              xcall _spi_init
 0096                   .dbline 90
 0096           ; 
 0096           ;  
 0096           ;  MCUCR = BIT(ISC01); //下降沿触发
 0096 82E0              ldi R24,2
 0098 85BF              out 0x35,R24
 009A                   .dbline 91
 009A           ;  GICR  = 0x00;
 009A 2224              clr R2
 009C 2BBE              out 0x3b,R2
 009E                   .dbline 92
 009E           ;  TIMSK = 0x05; //timer interrupt sources
 009E 85E0              ldi R24,5
 00A0 89BF              out 0x39,R24
 00A2                   .dbline 93
 00A2           ;  SEI(); //re-enable interrupts
 00A2 7894              sei
 00A4                   .dbline -2
 00A4           L9:
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbend
 00A6                   .dbfunc e RfRecvProc _RfRecvProc fV
 00A6           ;              i -> R20
                        .even
 00A6           _RfRecvProc::
 00A6 0E940000          xcall push_gset1
 00AA                   .dbline -1
 00AA                   .dbline 101
 00AA           ;  //all peripherals are now initialized
 00AA           ; }
 00AA           ; 
 00AA           ; 
 00AA           ; 
 00AA           ; //接收处理
 00AA           ; void RfRecvProc()
 00AA           ; {uchar i;
 00AA                   .dbline 103
 00AA           ; 
 00AA           ;    if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
 00AA B199              sbic 0x16,1
 00AC 01C0              rjmp L11
 00AE                   .dbline 103
 00AE 1DC0              xjmp L10
 00B0           L11:
 00B0                   .dbline 105
 00B0           ;     
 00B0           ;    if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
 00B0 B399              sbic 0x16,3
 00B2 01C0              rjmp L13
 00B4                   .dbline 105
 00B4 1AC0              xjmp L10
 00B6           L13:
 00B6                   .dbline 108
 00B6           ;    
 00B6           ;    //已经接收到数据
 00B6           ;    nrf905_ReadData();//读出...
 00B6 0E940000          xcall _nrf905_ReadData
 00BA                   .dbline 109
 00BA           ;    for (i=0;i<SIZE;i++)
 00BA 4427              clr R20
 00BC 0DC0              xjmp L18
 00BE           L15:
 00BE                   .dbline 110
 00BE           ;    { if (RxBuf[i]!=(i+i)) 
 00BE                   .dbline 110
 00BE 242E              mov R2,R20
 00C0 240E              add R2,R20
 00C2 80E0              ldi R24,<_RxBuf
 00C4 90E0              ldi R25,>_RxBuf
 00C6 E42F              mov R30,R20
 00C8 FF27              clr R31
 00CA E80F              add R30,R24
 00CC F91F              adc R31,R25
 00CE 3080              ldd R3,z+0
 00D0 3214              cp R3,R2
 00D2 09F0              breq L19
 00D4                   .dbline 111
 00D4           ;         return;
 00D4 0AC0              xjmp L10
 00D6           L19:
 00D6                   .dbline 112
 00D6           L16:
 00D6                   .dbline 109
 00D6 4395              inc R20
 00D8           L18:
 00D8                   .dbline 109
 00D8 4032              cpi R20,32
 00DA 88F3              brlo L15
 00DC                   .dbline 115
 00DC           ;    }
 00DC           ;    
 00DC           ;    //数据接收正确...灯指示
 00DC           ;    CPL(PORTD,LED);
 00DC 80E8              ldi R24,128
 00DE 90E0              ldi R25,0
 00E0 22B2              in R2,0x12
 00E2 3324              clr R3
 00E4 2826              eor R2,R24
 00E6 3926              eor R3,R25
 00E8 22BA              out 0x12,R2
 00EA                   .dbline -2
 00EA           L10:
 00EA 0E940000          xcall pop_gset1
 00EE                   .dbline 0 ; func end
 00EE 0895              ret
 00F0                   .dbsym r i 20 c
 00F0                   .dbend
 00F0                   .dbfunc e RfSendProc _RfSendProc fV
 00F0           ;              i -> R20
                        .even
 00F0           _RfSendProc::
 00F0 0E940000          xcall push_gset1
 00F4                   .dbline -1
 00F4                   .dbline 125
 00F4           ;    
 00F4           ;    //从机回送数据包,这样双方都能指示是否收到有效数据包
 00F4           ;    #ifndef MASTER
 00F4           ;      //RfSendProc();
 00F4           ;    #endif
 00F4           ; }
 00F4           ; 
 00F4           ; //发送测试
 00F4           ; void RfSendProc()
 00F4           ; {uchar i;
 00F4                   .dbline 126
 00F4 4427              clr R20
 00F6 0AC0              xjmp L25
 00F8           L22:
 00F8                   .dbline 126
 00F8 80E0              ldi R24,<_TxBuf
 00FA 90E0              ldi R25,>_TxBuf
 00FC E42F              mov R30,R20
 00FE FF27              clr R31
 0100 E80F              add R30,R24
 0102 F91F              adc R31,R25
 0104 20900400          lds R2,_key
 0108 2082              std z+0,R2
 010A           L23:
 010A                   .dbline 126
 010A 4395              inc R20
 010C           L25:
 010C                   .dbline 126
 010C           ;    for (i=0;i<SIZE;i++) TxBuf[i]=key;
 010C 4032              cpi R20,32
 010E A0F3              brlo L22
 0110                   .dbline 127
 0110           ;    nrf905_SendData();//发送测试数据
 0110 0E940000          xcall _nrf905_SendData
 0114                   .dbline 128
 0114           ;    nrf905_RxOn();//重新回到接收状态
 0114 0E940000          xcall _nrf905_RxOn
 0118                   .dbline -2
 0118           L21:
 0118 0E940000          xcall pop_gset1
 011C                   .dbline 0 ; func end
 011C 0895              ret
 011E                   .dbsym r i 20 c
 011E                   .dbend
 011E                   .dbfunc e TimerFunc _TimerFunc fV
                        .even
 011E           _TimerFunc::
 011E                   .dbline -1
 011E                   .dbline 132
 011E           ; }
 011E           ; 
 011E           ; void TimerFunc()
 011E           ; {

⌨️ 快捷键说明

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