
NRF905无线模块特点:
(1) 433Mhz 开放ISM 频段免许可证使用
(2) 最高工作速率50kbps,高效GFSK调制,抗干扰能力强,特别适合工业控制场合
(3) 125 频道,满足多点通信和跳频通信需要
(4) 内置硬件CRC 检错和点对多点通信地址控制
(5) 低功耗1.9 - 3.6V 工作,待机模式下状态仅为2.5uA
(6) 收发模式切换时间< 650us
(7) 模块可软件设地址,只有收到本机地址时才会输出数据(提供中断指示),可直接接各种单片机使用,软件编程非常方便
(8) TX Mode: 在+10dBm情况下,电流为30mA; RX Mode: 12.2mA
(9) 标准DIP间距接口,便于嵌入式应用
(10)RFModule-Quick-DEV 快速开发系统,含开发板
二、接口电路管脚说明
说明:
(1) VCC脚接电压范围为3.3V~3.6V之间,不能在这个区间之外,超过3.6V将会烧毁模块。推荐电压3.3V左右。
(2) 除电源VCC和接地端,其余脚都可以直接和普通的5V单片机IO口直接相连,无需电平转换。当然对3V左右的单片机更加适用了。
(3) 硬件上面没有SPI的单片机也可以控制本模块,用普通单片机IO口模拟SPI 不需要单片机SPI模块介入,只需添加代码模拟SPI时序即可。
(4) 13脚、14脚为接地脚,需要和母板的逻辑地连接起来。
(5) 排针间距为100mil,标准DIP插针。
(6) 与51系列单片机P0口连接时候,需要加10K的上拉电阻,与其余口连接不需要。
(7) 其他系列的单片机,如果是5V的,请参考该系列单片机IO口输出电流大小,如果超过10mA,需要串联电阻分压,否则容易烧毁模块! 如果是3.3V的,可以直接和RF905模块的IO口线连接。
三、模块引脚和电气参数说明
RF905模块使用Nordic公司的nRF905芯片开发而成。RF905 单片无线收发器工作在433/868/915MHZ 的ISM 频段由一个完全集成的频率调制器一个带解调器的接收器一个功率放大器一个晶体震荡器和一个调节器组成ShockBurst 工作模式的特点是自动产生前导码和CRC 可以很容易通过SPI 接口进行编程配置电流消耗很低在发射功率为+10dBm 时发射电流为30mA 接收电流为12.5mA. 进入POWERDOWN 模式可以很容易实现节电。
RF905SE模块性能参考数据
RF905SE模块工作电压与最大发射增益参考数据
四、工作方式
RF905一共有四种工作模式, 其中有两种活动RX/TX 模式和两种节电模式。
●活动模式
ShockBurst RX ShockBurst TX
●节电模式
1)掉电和SPI编程
2)STANDBY 和SPI编程
nRF905 工作模式由TRX_CE、TX_EN、PWR_UP 的设置来设定。
4.1 ShockBurst 模式
ShockBurstTM收发模式下,使用片内的先入先出堆栈区,数据低速从微控制器送入,但高速发射,这样可以尽量节能,因此,使用低速的微控制器也能得到很高的射频数据发射速率。与射频协议相关的所有高速信号处理都在片内进行,这种做法有三大好处:尽量节能;低的系统费用(低速微处理器也能进行高速射频发射);数据在空中停留时间短,抗干扰性高。ShockBurstTM技术同时也减小了整个系统的平均工作电流。在ShockBurstTM收发模式下,RF905自动处理字头和CRC校验码。在接收数据时,自动把字头和CRC校验码移去。在发送数据时,自动加上字头和CRC校验码,当发送过程完成后,DR引脚通知微处理器数据发射完毕。
4.1.1 ShockBurst TX 发送流程
典型的RF905发送流程分以下几步:
A. 当微控制器有数据要发送时,通过SPI接口,按时序把接收机的地址和要发送的数据送传给RF905,SPI接口的速率在通信协议和器件配置时确定;
B. 微控制器置高TRX_CE和TX_EN,激发RF905的ShockBurstTM发送模式;
C. RF905的ShockBurstTM发送:
(1) 射频寄存器自动开启;
(2) 数据打包(加字头和CRC校验码);
(3) 发送数据包;
(4) 当数据发送完成,数据准备好引脚被置高;
D. AUTO_RETRAN被置高,RF905不断重发,直到TRX_CE被置低;
E. 当TRX_CE被置低,RF905发送过程完成,自动进入空闲模式。注意:ShockBurstTM工作模式保证,一旦发送数据的过程开始,无论TRX_EN和TX_EN 引脚是高或低,发送过程都会被处理完。只有在前一个数据包被发送完毕,RF905才能接受下一个发送数据包。
4.1.2 ShockBurst RX 接收流程
接收流程
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. 当所有的数据接收完毕,nRF905把DR引脚和AM引脚置低;
I. nRF905此时可以进入ShockBurstTM接收模式、ShockBurstTM发送模式或关机模式。
当正在接收一个数据包时,TRX_CE或TX_EN引脚的状态发生改变,RF905立即把其工作模式改变,数据包则丢失。当微处理器接到AM引脚的信号之后,其就知道RF905正在接收数据包,其可以决定是让RF905继续接收该数据包还是进入另一个工作模式。
4.1.3 节能模式
RF905的节能模式包括关机模式和节能模式。在关机模式,RF905的工作电流最小,一般为2.5uA。进入关机模式后,RF905保持配置字中的内容,但不会接收或发送任何数据。空闲模式有利于减小工作电流,其从空闲模式到发送模式或接收模式的启动时间也比较短。在空闲模式下,RF905内部的部分晶体振荡器处于工作状态。
五、配置RF905模块
所有配置字都是通过SPI接口送给RF905。SIP接口的工作方式可通过SPI指令进行设置。当RF905处于空闲模式或关机模式时,SPI接口可以保持在工作状态。
5.1 SPI接口寄存器配置
SPI接口由状态寄存器、射频配置寄存器、发送地址寄存器发送数据寄存器和接收数据寄存器5个寄存器组成。状态寄存器包含数据准备好引脚状态信息和地址匹配引脚状态信息;射频配置寄存器包含收发器配置信息,如频率和输出功能等;发送地址寄存器包含接收机的地址和数据的字节数;发送数据寄存器包含待发送的数据包的信息,如字节数等;接收数据寄存器包含要接收的数据的字节数等信息。SPI 接口由5 个内部寄存器组成执行寄存器的回读模式来确认寄存器的内容。
状态寄存器Status-Register
寄存器包含数据就绪DR 和地址匹配AM 状态
RF配置寄存器RF-Configuration Register
寄存器包含收发器的频率,输出功率等配置信息
发送地址TX-Address
寄存器包含目标器件地址字节长度由配置寄存器设置
发送有效数据TX-Payload
寄存器包含发送的有效ShockBurst 数据包数据字节长度由配置寄存器设置接收有效数据TX-Payload
寄存器包含接收到的有效ShockBurst 数据包数据字节长度由配置寄存器设置在寄存器中的有效数据由数据准备就绪DR 指示
5.2 SPI 指令设置
当CSN 为低时, SPI接口开始等待一条指令。任何一条新指令均由CSN 的由高到低的转换开始。用于SPI 接口的有用命令见下表:
SPI 串行接口指令设置
5.3 SPI 时序
GS-03是一款基于单片机的无线开发板,最大限度地使用SMT贴片工艺技术,合理的器件布局与高质量的器件选用,使开发板更显人性化,并且获得最好的稳定性。板载nRF24L01+和nRF905无线模块接口,配合丰富的外接接口及完整的开发例程,为用户开发无线产品带来便利。
开发板标准配置:
1.3.3V和5V稳压电路2.1A自恢复保险丝电路
3.8个LED指示灯
4.4位共阳数码管
5.5V有源蜂鸣器
6.MAX202串口电路
7.ATS5X系列单片机的ISP下载接口
8.单片机复位按键电路
9.4个用户自定义按键
10.DS18B20接口电路
11.nRF24L01+无线模块接口电路
12.nRF905无线模块接口电路
13.LCD128液晶屏电路,可调显示灰度
14.LCD1602液晶电路,可调显示灰度
开发板特色:
1.5V、3.3V电压输出接口
2.活动单片机插座,方便更换单片机
3.使用圆孔晶振接口,方便更换晶振
4.支持STC和AT单片机
5.胆电容滤波电路,是开发板稳定性的强
力后盾一对无线开发板:
单独一个开发板:
开发板背面:
开发板正面:
开发板采集温度:
开发板尺寸95mm*80mm:
无线继电器控制VB上位机:
无线温度检测(精简版)VB上位机:
无线温度检测绘制曲线VB上位机:
51单片机驱动nRF905例程
/****************************************
//DS18B20温度传感器//
****************************************/
/*****************************************************/
//包含头文件
#include "inc/nrf905.h"
bdata unsigned char DATA_BUF;
#define DATA7 ((DATA_BUF&BYTE_BIT7) != 0)
#define DATA0 ((DATA_BUF&BYTE_BIT0) != 0)
sbit flag =DATA_BUF^7;
sbit flag1 =DATA_BUF^0;
unsigned char nRF905_TxRxBuf[nRF905_TxRxBuf_Len]=
{
0x00,0x03,0x1,0x02,
};
code nRF905_TxAddress[4]={0xcc,0xcc,0xcc,0x00};
//-----------------------------------------------NRF905寄存器配置------------------------------------------------ unsigned char idata RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在423MHZ
0x0C, //输出功率为10db,不重发,节电为正常模式0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
//-----------------------------------------------延时--------------------------------------------------------------
void delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
//----------------------------------------------SPI写函数---------------------------------------------------------
void SpiWrite(unsigned char send)
{
unsigned char i;
DATA_BUF=send;
for (i=0;i<8;i++)
{
if (DATA7) //总是发送最高位
{
MOSI=1;
}
else
{
MOSI=0;
}
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
//-------------------------------------------------SPI读1字节函数------------------------------------------------- unsigned char SpiRead(void)
{
unsigned char j;
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;
}
return DATA_BUF;
}
//---------------------------------------------初始化nRF905状态----------------------------------------------------- void nRF905_Init(void)CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=1; // Init DR for input
AM=1; // Init AM for input
CD=1; // Init CD for input
PWR=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TXEN=0; // set radio in Rx mode
}
//----------------------------------------------NRF905初始化寄存器------------------------------------------------ void nRF905_Config(void)
{
uchar i;
CSN=0; // Spi enable for write a spi command
//SpiWrite(WC); // Write config command写放配置命令
for (i=0;i<11;i++) // Write configration words 写放配置字
{
SpiWrite(RFConf[i]);
}
CSN=1; // Disable Spi
}
//--------------------------------------------设置发送模式---------------------------------------------------------- void nRF905_SetTxMode(void)
{
TRX_CE=0;
TXEN=1;
delay(1); // delay1 for mode change(>=650us)//--------------------------------------------------设置接收状态-------------------------------------------------- void nRF905_SetRxMode(void)
{
TXEN=0;
TRX_CE=1;
delay(1); // delay for mode change(>=650us)
//delay(20);//GGG
}
//--------------------------------------------------------------------------------------------------------------- unsigned char nRF905_CheckCD(void) //Pin->检查是否已存在同频率载波
{
if (CD==1)
{
return 1;
}
else
{
return 0;
}
}
//--------------------------------------------------判断是否接收数据--------------------------------------------- unsigned char nRF905_CheckDR(void) //检查是否有新数据传入Data Ready
{
DR=1;
//通过对端口写1,可以使端口为输入状态,这51的特性。不熟悉者可以参阅51相关书籍作证(将DR端口设置为输入状态。)
if (DR==1)
{
DR=0;
return 1;
}
else
{
return 0;
}
}
//----------------------------------------打包待发送的数据-------------------------------------------------------- void nRF905_nRF905_TxPacket(void)
{
uchar i;
//nRF905_Config();
CSN=0;
SpiWrite(WTP); // Write payload command
for (i=0;i<4;i++)
{
SpiWrite(nRF905_TxRxBuf[i]); // Write 32 bytes nRF905_Tx data }// Spi enable for write a spi command
CSN=1;
delay(1); // Spi disable
CSN=0; // Spi enable for write a spi command
SpiWrite(WTA); // Write address command
for (i=0;i<4;i++) // Write 4 bytes address
{
SpiWrite(nRF905_TxAddress[i]);
}
TRX_CE=1; // Set TRX_CE high,start nRF905_Tx data transmission delay(1); // while (DR!=1);
TRX_CE=0; // Set TRX_CE low
}
//---------------------------------------------------数据发送-------------------------------------------------------------- void nRF905_Tx(void)
{
nRF905_SetTxMode();// Set nRF905 in nRF905_Tx mode
nRF905_nRF905_TxPacket();// Send data by nRF905
}
//--------------------------------------------------读取接收缓冲区数据----------------------------------------- void nRF905_RxPacket(void) //读数据
{
uchar i;
delay(1);
//TRX_CE=0; // Set nRF905 in standby mode
TRX_CE=0;
CSN=0; // Spi enable for write a spi command
delay(1);
SpiWrite(RRP);
for (i = 0 ;i < 4 ;i++)
{
nRF905_TxRxBuf[i]=SpiRead(); // Read data and save to buffer }
CSN=1;
TRX_CE=1;
}
{
nRF905_SetRxMode(); // Set nRF905 in Rx mode
delay(10);
if(nRF905_CheckDR())
nRF905_RxPacket();
}
