nRF905无法实现通讯的一些原因与可用程序_第1页
nRF905无法实现通讯的一些原因与可用程序_第2页
nRF905无法实现通讯的一些原因与可用程序_第3页
nRF905无法实现通讯的一些原因与可用程序_第4页
nRF905无法实现通讯的一些原因与可用程序_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、(以下只是我的一些个人看法,大家谨慎参考,可能会有错误,欢迎大家指出。)nRF905无法实现通讯的原因:1、nRF905承受电压为3.6v,不慎接错电源会导致其烧坏。2、nRF905的发送效果与电源供电能力有关,输出功率为+10dbm时,且通过笔记本电脑的USB接口供电给nrf905,有时会导致信号无法发出。若更换稳定且供电能力强的电源后,还无信号发出,请重新开机上电。3、为保证信号发出,可将nrf905模式转变时的延时程序与开启发送模式时的延时程序加长,以确保信号发出。4、发送数据时,DR可能在数据全部发送完成前被置高。可采用以下程序列子。ce=1;txen=1;/ce ,txen 置高后进

2、入发送模式delay(20);/延时约20ms,发送为+10dbm模式,需要很高电流,/增长延时以确保信号发出while(!dr);/可能数据在开始发送的瞬间dr就被置高了,去掉前一句/延时程序会导致发送失败5、 接收端CD信号在接收模式时:在未检测到同频率信号时,会有短时的高电平脉冲(通过示波器观察,电平会瞬间跳高,短时间后跳低);检测到同频率载波后会一直为高。6、 CD、AM、DR这几个端口得初始化为1;7、csn置低后,得先输入一种操作命令,然后再输入该种数据;输入下一种操作命令,得先把csn置高,再次置低后,即可输入第二中操作命令。(以上几点是我在使用nrf905过程中遇到的问题,如果

3、这些原因不能解决你的疑问,我冒昧的估计,可能是spi时序的问题了。)nRF905发送程序:/*nRF905的发送效果与电源供电能力有关,在输出功率在+10dbm时,通过usb供电给nrf905,有时导致信号无法发出。更换稳定且供电能力强的电源后,无信号发出,请从新开机上电*/*为保证信号发出,可将nrf905模式转换后的延时与开启发送模式后的延时加长,以确保信号发出*/#include #include#define uchar unsigned char#define uint unsigned int/*nRF905的操作命令*/#define WC 0x00 / 从0字节开始,写配置寄存

4、器 #define RC 0x10 / 从0字节开始,读配置寄存器 #define WTP 0x20 / 向TX-Payload寄存器写入发送有效数据 #define RTP 0x21 / 从TX-Payload寄存器读取发送有效数据 #define WTA 0x22 / 向TX-Address寄存器写入发送地址 #define RTA 0x23 / 从TX-Address寄存器读取发送地址 #define RRP 0x24 / 从RX-Payload寄存器读取接收到的有效数据sbit led=P10; /定义一个io口,外接灯泡以观察发送情况/*定义spi接口*/sbit sck=P00;/

5、spi时钟信号sbit csn=P01;/置低一次,先输入一种操作命令,然后再输入该种数据sbit miso=P02;/spi数据从nRF905中输出口sbit mosi=P03;/spi数据输入到nRF905口sbit am=P04;/nRF905地址匹配信号口sbit dr=P05;/nRF905数据准备完毕信号口sbit cd=P06;/nRF905载波检测信号口sbit ce=P07;sbit pwr=P21;sbit en=P20;/TX_EN口/*nrf905寄存器配置数据*/uchar code config10= 0x4c, /设置频段430mhz0x0c, /输出功率10db

6、,不重复发送,节电为正常模式0x44, /地址宽度设置为4字节0x01, 0x01,/接收发送有效数据长度为1字节0xe7, 0xe7, 0xe7,0xe7,/接收地址0x58 /无外部时钟,16m晶振,crc允许,8位crc校验; void delay(uint xms)/延时xms毫秒uint x,y;for(x=xms;x0;x-)for(y=110;y0;y-);/*spi数据写入函数*/void spiwrite(uchar byte)uchar a,i;a=byte;for(i=0;i8;i+)sck=0;_nop_();_nop_();a=a1;_nop_();_nop_();m

7、osi=CY;_nop_();_nop_();sck=1; /上升沿使数据写入_nop_();_nop_();sck=0;/*nrf905初始化函数*/void init()uchar i;csn=1;/ Spi disablesck=0;/ Spi clock line init lowdr=1;/ Init DR for inputam=1;/ Init AM for inputcd=1;/ Init CD for inputpwr=1;/ nRF905 power once=0;/ Set nRF905 in standby modeen=0;/ set radio in Rx mode

8、delay(5); /nRF905模式转变时,延时稍微长点,以防止数据丢失csn=0;_nop_();_nop_();spiwrite(WC); /写入寄存器配置命令,后跟寄存器配置数据for (i=0;i10;i+)spiwrite(configi);csn=1;_nop_();_nop_();/*数据发送函数*/void send(uchar address,uchar byte)ce=0;en=0;/进入spi编程模式delay(5);csn=0;_nop_();_nop_();spiwrite(WTA); /写入发送地址命令,后跟4字节地址spiwrite(address);spiwr

