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

📄 slave.lis

📁 这是用C编的nrf905的通讯程序
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module slave.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\slave.C
 0000                   .dbfunc e port_init _port_init fV
                        .even
 0000           _port_init::
 0000                   .dbline -1
 0000                   .dbline 23
 0000           ; //SLAVE
 0000           ; 
 0000           ; //最关键的是SPI的初始化,MSB首位和极性方式00,极性方式错误,数据则不正确
 0000           ; 
 0000           ; 
 0000           ; #include "config.h"
 0000           ; #include "nrf905.h"
 0000           ; 
 0000           ; #define MASTER  //编译控制是主机还是从机
 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           ; bit bTimer,bRfSend;
 0000           ; uchar T0Cnt,RfCnt;
 0000           ; 
 0000           ; void port_init(void)
 0000           ; {
 0000                   .dbline 24
 0000           ;  PORTA = 0x00;
 0000 2224              clr R2
 0002 2BBA              out 0x1b,R2
 0004                   .dbline 25
 0004           ;  DDRA  = 0xff;
 0004 8FEF              ldi R24,255
 0006 8ABB              out 0x1a,R24
 0008                   .dbline 26
 0008           ;  PORTB = BIT(AM)|BIT(CD)|BIT(DR)|BIT(MISO);
 0008 8EE4              ldi R24,78
 000A 88BB              out 0x18,R24
 000C                   .dbline 27
 000C           ;  DDRB  = BIT(CSN)|BIT(MOSI)|BIT(SCK);
 000C 80EB              ldi R24,176
 000E 87BB              out 0x17,R24
 0010                   .dbline 28
 0010           ;  PORTC = 0x00; //m103 output only
 0010 25BA              out 0x15,R2
 0012                   .dbline 29
 0012           ;  DDRC  = 0x00;
 0012 24BA              out 0x14,R2
 0014                   .dbline 30
 0014           ;  PORTD = BIT(uPCLK);
 0014 80E2              ldi R24,32
 0016 82BB              out 0x12,R24
 0018                   .dbline 31
 0018           ;  DDRD  = BIT(TRXCE)|BIT(TX_EN)|BIT(PWR)|BIT(LED)|0x07;
 0018 8FED              ldi R24,223
 001A 81BB              out 0x11,R24
 001C                   .dbline -2
 001C           L1:
 001C                   .dbline 0 ; func end
 001C 0895              ret
 001E                   .dbend
 001E                   .dbfunc e timer0_init _timer0_init fV
                        .even
 001E           _timer0_init::
 001E                   .dbline -1
 001E                   .dbline 39
 001E           ; }
 001E           ; 
 001E           ; //TIMER0 initialize - prescale:1024
 001E           ; // WGM: Normal
 001E           ; // desired value: 20mSec
 001E           ; // actual value: 19.861mSec (0.7%)
 001E           ; void timer0_init(void)
 001E           ; {
 001E                   .dbline 40
 001E           ;  TCCR0 = 0x00; //stop
 001E 2224              clr R2
 0020 23BE              out 0x33,R2
 0022                   .dbline 41
 0022           ;  TCNT0 = 0x71; //set count
 0022 81E7              ldi R24,113
 0024 82BF              out 0x32,R24
 0026                   .dbline 42
 0026           ;  OCR0  = 0x8F;  //set compare
 0026 8FE8              ldi R24,143
 0028 8CBF              out 0x3c,R24
 002A                   .dbline 43
 002A           ;  TCCR0 = 0x05; //start timer
 002A 85E0              ldi R24,5
 002C 83BF              out 0x33,R24
 002E                   .dbline -2
 002E           L2:
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbend
                        .area vector(rom, abs)
                        .org 36
 0024 0C941800          jmp _timer0_ovf_isr
                        .area text(rom, con, rel)
 0030                   .dbfile C:\DOCUME~1\charon\MYDOCU~1\AVR\NRF905\slave.C
 0030                   .dbfunc e timer0_ovf_isr _timer0_ovf_isr fV
                        .even
 0030           _timer0_ovf_isr::
 0030 2A92              st -y,R2
 0032 8A93              st -y,R24
 0034 2FB6              in R2,0x3f
 0036 2A92              st -y,R2
 0038                   .dbline -1
 0038                   .dbline 48
 0038           ; }
 0038           ; 
 0038           ; #pragma interrupt_handler timer0_ovf_isr:10
 0038           ; void timer0_ovf_isr(void)
 0038           ; {
 0038                   .dbline 49
 0038           ;  TCNT0 = 0x29; //reload counter value
 0038 89E2              ldi R24,41
 003A 82BF              out 0x32,R24
 003C                   .dbline 51
 003C           ;  
 003C           ;  if (--T0Cnt==0)
 003C 80910100          lds R24,_T0Cnt
 0040 8150              subi R24,1
 0042 282E              mov R2,R24
 0044 20920100          sts _T0Cnt,R2
 0048 8823              tst R24
 004A 31F4              brne L4
 004C                   .dbline 52
 004C           ;    {T0Cnt=T0N;
 004C                   .dbline 52
 004C 89E1              ldi R24,25
 004E 80930100          sts _T0Cnt,R24
 0052                   .dbline 53
 0052           ;     bTimer=1;
 0052 81E0              ldi R24,1
 0054 80930300          sts _bTimer,R24
 0058                   .dbline 54
 0058           ;     }
 0058           L4:
 0058                   .dbline 55
 0058 80910000          lds R24,_RfCnt
 005C 8150              subi R24,1
 005E 282E              mov R2,R24
 0060 20920000          sts _RfCnt,R2
 0064 8823              tst R24
 0066 31F4              brne L6
 0068                   .dbline 56
 0068                   .dbline 56
 0068 89E1              ldi R24,25
 006A 80930000          sts _RfCnt,R24
 006E                   .dbline 57
 006E 81E0              ldi R24,1
 0070 80930200          sts _bRfSend,R24
 0074                   .dbline 58
 0074           L6:
 0074                   .dbline -2
 0074           L3:
 0074 2990              ld R2,y+
 0076 2FBE              out 0x3f,R2
 0078 8991              ld R24,y+
 007A 2990              ld R2,y+
 007C                   .dbline 0 ; func end
 007C 1895              reti
 007E                   .dbend
 007E                   .dbfunc e spi_init _spi_init fV
 007E           ;           temp -> R16
                        .even
 007E           _spi_init::
 007E                   .dbline -1
 007E                   .dbline 65
 007E           ; if (--RfCnt==0)
 007E           ;    {RfCnt=RFTN;
 007E           ;     bRfSend=1;
 007E           ;     }
 007E           ; }
 007E           ; 
 007E           ; 
 007E           ; 
 007E           ; //SPI initialize
 007E           ; void spi_init(void)
 007E           ; {uchar temp;
 007E                   .dbline 67
 007E           ; 
 007E           ;  SPCR = 0x51; //不使用SPI中断,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
 007E 81E5              ldi R24,81
 0080 8DB9              out 0xd,R24
 0082                   .dbline 68
 0082           ;  SPSR = 0x00; //setup SPI
 0082 2224              clr R2
 0084 2EB8              out 0xe,R2
 0086                   .dbline 70
 0086           ;  
 0086           ;  temp = SPSR; //!!!
 0086 0EB1              in R16,0xe
 0088                   .dbline 71
 0088           ;  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
 0088 0FB1              in R16,0xf
 008A                   .dbline -2
 008A           L8:
 008A                   .dbline 0 ; func end
 008A 0895              ret
 008C                   .dbsym r temp 16 c
 008C                   .dbend
 008C                   .dbfunc e init_devices _init_devices fV
                        .even
 008C           _init_devices::
 008C                   .dbline -1
 008C                   .dbline 79
 008C           ; }
 008C           ; 
 008C           ; 
 008C           ; 
 008C           ; 
 008C           ; //call this routine to initialize all peripherals
 008C           ; void init_devices(void)
 008C           ; {
 008C                   .dbline 81
 008C           ;  //stop errant interrupts until set up
 008C           ;  CLI(); //disable all interrupts
 008C F894              cli
 008E                   .dbline 82
 008E           ;  port_init();
 008E B8DF              xcall _port_init
 0090                   .dbline 83
 0090           ;  timer0_init();
 0090 C6DF              xcall _timer0_init
 0092                   .dbline 84
 0092           ;  spi_init();
 0092 F5DF              xcall _spi_init
 0094                   .dbline 85
 0094           ;  init_lcd();
 0094 0E940000          xcall _init_lcd
 0098                   .dbline 86
 0098           ;  DISLCD();
 0098 919A              sbi 0x12,1
 009A                   .dbline 88
 009A           ; 
 009A           ;  MCUCR = 0x00; //下降沿触发
 009A 2224              clr R2
 009C 25BE              out 0x35,R2
 009E                   .dbline 89
 009E           ;  GICR  = 0x00;
 009E 2BBE              out 0x3b,R2
 00A0                   .dbline 90
 00A0           ;  TIMSK = 0x05; //timer interrupt sources
 00A0 85E0              ldi R24,5
 00A2 89BF              out 0x39,R24
 00A4                   .dbline 91
 00A4           ;  SEI(); //re-enable interrupts
 00A4 7894              sei
 00A6                   .dbline -2
 00A6           L9:
 00A6                   .dbline 0 ; func end
 00A6 0895              ret
 00A8                   .dbend
 00A8                   .dbfunc e RfRecvProc _RfRecvProc fV
 00A8           ;              i -> R20
                        .even
 00A8           _RfRecvProc::
 00A8 0E940000          xcall push_gset1
 00AC                   .dbline -1
 00AC                   .dbline 100
 00AC           ;  //all peripherals are now initialized
 00AC           ; }
 00AC           ; 
 00AC           ; 
 00AC           ; 
 00AC           ; 
 00AC           ; //接收处理
 00AC           ; void RfRecvProc()
 00AC           ; {uchar i;
 00AC                   .dbline 102
 00AC           ; 
 00AC           ;    if ((PINB&(1<<AM))==0) return;//一般先AM=1指示地址匹配对
 00AC B199              sbic 0x16,1
 00AE 01C0              rjmp L11
 00B0                   .dbline 102
 00B0 1EC0              xjmp L10
 00B2           L11:
 00B2                   .dbline 104
 00B2           ;     
 00B2           ;    if ((PINB&(1<<DR))==0) return;//DR=1时表示数据接收对而且Crc正确
 00B2 B399              sbic 0x16,3
 00B4 01C0              rjmp L13
 00B6                   .dbline 104
 00B6 1BC0              xjmp L10
 00B8           L13:
 00B8                   .dbline 108
 00B8           ;    
 00B8           ;    
 00B8           ;    //已经接收到数据
 00B8           ;    nrf905_ReadData();//读出...
 00B8 0E940000          xcall _nrf905_ReadData
 00BC                   .dbline 112
 00BC           ;   
 00BC           ;  
 00BC           ;    //数据接收正确...灯指示
 00BC           ;    CPL(PORTD,LED);
 00BC 80E8              ldi R24,128
 00BE 90E0              ldi R25,0
 00C0 22B2              in R2,0x12
 00C2 3324              clr R3
 00C4 2826              eor R2,R24
 00C6 3926              eor R3,R25
 00C8 22BA              out 0x12,R2
 00CA                   .dbline 113
 00CA 4427              clr R20
 00CC 0AC0              xjmp L18
 00CE           L15:
 00CE                   .dbline 113
 00CE                   .dbline 113
 00CE 80E0              ldi R24,<_RxBuf
 00D0 90E0              ldi R25,>_RxBuf
 00D2 E42F              mov R30,R20
 00D4 FF27              clr R31
 00D6 E80F              add R30,R24
 00D8 F91F              adc R31,R25
 00DA 0081              ldd R16,z+0
 00DC 0E940000          xcall _seg
 00E0                   .dbline 113
 00E0           L16:
 00E0                   .dbline 113
 00E0 4395              inc R20
 00E2           L18:
 00E2                   .dbline 113
 00E2           ;    for (i=0;i<SIZE;i++){seg(RxBuf[i]);}
 00E2 4032              cpi R20,32
 00E4 A0F3              brlo L15
 00E6                   .dbline 114
 00E6           ;    LCD(RxBuf[0]);
 00E6 00910000          lds R16,_RxBuf
 00EA 0E940000          xcall _LCD
 00EE                   .dbline -2
 00EE           L10:
 00EE 0E940000          xcall pop_gset1
 00F2                   .dbline 0 ; func end
 00F2 0895              ret
 00F4                   .dbsym r i 20 c

⌨️ 快捷键说明

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