系统级RF芯片nRF24E1收发原理与应用编程_无线通信论文
关键词:nrf24e1 射频 无线通信 配置
引言
nrf24e1收发器是nordic vlsi推出的系统级射频芯片,采用先进的0.18μm cmos工艺、6mm×6mm的36引脚qfn封装,以nrf240 rf芯片结构为基础,将射频率、8051mcu、9输入10位adc、125通道、uart、spi、pwm、rtc、wdt全部集成到单芯片中,是目前世界首次推出的、全球2.4ghz通用的、完事的低成本射频系统级芯片。
由于nrf24e1片内集成了radio模块,在使用中,只需要一片nrf24e1和少数的外围元件就能完成射频收发功能,因此,大大减少了系统的体积。使用nrf24e1时,必须进行相应的配置工作。下面,详细讲述nrf24e1的收发原理和编程方法,以供读者设计时参考。有关nrf24e1的介绍请见今年第6期。
1 radio口
nrf24e1收发器的收发任务由radio口控制。radio口使用标准8051中的p2口地址。由于射频收发器是片内置的,并不是双向工作。为了满足射频收发子系统的需要,radio口的默认值与标准8051的p2默认值也不一样。
收发器由特殊功能豁口中的radio(0a0h)和spi_ctrl(0b3h)控制。spi_ctrl=00b时,spi没用;spi_ctrl=01b时,spi连接到p1口;spi_ctrl=10b时,spi连到第一个nrf2401频道;spi_ctrl=11b时,spi连接到第二个nrf2401频道。radio豁口的各个位如图1所示。在nrf24e1头文件中,所定义的各个位的名字与图1中一样。
(1)用spi口控制收发器
用芯片内嵌的spi口控制收发器的操作非常方便。如rf配置和shockburst rx(接收)或tx(发送)。
(2)复位时radio口的状态
复位引脚为高电平时(无论是时钟是否有效),控制nrf2401收发子系统的radio输出位默认为radio.3(cs)=0,radio.6(ce)=0,radio.7(pwr_up)=1。程序运行后,保持默认值,直到程序通过radio寄存器改变各位的值。
2 收发方式
通过pwr_up、ce和cs三个控制引脚,可以设置nrf2401的工作方式。pwr_up=1,ce=1,cs=0为收发方式;pwr_up=1,ce=0,cs=1为配置方式;pwr_up=1,ce=0,cs=0为空闲方式;pwpwr_up=0时关机。
2.1 shockburst
nrf24e1的nrf2401收发子系统的收发方式只有shockburst。shockburst的功能由配置字决定。shockburst技术使用了片内的fifo(先入先出)堆栈。虽然数据低速进入,但能高速发送,使能耗减到最低限度。
(1)shockburst发送
cpu接口引脚为ce、clk1、data,工作流程如下:
①cpu有数据要发送时,把ce置高,nrf2401开始工作。
②接收节点地址和有效数据按时序被送到nrf2401子系统,可通过应用协议或cpu设置,使这个速度小于1mbps(如10kbps)。
③cpu把ce置低,激活shockburst发送。
④shockburst。
*给rf前端供电;
*完成rf包处理(加前缀,crc校验);
*数据高速发送(250kbps或1mbps,可由用户配置决定);
*发送完成,nrf2401返回空闲信号。
(2)shockburst接收
cpu的接口引脚为ce、dr1、clk1、data,工作流程如下:
①校验接收到的rf包的地址和欲接收的rf包中有效数据的长度。
②把ce置高,激活rx。
③经过200μs处理,nrf2401子系统监视启动并等待信号的到来。
④当收到一个有效的数据包(正确的地址和crc),nrf2401子系统移去前缀、地址和crc位。
⑤nrf2401子系统通过把dr1置高来通知cpu。
⑥cpu把ce置低,把rf前端设为低功耗方式。
⑦cpu将按时序以适当的速度(如10kbps)把有效数据取出。
⑧当所有的有效数据都送完,nrf2401子系统再次把dr1置低。如果ce保持为高,准备接收下一个数据包;ce为低,重新开始新的接收。
2.2 duoceiver
shockburst收发方式使nrf24e1能够方便地同时接收两个不同频率的频道发送的数据,并且能够使接收速度达到最大值。这意味着:
*nrf24e1通过一个天线,能够接收两个频率相差8mhz(8个频率通道)的1mbps发射器(如nrf24e1、nrf2401或nrf2402)发送的数据。
*这两个不同数据频道的数据被分别送到两套不同的接口——数据频道1为clk1、data和dr1,数据频道2为clk2、dout2和dr2。
duoceiver技术提供了两个独立、专用于接收的数据频道,而不是采用两个相互独立的接收器。使用第二个数据频道必须满足要求:第二数据频道的工作频率至少比第一个频道的工作频率高8mhz。使用shockburst技术,cpu先取出其中一个数据频道中的数据,另一数据频道中的数据等待cpu处理完。这样不至于丢失数据;同时,也降低了对cpu性能的要求。
3 器件配置
在配置方式下,配置字最高可达18字节。nrf2401子系统的配置字通过一个简单的三线接口(cs、clk1和data)送给配置寄存器。
3.1 shockburst的配置
shockburst方式配置字的作用是使nrf2401子系统能够处理rf协议。在实际操作中,一旦完成协议并装入了nrf2401子系统,只有1字节(bit[7:0])的配置字需要更新。用于shockburst的配置字分为如下四块(详见表2):
*有效数据宽度(data2_w和data1_w),指明rf包中有效数据的位数,这使nrf2401子系统能够区分接收到数据包中的有效数据和crc字节;
*地址宽度(addr2和addr1),设置rf数据包中地址字节所占用的位数,最高为40位,这使nrf2401字节系统能够区分地址和有效数据;
*接收频道地址(addr_w),即接收数据的目标地址;
*crc配置(crc_l和crc_en),crc_l用于设置crc为8位或16位校验,crc_l=0为8位,crc_l=1为16位,crc_en使能片内的crc。
在发送方式,cpu必须产生与接收数据的nrf2401子系统配置相同的地址和有效数据块。当使用nrf240子系统片内的crc特性时,注意crc是否已经使能,并且注意在发送器和接收器上使用相同的长度。
3.2 配置字描述
配置字的读取在clk1的正边沿时,从msb(最高位)开始。新的配置从cs的下降沿开始。假如nrf2401子系统需要配置为shockburst方式,两个接收频道,则在vdd(芯片电源)上电后,只需120位的配置字。在协议、工作方式和接收频道都配置好后,只需要1位(rxen)来切换是接收或发射。在配置字被读取的过程中,msb(最高位)最先被读到寄存器中。默认配置字为:h8e08.1c20.2000.0000.00e7.0000.e721.0f04,共18字节,可根据需要进行取舍。
shockburst数据包的总位数最多不能超过256位,可通过式(1)计算有效数据的最大位数。
datax_w(bits)=256-addr_w-crc (1)
其中:addr_w为配置字中b[32:18]所设置的接收地址的长度,8位~40位;crc为配置字b[17]所设置的校验字,8位或16位。4位或8位前缀是自动加进去的,不占用数据包的位数。由式(1)可知,要想在每个数据包中得到更长的有效数据,可减少地址和crc校验位。
3.3 收发常用的配置
在两个接收频道的方式下,nrf24e1同时接收来自两个不同频率频道的数据。第一个频道的频率在配置字b[7-1]中设置,第二个频道通常比第一个频道的频率高8mhz。rx2_en(b[15])为第二个频道的使能位:rx2_en=0时,第二个频道不工作;rx2_en=1时,第二个频道使能。rfdr_sb为收发速率设置位:rfdr_sb(b[13])=0时,收发速率为250kbps;rfdr_sb=1时,收发速率为1mbps。16mhz晶振时,250kbps的收发灵敏度比1mbps的高10db。xo_f(b[12-10])为晶振选择位。rf_pwr(b[9-8])设置nrf24e1射频输出功率。
rf_ch#(b[7-1])设置nrf24e1的工作频率,可通过式(2)计算发射频率和频道1的接收频率,通过式(3)计算频道2的接收频率。rxen为收发切换位。
channelrf=2400mhz+rf_ch#×1.0mhz (2)
channelrf=2400mhz+rf_ch#×1.0mhz+8mhz (3)
4 数据包描述
完整的射频数据包由四部分组成:前缀、地址、有效数据和crc。前缀一般是8位,也要吧设置为4位,由地址的首位决定。如果地址的首位是0,前缀为01010101;如果地址的首位是1,前缀为10101010。shockburst方式,前缀、地址和crc都是在接收器收到数据包后自动移去只留有效数据。
5 应用中的程序
下面所述的程序都是在keil c51 v7.07下调试通过的。限于篇幅,只分析其中的主要函数代码。
(1)系统初始化函数
void init(void){
//配置i/o口
p0_alt=0x06;//p0_alt=00000110b,p0.1为rxd,p0.2为txd
p0_dir=0x09;//p0_dir=00001001b,p0.0和p0.3设为输入
p1_dir=0x03;//p1_dir=00000011b,p1.0和p1.1设为输入
…………//其它i/o口配置
pwr_up=1;//开radio,读时不用,写时为电源
spiclk=0;//spi时钟为xtal/8
spi_ctrl=0x02;//把spi与第一收发通道(ch1)相连
…………//串口配置、a/d配置等,或自己系统相关的一些配置
}
(2)接收器配置函数
void init_receiver(void){
unsigned char b;
cs=1;//打开配置方式
for(b=0;b<rconf.n;b++){ //b<15
spireadwrite(rconf.buf[b]); //发送接收器配置字
}
cs=0; //关配置方式
ce=1; //使能收发功能
}
(3)接收函数
void receiver(void){
unsigned char b;
cs=1; //打开配置方式
for(b=0;b<rconf.n;b++){
spireadwrite(rconf.buf[b]); //发送接收器配置字
}
cs=0; //关配置方式
for(;;){
b=receivepacket(); //接收数据包
…………//接收后的处理函数等,可自己扩展
}
}
(4)发送函数
void transmitter(void){
unsigned char b;
cs=1; //开配置方式
for(b=0;b<tconf.n;b++){
spireadwrite(tconf.buf[b]);//发送发送器配置字
}
cs=0; //关配置方式
b=keybyte; //读取数据
transmitpacket(b); //发送数据
}
(5)其它
nrf24e1程序除了主要的初始化配置函数、接收器配置函数、接收函数和发送函数外,还有接收包处理函数、发送包处理函数、接收器配置字和发射器配置字等。keil c51 v7.01及其以且的版本都支持nrf24e1,因此,编程非常方便。由于nrf24e1只有512字节的rom,所以,在使用过程中,要扩展片外存储器(nordic公司推荐使用25320)。应用中,当vdd上电后,芯片通过spi接口自动从片外存储器读取数据到片内4kb和ram中以便程序运行时使用。