9、ite(address);spiwrite(address);spiwrite(address);_nop_();_nop_();csn=1;_nop_();_nop_();csn=0;_nop_();_nop_();spiwrite(WTP);/写发送数据命令,后跟一字节数据spiwrite(byte);_nop_();_nop_();csn=1;_nop_();_nop_();ce=1;en=1;/ce ,en 置高后进入发送模式/从spi编程模式转变到发送模式需要时间delay(20);/发送为+10dbm模式,需要很高电流,增大延时以确保信号发出while(!dr);/估计数据在开始发

10、送的瞬间dr就被置高了 ,不可去掉前一句延时程序led=0;/数据发送完成后灯泡被点亮en=0;ce=0;/en被置低 ,dr置低_nop_();_nop_(); if(dr=0)/使灯泡熄灭,等待下次数据发送后被点亮 delay(400);led=1;delay(400);void main() init(); /nrf905初始化函数while(1)send(0xe7,0x66);delay(500); /减缓发送程序,以便用led观察送与接收情况 nRF905接收程序:/*nRF905的发送效果与电源供电能力有关,在输出功率在+10dbm时,通过usb供电给nrf905,有时导致信号无法

11、发出。更换稳定且供电能力强的电源后,无信号发出,请从新开机上电*/*为保证信号发出,可将nrf905模式转换后的延时与开启发送模式后的延时加长,以确保信号发出*/*通过串口将读出的数据传给电脑*/#include #include#define uchar unsigned char#define uint unsigned intuchar pp;/*操作命令*/#define WC 0x00 / 从0字节开始,写配置寄存器 #define RC 0x10 / 从0字节开始,读配置寄存器 #define WTP 0x20 / 向TX-Payload寄存器写入发送有效数据 #define RT

12、P 0x21 / 从TX-Payload寄存器读取发送有效数据 #define WTA 0x22 / 向TX-Address寄存器写入发送地址 #define RTA 0x23 / 从TX-Address寄存器读取发送地址 #define RRP 0x24 / 从RX-Payload寄存器读取接收到的有效数据/*csn置低一次,先输入一种操作命令,输入该种数据*/sbit led=P10;/定义一个io口,外接灯泡以观察数据接收情况/定义spi接口sbit sck=P00;sbit csn=P01;sbit miso=P02;sbit mosi=P03;sbit am=P04;sbit dr=

13、P05;sbit cd=P06;sbit ce=P07;sbit pwr=P21;sbit en=P20;/*寄存器配置数据*/uchar code config10= 0x4c, /设置频段430mhz0x0c, /输出功率10db,不重复发送,节电为正常模式0x44, /地址宽度设置为4字节0x01, 0x01,/接收发送有效数据长度为1字节0xe7, 0xe7, 0xe7,0xe7,/接收地址0x58 /无外部时钟,16m晶振,crc允许,8位crc校验; void delay(uint xms)uint x,y;for(x=xms;x0;x-)for(y=110;y0;y-);/*数据

14、写入函数*/void spiwrite(uchar byte)uchar a,i;a=byte;for(i=0;i8;i+)sck=0;_nop_();_nop_();a=a1;_nop_();_nop_();mosi=CY;delay(10);sck=1; /上升沿使数据写入_nop_();_nop_();sck=0;/*数据读出函数*/uchar spiread()uchar a=0,i;sck=0;_nop_();_nop_();for(i=0;i8;i+)sck=1;_nop_();_nop_();a=(a1)|miso;_nop_();_nop_();sck=0;/下降沿数据读出_n

15、op_();_nop_();return a;/*nRF905初始化函数*/void init()uchar i;csn=1;/ Spi disablesck=0;/ Spi clock line init lowdr=1;/ Init DR for inputam=1;/ Init AM for inputcd=1;/ Init CD for inputpwr=1;/ nRF905 power once=0;/ Set nRF905 in standby modeen=0;/ set radio in Rx modedelay(5);/nRF905模式转变时,延时稍微长点,以防止数据丢失cs

16、n=0;_nop_();_nop_();spiwrite(WC); /写入寄存器配置命令,后跟寄存器配置数据for (i=0;i10;i+)spiwrite(configi);_nop_();_nop_();csn=1;_nop_();_nop_();/*初始化定时器1,用于产生串口通讯的采样脉冲 使用11.0592的晶振效果最好*/void sp_init() TMOD=0x20;TH1=0xfd; TL1=0xfd; SM0=1; SM1=1; TR1=1; EA=1; ES=1; /*将数据从nRF905的寄存器中读出来,以检查数据是否出错*/void config_read() ce=0;en=0;delay(5);/nRF905模式转变时,延时稍微长点,以防止数据丢失csn=0;_nop_();_nop_();spiwrite(RRP);/从TX-Payload寄存器读取发送有效数据_nop_();_nop_();pp=spiread();_nop_();_nop_();csn=1;_nop_();_nop_();/*开启接收状态函数*/void receive()ce=1;en=0;delay(10);/nRF905模式转变时,延时稍微长点,以防止数据丢失led=0;/为接收状态时,灯泡亮void m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论