NRF905无线模块程序
- 格式:doc
- 大小:35.00 KB
- 文档页数:7
Nrf905无线模块使用教程nRF905是挪威NordicVLsl公司推出的单片射频收发器,工作电压为1.9一3.6V,32引脚QFN封装,工作于433/868/gl5MHz三个IsM(工业、科学和医学)频道,频道之间的转换时间小于650us。
nRF905由频率合成器、接收解调器、功率放大器、晶体振荡器和调制器组成,使用SPI接口与微控制器通信,配置非常方便。
其主要特点如下:●工作电源电压范围:1.9一3.6V;●数据包自动重发功能;●输出功率可调至IOdBm;●自动产生CRC和前导码;●低工作电流(TX),在输出功率为一10dBm时典型值为llmA;●低工作电流(RX),典型值为12.smA;的只有10个引脚。
(1)模式控制引脚由PWR、TXEN、TRX_CE三个引脚来控制NRF905芯片的工作模式各种模式的控制如下表下面这个函数将nrf905设置成发射模式,模式转换需要大于650usvoid SetTxMode(void){TX_EN=1;TRX_CE=0;Delay(1); // delay for mode change(>=650us)}下面这个函数将nrf905设置成接收模式void SetRxMode(void){TX_EN=0;TRX_CE=1;Delay(1); //delay for mode change(>=650us)}(2)SPI接口SPI接口由SCK、MISO、MOSI以及CSN这四个引脚组成。
在配置模式下单片机通过SPI接口配置无线模块的工作参数;在发射/接收模式下单片机SPI接口发送和接收数据。
:.。
NRF905程序参考教程。
本资料主要是将程序中各部分子程序的功能与NRF905的手册相关联,使得各位同仁在每个子程序为什么这么写都在手册中找到具体的体现,特别是寄存器配置。
内涵完整参考程序,是100%可用程序。
硬件的连接方法在参考程序之后,并介绍原理。
本人最后只是为了提供给大家一个入门的资料或是引子罢了,至于如何应用的巧妙那是后期编程巧妙的结果,目前只是给刚进门的人士一个可以快速理解和掌握的浅显易懂的教程罢了。
本人疏忽之处还请见谅。
按照惯例先展示作品抛砖引玉:四路AD采集+温度采集彩屏显示信息数据GSM手机电话最近做的,音频功放四路电机控制大功率led控制,不解释。
以前做的,舵机和摄像头,不解释。
更早先的,VGA显示,不解释。
已发送为例子。
1.通过spi接口把寄存器相应的值写到905中2.把要发的数据写到905中3.把状态设置成发送4.数据被发出那么操作905就主要是前三步的问题,那么请带个这前三个问题深入理解下面的相关解释了。
无线通信模块的三个要素:Nrf905模式的配置Nrf905通过寄存器配置Nrf905需要spi通信配置寄存器先看模式配置:程序加解释根据这个图表,我们发觉有四种模式。
捡重点的说实现收发功能有两种模式。
这两种模式在程序段中的实现是:设置成接受模式,程序中没写PWR_UP,如果他是低电平就变成断电,所以个程序段默认PWR_UP为高电平。
void SetRxMode(void){TXEN=0;TRX_CE=1;Delay(1); // delay for mode change(>=650us)}设置发送模式,这里会有疑问,在于 TRX_CE=0;。
这里给出的解释是,如果我们直接写TRX_CE=1;这样模块立即将其内部所写好的数据发送出去。
而对于编程的人员来说编出的程序五花八门,就比如说这条,改程序员的意图并不想让设置发送模式时,数据就被立即发出,所以写了T RX_CE=0;。
发射#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charsbit TX_EN= P3^5;sbit TRX_CE=P1^1;sbit PWR_UP=P3^4;sbit CD=P3^3;sbit AM=P1^3;sbit DR=P3^2;sbit MISO=P1^6;sbit MOSI=P1^4;sbit SCK=P1^7;sbit CSN=P1^5;sbit led=P3^0;sbit key1=P1^2;sbit key2=P1^0;sbit key3=P3^7;uchar key_value=0;void Delay(uint x){uint i;for(i=0;i<x;i++){_nop_();}}void SpiWrite(uchar date){uchar i=8;while (i--){Delay(10);MOSI=(bit)(date&0x80);date<<=1 ;Delay(10);SCK=1;Delay(10);SCK=0;}}void TxPacket(void){PWR_UP=1;TX_EN=1;TRX_CE=0;Delay(2);CSN=0;SpiWrite(0x22); //写发送地址,后面跟4字节地址//SpiWrite(0xE7);SpiWrite(0xE7);SpiWrite(0xE7);SpiWrite(0xE7);CSN=1;Delay(2);CSN=0;SpiWrite(0x20); //写发送数据命令,后面跟三字节数据//SpiWrite(0x01);SpiWrite(0x02);SpiWrite(key_value);CSN=1;Delay(5);TRX_CE=1; //使能发射模式//Delay(500); //等带发送完成//TRX_CE=0;while(!DR);}////////////初始化配置寄存器////////////////void Ini_System(void){CSN=1;SCK=0;PWR_UP=1;TRX_CE=0;TX_EN=0;Delay(2);CSN=0;SpiWrite( 0x00); //配置命令//SpiWrite( 0x6C); //CH_NO,配置频段在433.2MHZSpiWrite( 0x0C); //输出功率为10db,不重发,节电为正常模式SpiWrite( 0x44); //地址宽度设置,为4字节SpiWrite( 0x03);SpiWrite( 0x03); //接收发送有效数据长度为3字节SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7);SpiWrite( 0xE7); //接收地址SpiWrite( 0xDE);CSN=1;PWR_UP=1;TRX_CE=1;TX_EN=0;Delay(1000);}void main(void){Ini_System();DR=1;TRX_CE=0;Delay(1000);TX_EN=0;TRX_CE=1;PWR_UP=1;key_value=0x00;while(1){if(!key1) //senfing key1{Delay(5);if(!key1){ Delay(3);while(!key1);key_value=0xa0;}}elseif(!key2) //senfing key2{Delay(5);if(!key2){ Delay(3);while(!key2);key_value=0xa1;}}if(!key3) //senfing key3{Delay(5);if(!key3){ Delay(3);while(!key3);key_value=0xa2;}}if(key_value!=0x00){led=0;TxPacket();key_value=0x00;TX_EN=0;TRX_CE=1;PWR_UP=1;Delay(6000);led=1;}}}接收#include <reg52.h>#include <intrins.h>#define uint unsigned int#define uchar unsigned charsbit TX_EN= P0^0;sbit TRX_CE=P0^1;sbit PWR_UP=P0^2;sbit CD=P0^3;sbit AM=P0^4;sbit DR=P0^5;sbit MISO=P0^6;sbit MOSI=P0^7;sbit SCK=P2^0;sbit CSN=P2^1;sbit led1=P1^1;sbit led2=P1^2;sbit led3=P1^3;uchar TxRxBuffer[3];bit success_flag=0;void Delay(uint x){uint i;for(i=0;i<x;i++)_nop_();}void SpiWrite(uchar date){uchar i=8;while (i--){Delay(10);MOSI=(bit)(date&0x80);date<<=1 ;Delay(10);SCK=1;Delay(10);SCK=0;}}uchar SpiRead() //from 905 read data{uchar i=8,date1=0;;while (i--){date1<<=1 ;date1|=MISO;SCK=1 ;Delay(10);SCK=0 ;Delay(10);}return date1;}void Ini_System(void) /*初始化配置寄存器*/{CSN=1;SCK=0;PWR_UP=1;TRX_CE=0;TX_EN=0;Delay(2);CSN=0;SpiWrite(0x00); //配置命令//SpiWrite(0x6C); //CH_NO,配置频段在433.2MHZSpiWrite(0x0C); //输出功率为10db,不重发,节电为正常模式SpiWrite(0x44); //地址宽度设置,为4字节SpiWrite(0x03);SpiWrite(0x03); //接收发送有效数据长度为3字节SpiWrite(0xE7);SpiWrite(0xE7);SpiWrite(0xE7);SpiWrite(0xE7); //接收地址SpiWrite(0xDE);CSN=1;PWR_UP=1;TRX_CE=1;TX_EN=0;Delay(1000);}void Wait_Rec_Packet(void){if(DR){TRX_CE=0;//如果数据准备好,则进入待机模式,以便SPI口操作CSN=0;SpiWrite(0x24);//接收数据包TxRxBuffer[0] = SpiRead();TxRxBuffer[1] = SpiRead();TxRxBuffer[2] = SpiRead();CSN=1;while(DR);TRX_CE=1;if((TxRxBuffer[0]==0x01)&&(TxRxBuffer[1]==0x02)){TxRxBuffer[0]=0xff;TxRxBuffer[1]=0xff;success_flag=1;if(TxRxBuffer[2]==0xa0){ led1=~led1; }elseif(TxRxBuffer[2]==0xa1){ led2=~led2; }elseif(TxRxBuffer[2]==0xa2){ led3=~led3; }Ini_System();}}}void main(void){Ini_System();PWR_UP=0;DR=1;led1=0;led2=0;led3=0;success_flag=0;TRX_CE=0;Delay(1000);TX_EN=0;TRX_CE=1;PWR_UP=1;while(1){Wait_Rec_Packet(); //等待接收完成if(success_flag){TX_EN=0;TRX_CE=1;PWR_UP=1;Delay(5000);Delay(5000);success_flag=0;Delay(10000);}}}。