基于nRF24E1无线传输的设计与应用
引言
随着科技的进步,越来越多的无线技术正快速应用到各种产品中。nrf24e1是挪威nordic公司推出的一款单片2.4ghz无线收发芯片,采用0.18
m cmos技术制造,以增强型51为内核,9路10bitadc,采样率可达100k,具有125个频道,传输速率可达1mbps,内置crc校验并支持多点通信。1.9~3.6v低功耗工作,内置电压监视和复位电路,多种省电模式可供选择,待机电流仅为2
a。nrf24e1可广泛应用于无线水表、煤气、电表;无线智能传感器;无线数据采集装置;无线身份识别智能卡;无线火警探头;无线耳机、麦克风;无线鼠标、无线键盘;pda手持终端等短距离无线通信场所。
概述
nrf24e1功能介绍
nrf24e1结构框图如图1所示。

nrf24e1微处理器的指令系统与工业标准的8051相兼容,但两者的执行时序稍有不同。通常,nrf24e1片内微控制器、的指令周期为4到20个指令周期,而工业标准的8051为12~48个时钟周期。nrf24e1的中断控制器支持adc、spi、rf接收器1、rf接收器2、唤醒定时器、5个中断源。nrf24e1拥有3个与8052一样的定时器。在传统的异步通信方式下,与8051兼容的uart可用作定时器1和定时器2的波特率发生器。nrf24e1的cpu集成了2个数据指针,以便于和外部ram进行数据传递。晶振直接为nrf24e1的微控制器提供了时钟来源。
nrf24e1的微控制器中有256字节的数据ram和512字节的rom。上电复位或经软件初始化后,处理器自动加载rom引导区中的代码。用户程序通常是在引导区的引导下,从外部串口eeprom加载到1个4kb的ram中,这个4kb的ram也可作存储数据用。如果不使用掩膜rom(即内含的rom),程序代码必须从外部非易失性存储器中加载。这时,默认的启动引导区使用spi接口的“通用25320”eeprom。为了控制标准8051没有的功能,nrf24e1增加了一些特殊功能寄存器,如radio(p2)、adccon、adcdatah、pwmcon、pwmduty、rstreas等。其p0和p1也和标准8051有所不同,其它大部分的sfrs均与标准8051相同。
pwm
nrf24e1有一个可编程pwm输出,它和dio9共同复用p0.7引脚,并可软件编程决定pwm工作于6、7或8位。
spi(串行外设接口)
spi的3个口(sdi、sck和sdo)与gpio(din0、dio0和dio1)共同复用p1口的三个引脚(p1.0、p1.1、p1.2)。spi硬件不产生任何片选信号,通常用gpio位(p0口)来作为外部spi设备的片选口。
端口逻辑
nrf24e1有1个输入,10个输出引脚。p0(dio2~dio9)和p1(dio0、dio1、din0)默认配置为gpio(通用输入输出端口)。多数gpio在程序控制下可复用,这些复用功能包括两个外部中断,uart rxd和txd,一个spi主机端口,三个定时器和pwm输出。
rtc唤醒定时器、wtd(看门狗)和rc振荡器
nrf24e1内有一个低功耗的rc振荡器。该振荡器在vdd≥1.8v时,会持续工作。rtc唤醒定时器和wtd(看门狗)是2个16位的可编程定时器,它们的工作时钟为rc振荡器的lp_osc。唤醒定时器和看门狗的定时时间约为300 s~80ms,其默认值为10ms。唤醒定时器由用户软件控制启动和停止。看门狗在复位后被禁止,再次复位后才能被激活。
a/d转换器
nrf24e1内有9通道10位adc,线性转换时间为每10位48个cpu指令周期。a/d转换器可在arfe输入和内部1.22v的带隙参考之间进行软件选择。转换器的9个输入可由软件进行选择。通道0~7可以转换对应引脚ain0~ain7上的电压值,通道8用于对nrf24e1工作电压的监控。a/d转换器默认配置为10位,为满足需要,可通过软件使其工作于6位、8位或12位方式。
无线收发器
nrf24e1收发器通过内部并行口或内部spi口与其他模块进行通信,同单片射频收发器nrf2401具有相同的功能。duoceiver接收器输出的数据准备信号,可通过程序使其作为微处理器的中断或通过gpio口传给cpu。nrf24e1工作于全球开放的2.4~2.5ghz频段。收发器由1个完整的频率合成器、1个功率放大器、1个调节器和2个接收器组成。输出功率、频道和其它射频参数可通过对radio寄存器(sfr 0xa0)编程进行控制。发射模式下,射频电流消耗仅为10.5ma,接收模式下为18ma。为了节能,可通过软件程序控制收发器的开/关。
硬件设计
nrf24e1收发核心电路如图2所示。

由于本设计要求pcb板越小越好而且成品要密封,所以如何供电成了这次设计的难点。若使用电池则有持续时间短、占用面积大和易震动脱落等缺点。nrf24e1电源电压是1.9~3.6v,且功耗很低。max2323及串口eeprom25aa320均可工作在3.0v,因此在该设计中摒弃了由电池供电的做法,而采用了从串口取电源作为整个电路的供电系统。其串口取电源电路如图3所示。

软件设计
nrf24e1具有增强型8051内核,keil c51支持nrf24e1开发,因此利用c51开发经验即可编出高效优质的代码。此程序是经keil c51 v7.05编译并调试通过,篇幅有限,仅列出主要功能函数。
(1)初始化程序如下:
void init(void){
//配置i/o口
p0_alt=0x06; // p0.1为rxd,p0.2为txd
p0_dir=0x09; // p0.0和p0.3设为输入
p1_dir=0x03; // p1.0和p1.1设为输入
pwr_up=1; //开radio,读时不用,写时为电源
spiclk=0; //spi时钟为xtal/8
spi_ctrl=0x02; //把spi与收发通道1(ch1)相连
//串口通讯初始化
th1 = 0x0f3; // 晶振为16mhz,波特率为19200(当t1m=1且smod=1时)
ckcon |= 0x10; // t1m=1 (计数器时钟为cpu时钟的1/4)
pcon = 0x80; // smod=1 (双倍波特率)
scon = 0x52; // 采用串口模式1,使能接收器
tmod = 0x20; // 使用计数器1,8位计数值自动重载
tcon = 0x40; // 启动计数器
}
(2)接收器配置函数
void init_receiver(void){
unsigned char b;
cs = 1; //打开配置方式
delay100us(0);
for(b=0;b
spireadwrite(rconf.buf[b]); //发送接收器配置字
}
cs = 0; // 关配置方式
ce = 1; // 使能收发功能
} (3)接收函数
void receiver(void){
unsigned char b;
cs = 1; //打开配置模式
delay100us(0);
for(b=0;b
}
cs = 0; //关配置模式
for(;;){
b = receivepacket(); //接收数据包
putchar(b); //串口通信函数,将接收到的数据通过串口传送
}
}
(4)发送函数
void transmitter(void){
unsigned char b;
cs = 1;
delay100us(0);
for(b=0;b
}
cs = 0;
for(;;){
b= readadc(); // 读a/d转换结果
putchar(b);
transmitpacket(b); // 发送数据包
}
}
此程序除了以上函数外,还有串口通讯函数、读a/d转换结果函数、接收包处理函数和发送包处理函数等。
结论
本设计电路简单,易于实现。经实际调试应用完全可用于点对点及点对多点的无线数据传输,收到了良好的效果。1mbps完全满足一般无线传输的要求。若进行批量生产时可将程序写进nrf24e1的内部ram中,从而省去了外部串口eeprom,节约了成本。
评论