📄 nrf.lis
字号:
.module nrf.c
.area text(rom, con, rel)
0000 .dbfile E:\心电监护系统\测试程序\第一阶段\无线测试\接收端\nrf.c
0000 .dbfunc e init_905 _init_905 fV
.even
0000 _init_905::
0000 .dbline -1
0000 .dbline 35
0000 ; /***************************************
0000 ; *2008,浙江工业大学信息与控制研究所
0000 ; *All rights reserved
0000 ; *
0000 ; *文件名称:nrf.c
0000 ; *摘 要:NRF905相关的子程序实现
0000 ; *
0000 ; *当前版本:1.1
0000 ; *作 者:王微
0000 ; *完成日期:2008.4.28
0000 ; ****************************************/
0000 ; #include<macros.h>
0000 ; #include<iom128v.h>
0000 ;
0000 ; #include"spi.h"
0000 ; #include"common.h"
0000 ; #include"nrf.h"
0000 ;
0000 ;
0000 ; unsigned char data_conf[10];
0000 ; //unsigned char send_addr[4]={0x13,0x65,0x13,0x65}; //4字节的发送地址
0000 ; //unsigned char broad_addr[4]={0xff,0xff,0xff,0xff}; //4字节的广播地址
0000 ; //unsigned char receive_addr[4]={0x65,0x13,0x65,0x13}; //4字节的接收地址a513d36a
0000 ; //unsigned char receive_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的接收数据缓存区
0000 ; //unsigned char transmit_data[PACKAGE_LENGTH]; //PACKAGE_LENGTH字节的发送数据缓存区
0000 ;
0000 ;
0000 ;
0000 ; /**************************************************
0000 ; 函数功能:初始化nRF905,
0000 ; 输入参数:无
0000 ; 输出参数:无
0000 ; **************************************************/
0000 ; void init_905()
0000 ; {
0000 .dbline 36
0000 ; DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
0000 82B1 in R24,0x2
0002 8E60 ori R24,14
0004 82B9 out 0x2,R24
0006 .dbline 37
0006 ; DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入
0006 87B3 in R24,0x17
0008 8760 ori R24,7
000A 87BB out 0x17,R24
000C .dbline 39
000C ;
000C ; PORTE |=(1<<PWR_UP); //905上电
000C 1A9A sbi 0x3,2
000E .dbline 40
000E ; PORTE |=(1<<CSN); //CSN引脚置位,停止SPI操作,
000E 199A sbi 0x3,1
0010 .dbline 42
0010 ;
0010 ; PORTB |=1<<SCK; // Spi clock line init high
0010 C19A sbi 0x18,1
0012 .dbline 44
0012 ;
0012 ; PORTE &=~(1<<TX_EN);
0012 1B98 cbi 0x3,3
0014 .dbline 45
0014 ; PORTB &=~(1<<TRX_CE); // Set nRF905 in standby mode
0014 C098 cbi 0x18,0
0016 .dbline 47
0016 ;
0016 ; Delay3ms();
0016 0E940000 xcall _Delay3ms
001A .dbline -2
001A L1:
001A .dbline 0 ; func end
001A 0895 ret
001C .dbend
001C .dbfunc e set_confword _set_confword fV
001C ; r_addr -> R16,R17
.even
001C _set_confword::
001C .dbline -1
001C .dbline 56
001C ; }
001C ;
001C ; /**************************************************
001C ; 函数功能:设置配置字
001C ; 输入参数:905的接收地址
001C ; 输出参数:无
001C ; **************************************************/
001C ; void set_confword(unsigned char*r_addr)
001C ; {
001C .dbline 58
001C ;
001C ; data_conf[0]=0x01; //
001C 81E0 ldi R24,1
001E 80930000 sts _data_conf,R24
0022 .dbline 59
0022 ; data_conf[1]=0x0c; //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
0022 8CE0 ldi R24,12
0024 80930100 sts _data_conf+1,R24
0028 .dbline 60
0028 ; data_conf[2]=0x44; //4字节的接收地址和发送地址
0028 84E4 ldi R24,68
002A 80930200 sts _data_conf+2,R24
002E .dbline 62
002E ;
002E ; data_conf[3]=PACKAGE_LENGTH; //RX有效数据长度
002E 85E1 ldi R24,21
0030 80930300 sts _data_conf+3,R24
0034 .dbline 63
0034 ; data_conf[4]=PACKAGE_LENGTH; //TX有效数据长度
0034 80930400 sts _data_conf+4,R24
0038 .dbline 65
0038 ;
0038 ; data_conf[5]=r_addr[0]; //5~8为RX地址
0038 F801 movw R30,R16
003A 2080 ldd R2,z+0
003C 20920500 sts _data_conf+5,R2
0040 .dbline 66
0040 ; data_conf[6]=r_addr[1];
0040 2180 ldd R2,z+1
0042 20920600 sts _data_conf+6,R2
0046 .dbline 67
0046 ; data_conf[7]=r_addr[2];
0046 F801 movw R30,R16
0048 2280 ldd R2,z+2
004A 20920700 sts _data_conf+7,R2
004E .dbline 68
004E ; data_conf[8]=r_addr[3];
004E F801 movw R30,R16
0050 2380 ldd R2,z+3
0052 20920800 sts _data_conf+8,R2
0056 .dbline 70
0056 ;
0056 ; data_conf[9]=0xd8;
0056 88ED ldi R24,216
0058 80930900 sts _data_conf+9,R24
005C .dbline -2
005C L2:
005C .dbline 0 ; func end
005C 0895 ret
005E .dbsym r r_addr 16 pc
005E .dbend
005E .dbfunc e send_conf _send_conf fV
005E ; i -> R20
.even
005E _send_conf::
005E 0E940000 xcall push_gset1
0062 .dbline -1
0062 .dbline 80
0062 ;
0062 ; }
0062 ;
0062 ; /************************************************************
0062 ; 函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
0062 ; 输入参数:无
0062 ; 输出参数:无
0062 ; *************************************************************/
0062 ; void send_conf()
0062 ; {
0062 .dbline 82
0062 ; unsigned char i;
0062 ; PORTE &=~(1<<CSN); // Spi enable for write a spi command
0062 1998 cbi 0x3,1
0064 .dbline 83
0064 ; SpiWrite(WC); // Write config command写放配置命令
0064 0027 clr R16
0066 0E940000 xcall _SpiWrite
006A .dbline 84
006A ; for (i=0;i<10;i++) // Write configration words 写放配置字
006A 4427 clr R20
006C 0AC0 xjmp L16
006E L13:
006E .dbline 85
006E .dbline 86
006E 80E0 ldi R24,<_data_conf
0070 90E0 ldi R25,>_data_conf
0072 E42F mov R30,R20
0074 FF27 clr R31
0076 E80F add R30,R24
0078 F91F adc R31,R25
007A 0081 ldd R16,z+0
007C 0E940000 xcall _SpiWrite
0080 .dbline 87
0080 L14:
0080 .dbline 84
0080 4395 inc R20
0082 L16:
0082 .dbline 84
0082 4A30 cpi R20,10
0084 A0F3 brlo L13
0086 .dbline 88
0086 ; {
0086 ; SpiWrite(data_conf[i]);
0086 ; }
0086 ; PORTE |=(1<<CSN); // Disable Spi
0086 199A sbi 0x3,1
0088 .dbline -2
0088 L12:
0088 0E940000 xcall pop_gset1
008C .dbline 0 ; func end
008C 0895 ret
008E .dbsym r i 20 c
008E .dbend
008E .dbfunc e set_Tmode _set_Tmode fV
.even
008E _set_Tmode::
008E .dbline -1
008E .dbline 97
008E ; }
008E ;
008E ; /***************************************************************
008E ; 函数功能:把905配置成发送模式
008E ; 输入参数:无
008E ; 输出参数:无
008E ; ***************************************************************/
008E ; void set_Tmode()
008E ; {
008E .dbline 98
008E ; PORTE |=(1<<PWR_UP); //905上电
008E 1A9A sbi 0x3,2
0090 .dbline 99
0090 ; PORTE |=(1<<TX_EN);
0090 1B9A sbi 0x3,3
0092 .dbline 100
0092 ; PORTB &=~(1<<TRX_CE);
0092 C098 cbi 0x18,0
0094 .dbline 101
0094 ; Delay650us(); // delay for mode change(>=650us)
0094 0E940000 xcall _Delay650us
0098 .dbline -2
0098 L17:
0098 .dbline 0 ; func end
0098 0895 ret
009A .dbend
009A .dbfunc e set_Rmode _set_Rmode fV
.even
009A _set_Rmode::
009A .dbline -1
009A .dbline 110
009A ; }
009A ;
009A ; /***************************************************************
009A ; 函数功能:把905配置成接收模式
009A ; 输入参数:无
009A ; 输出参数:无
009A ; ***************************************************************/
009A ; void set_Rmode()
009A ; {
009A .dbline 111
009A ; PORTE |=(1<<PWR_UP); //905上电
009A 1A9A sbi 0x3,2
009C .dbline 112
009C ; PORTE &=~(1<<TX_EN);
009C 1B98 cbi 0x3,3
009E .dbline 113
009E ; PORTB |=(1<<TRX_CE);
009E C09A sbi 0x18,0
00A0 .dbline 114
00A0 ; Delay650us(); // delay for mode change(>=650us)
00A0 0E940000 xcall _Delay650us
00A4 .dbline -2
00A4 L18:
00A4 .dbline 0 ; func end
00A4 0895 ret
00A6 .dbend
00A6 .dbfunc e set_Powerdownmode _set_Powerdownmode fV
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -