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公司的VLSI ShockBurst技术。ShockBurst技术使nRF905能够提供高速的数据传输,而不需要昂贵的高速MCU来进行数据处理/时钟覆盖。通过将与RF协议有关的高速信号处理放到芯片内,nRF905提供给应用的微控制器一个SPI接口,速率由微控制器自己设定的接口速度决定。nRF905通过ShockBurst工作模式在RF以速率进行连接时降低数字应用部分的速度来降低在应用中的平均电流消耗。在ShockBurst RX模式中,地址匹配AM和数据准备就绪DR信号通知MCU一个有效的地址和数据包已经各自接收完成。在ShockBurst TX模式中,nRF905自动产生前导码和CRC校验码,数据准备就绪DR信号通知MCU数据传输已经完成。总之,这意味着降低MCU的存储器需求也就是说降低MCU成本,又同时缩短软件开发时间。
1)典型ShockBurst TX模式:
①、当应用MCU有遥控数据节点时,接收节点的地址TX-address和有效数据TX-payload通过SPI接口传送给nRF905应用协议或MCU设置接口速度;
②、MCU设置TRX_CE、TX_EN为高来激活nRF905 ShockBurst传输;
③、nRF905 ShockBurst:
l 无线系统自动上电
l 数据包完成(加前导码和CRC校验码)
l 数据包发送(100kbps,GFSK,曼彻斯特编码)
④、如果AUTO_RETRAN被设置为高nRF905将连续地发送数据包直到TRX_CE被设置为低;
⑤、当TRX_CE被设置为低时,nRF905结束数据传输并自动进入standby模式。
2)典型ShockBurst RX模式
①、通过设置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将准备进入ShockBurst RX、ShockBurst TX或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-Configuration Register)
寄存器包含收发器的频率、输出功率等配置信息。
3)发送地址(TX-Address)
寄存器包含目标器件地址,字节长度由配置寄存器设置。
4)发送有效数据(TX-Payload)
寄存器包含发送的有效ShockBurst数据包数据,字节长度由配置寄存器设置。
5)接收有效数据(RX-Payload)
寄存器包含接收到的有效ShockBurst数据包数据,字节长度由配置寄存器设置。在寄存器中的有效数据由数据准备就绪DR指示。
超低功耗无线收发器
无线传感网络
家庭和楼宇自动化
无线报警安全系统
无线数据传输系统
报警及安全系统
家庭自动化
遥感监测
无线门禁系统
无线鼠标
遥控开锁
遥控玩具
发送部分
/****************************
//写发射数据命令:20H
//读发射数据命令:21H
//写发射地址命令:22H
//读发射地址命令:23H //读接收数据命令:24H
******************************/
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit TXEN = P2^7; //配置口定义5`6`7//
sbit TRX_CE = P2^6;
sbit PWR = P2^5;
sbit MISO = P2^2; //SPI口定义0`1`2`3//
sbit MOSI = P2^3;
sbit SCK = P2^1;
sbit CSN = P2^0;
sbit DR = P2^4; //状态输出口4//
sbit led=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充许
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在423MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x02,0x02, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(uchar date) //用SPI口写数据至NRF905内//
{
uchar i;
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;
}
void TxPacket(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); //有时多接收一次的数据
}
void Ini_System(void)
{ //初始化配置寄存器//
uchar i;
// 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;
}
void main(void)
{
led=1;
Ini_System(); //设置配置,并进入发射模式
// PWR=1; //进入掉电模式
while(1)
{
TxPacket(); //发送数据
led=~led;
DR=0;
}
}
接收部分
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
bit lcdbit;
sbit TXEN = P2^7; //配置口定义7`6`5//
sbit TRX_CE = P2^6;
sbit PWR = P2^5;
sbit MISO = P2^2; //SPI口定义0`1`2`3//
sbit MOSI = P2^3;
sbit SCK = P2^1;
sbit CSN = P2^0;
sbit DR = P2^4; //状态输出口4//
sbit led=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充许
//******************************/
/*uchar code RFConf[11]={0x00,0x6c,0x0e,0x44,0x03,0x03,
0xe7,0xe7,0xe7,0xe7,0xde};
*/
uchar RFConf[11]={ //配置命令//
0x00,0x4c,0x0c,0x44,0x02,0x02,
0xcc,0xcc,0xcc,0xcc,0x58 //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
uchar TxRxBuffer[2];
uchar date;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void SpiWrite(unsigned char date) //用SPI口写数据至NRF905内//
{
uchar i;
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;
}
unsigned char SpiRead(void) //from 905 read data//
{
uchar i;
for(i=0;i<8;i++)
{
date<<=1 ;
SCK=0;
delay(1);
date|=MISO;
SCK=1 ;
delay(1);
}
SCK=0;
return(date);
}
void RxPacket(void) //接收数据包//
{
uchar i;
//while(DR)
for (i = 0 ;i < 2 ;i++)
{
//led=~led;
TxRxBuffer[i] = SpiRead();
//i++;
}
}
void Wait_Rec_Packet(void) //等待接收数据包//
{
// uchar temp;
// 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;
}
}
}
void Ini_System(void) //初始化配置寄存器//
{
uchar i;
//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;
}
void main(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 单片机无线收发系统设计
管脚 名称 管脚功能 说明
1 VCC 电源 电源+3.3~3.6V DC
2 TX_EN 数字输入 工作模式选择
3 TRX_CE 数字输入 使能芯片发射或接收
4 PWR_UP 数字输入 芯片上电
5 uCLK 时钟输出 (未使用)
6 CD 数字输出 载波检测
7 AM 数字输出 地址匹配
8 DR 数字输出 接收或发射数据完成
9 MISO SPI 接口 SPI 输出
10 MOSI SPI 接口 SPI 输入
11 SCK SPI 时钟 SPI 时钟
12 CSN SPI 使能 SPI 使能
13、14 GND 地 接地
下面为典型的 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电压范围为DC 3.3V~3.6V之间,不能超过3.6V否则会烧坏模块。
(2)模块
附加更加详细的收发程序,包括解释:
////////////////////////////////////////////整体参数////////////////////////////////////////////////////
//NewMsg-RF905-共有四种工作模式,其中有两种活动RX/TX模式和两种节电模式。
//活动模式
// ShockBurst RX
//ShockBurst TX
//节电模式
//掉电和SPI编程
//工作模式: