nrf905意思解释
nRF905无线芯片是由挪威NORDIC公司出品的低于1GHz无线数传芯片,主要工作于433MHz、868MHz和915MHz的ISM频段。芯片内置频率合成器、功率放大器、晶体振荡器和调制器等功能模块,输出功率和通信频道可通过程序进行配置。非常适合于低功耗、低成本的系统设计。
性能参数
◆422.4~473.5MHz工作频段◆512个通讯频道,满足多点通讯、分组、跳频等应用需求,通道切换时间≤6us◆发射功率可设置为:10dBm、6dBm、-2dBm和-10dBm◆通过SPI接口与MCU连接◆支持50kbps传输速率◆ShockBurst传输模式,自动生成前导码和CRC校验码◆工作电压范围:1.9V~3.6V,待机模式下电流仅为12.5μA◆工作温度范围:-40℃~+85℃
工作模式
nRF905采用Nordic公司的VLSIShockBurst技术。ShockBurst技术使nRF905能够提供高速的数据传输,而不需要昂贵的高速MCU来进行数据处理/时钟覆盖。通过将与RF协议有关的高速信号处理放到芯片内,nRF905提供给应用的微控制器一个SPI接口,速率由微控制器自己设定的接口速度决定。nRF905通过ShockBurst工作模式在RF以速率进行连接时降低数字应用部分的速度来降低在应用中的平均电流消耗。在ShockBurstRX模式中,地址匹配AM和数据准备就绪DR信号通知MCU一个有效的地址和数据包已经各自接收完成。在ShockBurstTX模式中,nRF905自动产生前导码和CRC校验码,数据准备就绪DR信号通知MCU数据传输已经完成。总之,这意味着降低MCU的存储器需求也就是说降低MCU成本,又同时缩短软件开发时间。1)典型ShockBurstTX模式:①、当应用MCU有遥控数据节点时,接收节点的地址TX-address和有效数据TX-payload通过SPI接口传送给nRF905应用协议或MCU设置接口速度;②、MCU设置TRX_CE、TX_EN为高来激活nRF905ShockBurst传输;③、nRF905ShockBurst:l无线系统自动上电l数据包完成(加前导码和CRC校验码)l数据包发送(100kbps,GFSK,曼彻斯特编码)④、如果AUTO_RETRAN被设置为高nRF905将连续地发送数据包直到TRX_CE被设置为低;⑤、当TRX_CE被设置为低时,nRF905结束数据传输并自动进入standby模式。2)典型ShockBurstRX模式①、通过设置TRX_CE高,TX_EN低来选择ShockBurst模式;②、650us以后,nRF905监测空中的信息;③、当nRF905发现和接收频率相同的载波时,载波检测CD被置高;④、当nRF905接收到有效的地址时,地址匹配AM被置高;⑤、当nRF905接收到有效的数据包(CRC校验正确)时,nRF905去掉前导码、地址和CRC位,数据准备就绪(DR)被置高;⑥、MCU设置TRX_CE低,进入standby模式低电流模式;⑦、MCU可以以合适的速率通过SPI接口读出有效数据;⑧、当所有的有效数据被读出后,nRF905将AM和DR置低;⑨、nRF905将准备进入ShockBurstRX、ShockBurstTX或Powerdown模式。3)掉电模式在掉电模式中,nRF905被禁止,电流消耗最小,典型值低于2.5uA。当进入这种模式时,nRF905是不活动的状态。这时候平均电流消耗最小,电池使用寿命最长。在掉电模式中,配置字的内容保持不变。4)STANDBY模式Standby模式在保持电流消耗最小的同时保证最短的ShockBurstRX、ShockBurstTX的启动时间。当进入这种模式时,一部分晶体振荡器是活动的。电流消耗取决于晶体振荡器频率,如:当频率为4MHZ时,IDD=12uA;当频率为20MHZ时,IDD=46uA。如果uPCLK(Pin3)被使能,电流消耗将增加。并且取决于负载电容和频率。在此模式中,配置字的内容保持不变。
器件配置
nRF905的所有配置都通过SPI接口进行。SPI接口由5个寄存器组成,一条SPI指令用来决定进行什么操作。SPI接口只有在掉电模式和Standby模式是激活的。1)状态寄存器(Status-Register)寄存器包含数据就绪DR和地址匹配AM状态。2)RF配置寄存器(RF-ConfigurationRegister)寄存器包含收发器的频率、输出功率等配置信息。3)发送地址(TX-Address)寄存器包含目标器件地址,字节长度由配置寄存器设置。4)发送有效数据(TX-Payload)寄存器包含发送的有效ShockBurst数据包数据,字节长度由配置寄存器设置。5)接收有效数据(RX-Payload)寄存器包含接收到的有效ShockBurst数据包数据,字节长度由配置寄存器设置。在寄存器中的有效数据由数据准备就绪DR指示。
应用领域
超低功耗无线收发器无线传感网络家庭和楼宇自动化无线报警安全系统无线数据传输系统报警及安全系统家庭自动化遥感监测无线门禁系统无线鼠标遥控开锁遥控玩具
程序
发送部分/****************************//写发射数据命令:20H//读发射数据命令:21H//写发射地址命令:22H//读发射地址命令:23H//读接收数据命令:24H******************************/#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharsbitTXEN=P2^7;//配置口定义5`6`7//sbitTRX_CE=P2^6;sbitPWR=P2^5;sbitMISO=P2^2;//SPI口定义0`1`2`3//sbitMOSI=P2^3;sbitSCK=P2^1;sbitCSN=P2^0;sbitDR=P2^4;//状态输出口4//sbitled=P1^0;/************//*RF寄存器配置*//*************//0x00,//配置命令////0x6C,//CH_NO,配置频段在433.2MHZ//0x0E,//输出功率为10db,不重发,节电为正常模式//0x44,//地址宽度设置,为4字节//0x03,0x03,//接收发送有效数据长度为3字节//0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率//0xDE,//CRC充许//******************************//*ucharcodeRFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,0xe7,0xe7,0xe7,0xe7,0xde};*/ucharRFConf[11]={0x00,//配置命令//0x4c,//CH_NO,配置频段在423MHZ0x0C,//输出功率为10db,不重发,节电为正常模式0x44,//地址宽度设置,为4字节0x02,0x02,//接收发送有效数据长度为32字节0xCC,0xCC,0xCC,0xCC,//接收地址0x58,//CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振};voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidSpiWrite(uchardate)//用SPI口写数据至NRF905内//{uchari;for(i=0;i<8;i++){delay(1);SCK=0;MOSI=(date&0x80);date<<=1;delay(1);SCK=1;delay(1);SCK=0;}SCK=0;}voidTxPacket(void){//TXEN=1;CSN=0;SpiWrite(0x22);//写发送地址,后面跟4字节地址//SpiWrite(0xcc);SpiWrite(0xcc);SpiWrite(0xcc);SpiWrite(0xcc);CSN=1;delay(1);CSN=0;SpiWrite(0x20);//写发送数据命令,后面跟三字节数据//SpiWrite(0x01);SpiWrite(0x02);//SpiWrite(0x04);CSN=1;delay(1);TRX_CE=1;TXEN=1;//CE,EN同时为1,为发送模式delay(1);//等待发送完成//led=~led;//while(!DR);//在非屏蔽状态下,只能发射一次TRX_CE=0;//led=~led;//加上led后,对接收产生了一定的影响,//while(!DR);//有时多接收一次的数据}voidIni_System(void){//初始化配置寄存器//uchari;//delay(1);CSN=1;SCK=0;DR=0;PWR=1;//进入掉电模式TRX_CE=0;TXEN=0;delay(1);CSN=0;//进入SIP模式for(i=0;i<11;i++){SpiWrite(RFConf[i]);//设置配置寄存器}CSN=1;//关闭SPI,进入发射状态//PWR=1;}voidmain(void){led=1;Ini_System();//设置配置,并进入发射模式//PWR=1;//进入掉电模式while(1){TxPacket();//发送数据led=~led;DR=0;}}接收部分#include<reg52.h>#defineuintunsignedint#defineucharunsignedcharbitlcdbit;sbitTXEN=P2^7;//配置口定义7`6`5//sbitTRX_CE=P2^6;sbitPWR=P2^5;sbitMISO=P2^2;//SPI口定义0`1`2`3//sbitMOSI=P2^3;sbitSCK=P2^1;sbitCSN=P2^0;sbitDR=P2^4;//状态输出口4//sbitled=P1^0;/************//*RF寄存器配置*//*************//0x00,//配置命令////0x6C,//CH_NO,配置频段在433.2MHZ//0x0E,//输出功率为10db,不重发,节电为正常模式//0x44,//地址宽度设置,为4字节//0x03,0x03,//接收发送有效数据长度为3字节//0xE7,0xE7,0xE7,0xE7,//接收地址,16位CRC校验,外部时钟信号使能,16M晶振//UP_CLK输出1MHZ频率//0xDE,//CRC充许//******************************//*ucharcodeRFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,0xe7,0xe7,0xe7,0xe7,0xde};*/ucharRFConf[11]={//配置命令//0x00,0x4c,0x0c,0x44,0x02,0x02,0xcc,0xcc,0xcc,0xcc,0x58//CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振};ucharTxRxBuffer[2];uchardate;voiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidSpiWrite(unsignedchardate)//用SPI口写数据至NRF905内//{uchari;for(i=0;i<8;i++){delay(1);SCK=0;MOSI=(date&0x80);date<<=1;delay(1);SCK=1;delay(1);SCK=0;}SCK=0;}unsignedcharSpiRead(void)//from905readdata//{uchari;for(i=0;i<8;i++){date<<=1;SCK=0;delay(1);date|=MISO;SCK=1;delay(1);}SCK=0;return(date);}voidRxPacket(void)//接收数据包//{uchari;//while(DR)for(i=0;i<2;i++){//led=~led;TxRxBuffer[i]=SpiRead();//i++;}}voidWait_Rec_Packet(void)//等待接收数据包//{//uchartemp;//PWR=1;TXEN=0;//接收模式TRX_CE=1;delay(2);while(!DR){delay(10);//if(DR)//数据接收成功{led=~led;TRX_CE=0;//如果数据准备好,则进入待机模式,以便SPI口操作CSN=0;delay(1);SpiWrite(0x24);//读nRF905所接受到的数据RxPacket();//保存数据CSN=1;delay(10);TRX_CE=1;/*temp=TxRxBuffer[0]+TxRxBuffer[1]+TxRxBuffer[2];if(temp==0x07){lcdbit=!lcdbit;//lcdbit=0}*/break;}}}voidIni_System(void)//初始化配置寄存器//{uchari;//lcdbit=1;CSN=1;SCK=0;DR=0;PWR=1;//进入掉电模式TRX_CE=0;TXEN=0;delay(1);CSN=0;//进入SIP模式for(i=0;i<11;i++){SpiWrite(RFConf[i]);//设置配置寄存器}CSN=1;//关闭SPI,进入接收状态PWR=1;//TRX_CE=1;//TXEN=0;}voidmain(void){P0=0x00;led=1;Ini_System();//设置配置,并进入接收模式(收)PWR=1;//进入掉电模式while(1){Wait_Rec_Packet();//等待接收完成,保存完接收数据(保存数据+地址)//CSN=0;P0=TxRxBuffer[0];delay(600);P0=TxRxBuffer[1];delay(600);P0=TxRxBuffer[2];delay(600);//CSN=1;}}程序经本人测试后没太大问题,如要深入研究,本人附加详细资料,希望对您有所帮助。
接口
1)、模式控制接口:该接口由PWR、TRX_CE、TX_EN组成控制由nRF905组成的高频头的四种工作模式:掉电和SPI编程模式;待机和SPI编程模式;发射模式;接收模式。2)、SPI接口:SPI接口由CSN、SCK、MOSI以及MISO组成。在配置模式下单片机通过SPI接口配置高频头的工作参数;在发射/接收模式下单片机SPI接口发送和接收数据。3)、状态输出接口:提供载波检测输出CD,地址匹配输出AM,数据就绪输出DR。
外围
1)、晶体规格为了实现晶体振荡器低功耗和快速启动时间的解决方案,推荐使用低值晶体负载电容。指定CL=12pF是可以接受的。但是,也可能增大到16pF。指定一个晶体并行相等电容,Co=1.5pF也是很好的,但这样一来会增加晶体自身成本。典型的设定晶体电容Co=1.5pF,指定Co_max=7.0pF。2)、外部参考时钟一个外部参考时钟如MCU时钟,可以用来代替晶体震荡器。这个时钟信号应该直接连接到XC1引脚,XC2引脚为高阻态。当使用外部时钟代替晶体时钟工作时,始终必须工作在Standby模式以降低电流消耗。如果器件被设置成Standby模式而没有使用外部时钟或晶体时钟,则电流消耗可达1mA。3)、微处理器输出时钟在默认情况下,微处理器提供输出时钟。在Standby模式下提供输出时钟将增加电流消耗。在Standby模式电流消耗取决于频率和外部晶体负载、输出时钟的频率和提供输出时钟的电容负载。4)、天线输出ANT1和ANT2输出脚给天线提供稳定的RF输出。这两个脚必须有连接到VDD_PA的直流通路,通过RF扼流圈,或者通过天线双极的中心点。在ANT1和ANT2之间的负载阻抗应该在200-700Ω范围内,通过简单的匹配网络或RF变压器(不平衡变压器)可以获得较低的阻抗(例如50Ω)。
拓展
基于nRF905模块的AT89S单片机无线收发系统设计管脚名称管脚功能说明1VCC电源电源+3.3~3.6VDC2TX_EN数字输入工作模式选择3TRX_CE数字输入使能芯片发射或接收4PWR_UP数字输入芯片上电5uCLK时钟输出(未使用)6CD数字输出载波检测7AM数字输出地址匹配8DR数字输出接收或发射数据完成9MISOSPI接口SPI输出10MOSISPI接口SPI输入11SCKSPI时钟SPI时钟12CSNSPI使能SPI使能13、14GND地接地下面为典型的nRF905模块数据发送流程[3]:(1)当微控制器要发送数据时,将接收机的地址和发送数据通过SPI接口传输给nRF905模块;(2)微控制器设置TRX_CE和TX_EN管脚同时置为高电平,启动发送端的nRF905模块为发送模式;(3)发送端的nRF905模块发送过程处理:a)射频寄存器开启;b)数据打包(加字头和CRC校验码);c)数据包发送;d)当数据包发送结束,将数据发送完成管脚(DR管脚)置为高电平;(4)如果AUTO_RETRAN被设置为高,nRF905模块将连续地发送数据包,直到TRX_CE被设置为低;(5)TRX_CE被设置为低时,nRF905模块数据包发送过程结束并回到待机模式。AT89S单片机控制nRF905模块数据发送流程图如图3所示。下面为典型的nRF905模块数据接收流程[4]:(1)微控制器控制TRX_CE为高电平、TX_EN为低电平,nRF905模块进入接收模式;(2)650us后,nRF905模块监测空中的信息,等待接收数据;(3)当nRF905模块检测到与接收频率相同的载波时,设置载波检测管脚(CD管脚)为高电平;(4)当nRF905模块接收到有效的地址时,设置地址匹配管脚(AM管脚)为高电平;(5)当一个正确的数据包接收完毕后,nRF905模块自动去掉数据包的字头、地址和CRC校验码,然后将数据接受完成管脚置为高电平;(6)微控制器将TRX_CE设置为低电平;(7)微控制器通过SPI接口以一定的速率提取数据包中的有效接收数据;(8)当所有的有效数据接收完毕,微控制器控制nRF905模块数据接收完成管脚(DR管脚)和地址匹配管脚(AM管脚)为低电平;(9)nRF905进入待机模式。说明:(1)VCC电压范围为DC3.3V~3.6V之间,不能超过3.6V否则会烧坏模块。(2)模块附加更加详细的收发程序,包括解释:////////////////////////////////////////////整体参数//////////////////////////////////////////////////////NewMsg-RF905-共有四种工作模式,其中有两种活动RX/TX模式和两种节电模式。//活动模式//ShockBurstRX//ShockBurstTX//节电模式//掉电和SPI编程//工作模式:
//┏━━━━┳━━━━┳━━━━┳━━━━━━━━━━━━━━━━┓//┃PWRUP┃TRXCE┃TX_EN┃工作模式┃//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━┫//┃0┃x┃x┃掉电和SPI编程┃//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━┫//┃1┃0┃x┃Standby和SPI编程┃//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━┫//┃1┃1┃O┃ShockBurstRX┃//┣━━━━╋━━━━╋━━━━╋━━━━━━━━━━━━━━━━┫//┃1┃l┃1┃ShockBurstTX┃//┗━━━━┻━━━━┻━━━━┻━━━━━━━━━━━━━━━━?//ShockBurstTX发送流程://典型的RF905发送流程分以下几步://A.当微控制器有数据要发送时,通过SPI接口,按时序把接收机的地址和要发送的数据送传给RF905,//SPI接口的速率在通信协议和器件配置时确定;//B.微控制器置高TRX_CE和TX_EN,激发RF905的ShockBurs发送模式;//C.RF905的ShockBurstTMI发送://(1)射频寄存器自动开启;//(2)数据打包(加字头和CRC校验码);//(3)发送数据包;//(4)当数据发送完成,数据准备好引脚被置高;//D.AUTO_REI'RAN被置高,RF905不断重发,直到TRX_CE被置低;//E.当TRX-CE被置低,RF905发送过程完成,自动进入空闲模式。//注意:ShockBurstTM工作模式保证,一旦发送数据的过程开始,无//论TRX_EN和TX—EN引脚是高或低,发送过程都会被处理完。只有//在前一个数据包被发送完毕,RF905才能接受下一个发送数据包//ShockBurstRX接收流程//接收流程//A.当TRX_CE为高、TX_EN为低时,RF905进入ShockBurstTM接收模式;//B.650us后,RF905不断监测,等待接收数据;//C.当RF905检测到同一频段的载波时,载波检测引脚被置高;//D.当接收到一个相匹配的地址,AM引脚被置高;//E.当一个正确的数据包接收完毕,RF905自动穆去字头、地址和CRC//校验位,然后把DR引脚置高//F.微控制器把TRX_CE置低,nRF905进入空闲模式;//G.微控制器通过SPI口,以一定的速率把数据穆到微控制器内;//H.彼?械氖?萁邮胀瓯希琻RF905把DR引脚和AM引脚置低;?//当正在接收一个数据包时,TRX_CE或TX_EN引脚的状态发生改变,//RF905立即把其工作模式改变,数据包则丢失。当微处理器接到AM//引脚的信号之后,其就知道RF905正在接收数据包,其可以决定是//让RF905继续接收该数据包还是进入另一个工作模式。///////节能模式//RF905的节能模式包括关机模式和节能模式。//在关机模式,RF905的工作电流最小,一般为2.SuA。进入关机模//式后,RF905保持配置字中的内容,但不会接收或发送任何数据。空//闲模式有利于减小工作电流,其从空闲模式到发送模式或接收模式的//启动时间也比较短。在空阑模式下,RF905内部的部分晶体振荡器处//于工作状态?//五、配置NeWMsg-RF905模块//所有配置字都是通过SPlI接口送给RF905。SIP接口的工作方式可//通过SPlI指令进行设置。当RF905处于空闲模式或关机模式时,SPI//按口可以保持在工作状?//SPI寄存器配置//SPI接口由5个内部寄存器组成。执行寄存器的回读模式来确认寄存器的内容。//状态寄存器(Status-Register)//寄存器包含数据就绪(DR)和地址匹配(AM)状态。//RF配置寄存器(RF-ConfigurationRegister)//寄存器包含收发器的频率,输出功率等配置信息。//发送地址(IX-Address)//寄存器包含目标器件地址,字节长度由配置寄存器设置。//发送有效数据(IX-Payload)//寄存器包含发送的有效ShockBurst数据包数据,字节长度由配置寄存器设置。//接收有效数据(IX-Payload)//寄存器包含接收到的有效ShockBurst数据包数据,字节长度由配置寄存器设置。在寄存器中的有效数据由//数据准备就绪(DR)指荆//SPI指令设置//用于SPI接口的有用命令见下表。当CSN为低时,SPI接口开始等待一条指令,任何一条新指令均由CSN//的由高到低的转换开始。//┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓//┃SPI串行接口指令┃//┣━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃指令名称┃指令格式┃操作┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃WCONFIG┃OOOOAAAA┃写配置寄存器。AAAA指出写操作的开始字节,字节数量取决于┃//┃(WC)┃┃AAAA指出的开始地址。┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃RCONFIG┃OOOIAAAA┃读配置寄存器。AAAA指出读操作的开始字节,字节数量取决于┃//┃(RC)┃┃AAAA指出的开始地址。┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃WTXPAYLOA┃00100000┃写TX有效数据:1-32字节。写操作全部从字节o开始。┃//┃D┃┃┃//┃(WTP)┃┃┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃RTXPAYLOA┃00100001┃读TX有效数据:1-32字节。读操作全部从字节o开始。┃//┃D┃┃┃//┃(RTP)┃┃┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃WTXADDRES┃00100010┃写TX地址:1-4字节。写操作全部从字节o开始┃//┃S┃┃┃//┃(WTA)┃┃┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃RTXADDRES┃00100011┃读TX地址:1-4字节。读操作全部从字节o开始。┃//┃S┃┃┃//┃(RTA)┃┃┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃RRXPAYLOA┃00100100┃读RX有效数据:1-32字节。读操作全部从字节o开始。┃//┃D┃┃┃//┃(RRP)┃┃┃//┣━━━━━━╋━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫//┃CHANNELCON┃lOOOpphc┃快速设置配置寄存器中CHNO,HFREQ_PLL和PAPWR的专用┃//┃FIG┃cccccccc┃命令_CHNO=ccccccccc:HFREQ_PLL=h:PA_PWR=pp┃//┃(CC)┃┃┃//┗━━━━━━┻━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━タ#include<reg52.h>//#include<ABSACC.h>//#include<intrins.h>//#include<stdio.h>////----------------------------------------------------------------------------------------------------------------#defineuintunsignedint#defineucharunsignedchar//----------------------------------------------------------------------------------------------------------------#defineBYTE_BIT00x01#defineBYTE_BIT10x02#defineBYTE_BIT20x04#defineBYTE_BIT30x08#defineBYTE_BIT40x10#defineBYTE_BIT50x20#defineBYTE_BIT60x40#defineBYTE_BIT70x80//----------------------------------------------------------------------------------------------------------------bdataunsignedcharDATA_BUF;//可位寻址的片内RAN#defineDATA7((DATA_BUF&BYTE_BIT7)!=0)#defineDATA0((DATA_BUF&BYTE_BIT0)!=0)sbitflag=DATA_BUF^7;sbitflag1=DATA_BUF^0;//------------------------------------发送数据缓冲区-------------------------------------------------#defineTxRxBuf_Len4unsignedcharTxRxBuf[TxRxBuf_Len]={0x29,0x30,0x31,0x32,};codeTxAddress[4]={0xcc,0xcc,0xcc,0xcc};chartf;//----------------------------------------NRF905工作模式控制端口------------------------------------------------------sbitTXEN=P2^4;//发射使能sbitTRX_CE=P3^2;//发射接收使能sbitPWR=P2^3;//----------------------------------------LED显示端口---------------------------------------------------sbitLED=P1^0;//----------------------------------------NRF905数据交换端口(SPI)---------------------------------------------------sbitMISO=P2^6;//输出sbitMOSI=P2^1;//输入sbitSCK=P2^5;//时钟sbitCSN=P2^0;//使能//----------------------------------------nrf905状态端口---------------------------------------------------------sbitAM=P2^7;sbitDR=P3^3;sbitCD=P2^2;//---------------------------------------------------------------------------------------------------------------//----------------------------------------按键端口-------------------------------------------------------sbitKEY=P3^7;//---------------------nrf905控制指令-------------------------------------------#defineWC0x00//写配置寄存器#defineRC0x10//读配置寄存器#defineWTP0x20//向TX-Payload寄存器写入发送有效数据#defineRTP0x21//向TX-Payload寄存器读取发送有效数据#defineWTA0x22//向TX-Addtess寄存器写入发送地址#defineRTA0x23//向TX-Addtess寄存器读取发送地址#defineRRP0x24//从RX-Payload寄存器读取接收到的有效数据//------------------------------------------NRF905寄存器配置------------------------------------------------unsignedcharidataRFConf[11]={0x00,//配置命令//0x4c,//CH_NO,配置频段在430MHZ字节0,配置频段0x0c,//输出功率为10db,不重发,节电为正常模式字节1,00011000x44,//地址宽度设置,为4字节字节2,6:4是TX地址宽度,2:0是RX地址宽度0x04,0x04,//接收发送有效数据长度为4字节字节3(RX),字节(TX):可设置为1,2,4,8,16,32字节,其中6,7两位为空,写00,则4字节为:00000100:0x04依次类推0xCC,0xCC,0xCC,0xCC,//接收地址字节5到字节80x58,//CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振字节9,};//================================================延时===========================================================voidnrf905_Delay(intn){uinti;while(n--)for(i=0;i<80;i++);}//=================================================SPI读函数=======================================================//步骤一:MISO线准备好需要发送的数据位//步骤二:SCK置高,主机读取MISO线上的数据//步骤三:SCK置低,准备接收数据的下一位//以上步骤循环执行8次,通过SPI从器件上读取数据完成!//数据传送时候。高位在前,低位在后。unsignedcharSpiRead(void){unsignedcharj;for(j=0;j<8;j++){DATA_BUF=DATA_BUF<<1;SCK=1;if(MISO)//读取位,保存至最末尾,通过左移位完成整个字节{DATA_BUF|=BYTE_BIT0;}else{DATA_BUF&=~BYTE_BIT0;}SCK=0;}returnDATA_BUF;}//===========================================SPI写函数===============================================================//步骤一:MOSI线准备好需要发送的数据位//步骤二:SCK置高,器件读取MOSI线上的数据//步骤三:SCK置低,准备发送数据的下一位//以上步骤循环执行8次,通过SPI从器件上发送数据完成!//数据传送时候。低位在前,高位在后。voidSpiWrite(unsignedcharsend){unsignedchari;DATA_BUF=send;for(i=0;i<8;i++){if(DATA7)//总是发送位{MOSI=1;//SPI输入,主机写操作}else{MOSI=0;}SCK=1;DATA_BUF=DATA_BUF<<1;SCK=0;}}//--------------------------------------初始化nRF905---------------------------------------------voidnRF905Init(void){CSN=1;//SpidisableSCK=0;//SpiclocklineinitlowDR=1;//InitDRforinputAM=1;//InitAMforinputCD=1;//InitCDforinputPWR=1;//nRF905poweronTRX_CE=0;//SetnRF905instandbymodeTXEN=0;//setradioinRxmode}//-----------------------------------------------------初始化寄存器-----------------------------------------------//步骤一:CSN置低电平,SPI接口开始等待条命令//步骤二:调用SpiWrite函数,向nrf905发送WC指令,准备写入配置信息//步骤三:反复调用SpiWrite函数,向器件配置寄存器写入配置信息//步骤四:CSN置高电平,结束SPI通讯。即nrf905配置完成!voidConfig905(void){uchari;CSN=0;//CSN片选信号,SPI使能//SpiWrite(WC);//向905芯片写配置命令for(i=0;i<11;i++)//循环写入配置信息{SpiWrite(RFConf[i]);//RxTxConf保存预先设置好的配置信息}CSN=1;//结束SPI数据传输}//-------------------------------发送数据打包---------------------------------------------------//步骤一:通过SpiWrite函数发送WTP命令,准备写入TX有效数据//步骤二:循环调用SpiWrite向TX-Payload寄存器写入有效数据(中间必须夹有CSN电平变化)//步骤三:延时//步骤四:通过SpiWrite函数发送WTA命令,准备写入TX地址//步骤五:循环调用SpiWrite向TX-Address寄存器写入TX地址//步骤六:TRC_CE=1;开始发送数据,延时,nrf905数据发送完成,//当nrf905接收到一条完成的信息时,会将DR引脚置高。voidTxPacket(uchar*TxRxBuf){uchari;//Config905();CSN=0;SpiWrite(WTP);//Writepayloadcommandfor(i=0;i<4;i++){SpiWrite(TxRxBuf[i]);//写入32直接发送数据}CSN=1;nrf905_Delay(1);//关闭SPI,保存写入的数据CSN=0;//SPI使能,保存写入的数据SpiWrite(WTA);//写数据至地址寄存器for(i=0;i<4;i++)//写入四字节地址写入与对方地址一样的地址{SpiWrite(TxAddress[i]);}CSN=1;//关闭SPITRX_CE=1;//进入发送模式,启动射频发送nrf905_Delay(1);//进入ShockBurst发送模式后,芯片保存数据TRX_CE=0;//发送完成后返回ATANDBY模式while(DR!=1);}//----------------------------------------------设置发送初始状态---------------------------------------------voidSetTxMode(void){TRX_CE=0;TXEN=1;nrf905_Delay(1);//nrf905_Delayformodechange(>=650us)}//步骤一:TRX_ce=0;必须将次引脚置低,使905进入standby模式//步骤二:发送RRP指令//步骤三:循环调用SpiWrite函数,读取接收到的数据//步骤四:等待DR和AM引脚复位为低电平//AM地址匹配,接收到有效地址,被置高//DR接收到有效数据包,并解码后,被置高,当所有有效数据被读取后,//nrf905降AM和DR置低,需要注意的是,必须首先设置器件的//发送/接收模式才能保证有效的数据发生接收//-----------------------------------------------设置nrf905进入接收模式---------------------------------------------------voidSetRxMode(void){TXEN=0;TRX_CE=1;nrf905_Delay(1);//nrf905_Delayformodechange(>=650us)}//-------------------------------------判断数据接收状态-----------------------------------------------------unsignedcharCheckDR(void)//检查是否有新数据传入DataReady{DR=1;//通过对端口写1,可以使端口为输入状态,这51的特性。不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。)if(DR==1){DR=0;return1;}else{return0;}}//----------------------------NRF905接收到数据后读取保存------------------------------------------------------------voidRxPacket(void){uchari;nrf905_Delay(1);//TRX_CE=0;//设置905进入待机模式nrf905_Delay(100);TRX_CE=0;CSN=0;//使能SPInrf905_Delay(1);SpiWrite(RRP);//准备读取接收到的数据for(i=0;i<4;i++){TxRxBuf[i]=SpiRead();//通过SPI接口从905芯片读取数据}CSN=1;//禁用SPInrf905_Delay(10);TRX_CE=1;}//--------------------------------------------------------数据接收------------------------------------------------voidRX(void){SetRxMode();//while(CheckDR()==0);为了实现双向通信,就不能一直处于接收等待状态,所以注释掉nrf905_Delay(10);RxPacket();if(TxRxBuf[0]==0x29){LED=0;nrf905_Delay(300);LED=1;nrf905_Delay(300);//接收到数据后闪烁}}//-----------------------------------------------------------------------------------------------------------------voidmain(void){nRF905Init();Config905();LED=1;while(1){RX();if(KEY==0){while(KEY==0);tf=1;TxRxBuf[0]=0x29;}if(tf==1){SetTxMode();TxPacket(TxRxBuf);//发送命令数据LED=0;nrf905_Delay(300);LED=1;nrf905_Delay(300);//发送后LED闪烁tf=0;}}}带nrf905字词语
带nrf905字成语