解放军电子工程学院 焦传海 将nRF9E5 UHF多段射频收发芯片应用于有源超高频(UHF)射频识别(RFID)系统中,给出了射频收发电路原理图和读写器设计框图及软件配,系统tOT作频率为433MHz
射频识别(Radio F requencyIdentification,RFID)技术是一种利用无线射频通信实现的非接触式自动识别技术,与目前广泛采用的条形码技术相比,RFID具有容量大、识别距离远、穿透能力强、抗污性强等特点。
RFID技术已经发展得比较成熟并获得了大规模商用,但超高频RFID技术相对滞后。本文分析了射频芯片nRF9E5的功能特性,并将其用于REID系统中,设计了一套有源超高频(UHF)RFID系统。
射频芯片的选取
目前,发展较为成熟的RFID系统主要是125kHz和13.56MHz系统,相应的RFID专用芯片也较多,主要有TI公司的S6700系列,NXP公司的MIFARE系列等。然而,用于UHFRFID的专用芯片却很少,TI公司和NXP公司虽然宣称已经量产符合Gen2的RFID芯片,但由于各种因素,还没能真正大量投入使用。再者,为了满足用户对远识别距离的要求,一般需使用有源UHF RFID系统,而目前有源UHF RFID专用芯片更是难觅其踪。所以,需要寻找一款适合超高频RFID且易于开发的低成本射频芯片,来设计有源UHF RFID系统。
随着集成电路产业的发展,8051内核已经被集成到各种片上系统(SoC)中,这些SoC具有更多的功能、更快的速度、更小的体积和功耗,同时可以继续使用8051MCU几十年来积累的各种应用软件资源,具有广阔的发展空间。许多国际知名公司,如TI、ATMEL、Chipcon、Nordic等都推出了各种兼容8051内核的新一代短距离无线通信芯片,Chipcon在2006年初被TI公司所收购。通过分析比较发现,Chipcon公司的CCl010和Nordic公司的nRF9E5都可用于UHFRFID系统,而nRF9E5体积更小、成本更低,且具有一些独特的功能。
nRF9E5功能分析
・结构组成
nRF9E5内嵌805 1兼容微控制器、RF收发器和4通道10位A/D转换器,其功能结构如图1所示。
nRF9E 5的片内微控制器与标准805l兼容,指令时序与标准8051稍有区别。中断控制器支持5个扩展中断源:ADC中断、SPI中断、唤醒中断和两个无线收发中断。此外,还扩展了两个数据指针,使得片外RAM存取数据更为方便。
nRF9E5内置收发器具有与单片射频收发器nRF905相同的功能,可通过片内MCU的并行口或SPI口与微控制器通信。收发器由频率合成器、功率放大器、调制器和接收单元组成。输出功率、频道和其他射频参数可通过对特殊功能寄存器RADIO编程进行控制。在发射模式(TX)下,最小工作电流仅为9mA(输出功率一10dBm),接收(RX)模式下的工作电流为12.5mA,掉电模式下的工作电流仅为2.5μA。可见,nRF9E5的功耗很低,比较适宜应用到有源RFID系统中,以延长电池寿命。
・载波检测
载波检测是nRF9E5的一大特色功能。在ShockBurst接收方式下,当工作信道内有射频载波出现时,载波检测引脚(CD)被置高。也就是说,当收发器准备发送数据时,它首先进入接收模式并检测所工作的信道是否可以发送数据(信道是否空闲),这是一种简单的传输前监听协议。载波检测的标准一般比灵敏度低5dB,比如,灵敏度为-100dBm,载波检测功能探测低至-105dBm的载波。这个特性很好地避免了同一工作频率下不同发射器数据包之间的碰撞,对于解决RFID系统中的碰撞问题很有帮助。
・ShockBurst工作模式
nRF9E5采用N0rdic公司的ShockBurst技术(自动处理前缀、地址和CRC),实现低速数据输入,高速数据输出,从而降低了系统的平均功耗。在ShockBurst接收模式下,当收到一个有效地址的射频数据包时,地址匹配寄存器(AM)和数据就绪寄存器(DR)通知片内MCU把数据读出。在ShockBurst发送模式下,nRF905自动给要发送的数据加上前缀和CR C校验码。当数据发送完后,数据就绪寄存器(DR)会通知MCU数据已经处理完毕。当系统没有发送和接收任务时,将进入空闲方式。ShockBurst技术降低了MCU存储器需求,同时也缩短了软件开发时间。
有源UHF RFID系统设计
・硬件设计
电子标签和读写器是RFID系统中最重要的硬件组成部分,将nRF9E5芯片应用于有源UHF RFID系统(工作频率为433MHz)中,设计有源电子标签电路和读写器框图。
有源RFID系统中的电子标签是自带电池的,可以主动发送信号,而不像无源标签需要读写器发出的无线电波能量激活才能工作。nRF9E5具有小体积、低功耗、优越的电源管理方式和极少的外围器件等特点,非常适用于有源电子标签中。
图2是有源标签的基本框图,其中电池可采用普通的3V纽扣电池,图3是射频收发电路的原理图,ANTl和ANT2为天线连接引脚,采用PCB环形差分天线,可以进一步减小标签的体积。25320为EEPROM,在nRF9E5上电后,系统根据引导程序,把25320中的程序代码拷贝到nRF9E5的4KB RAM中。晶振工作频率为16MHz,为了得到精确的内部偏置电压,通常在引脚IREF和地之间接一个阻值为22k Q,误差为1%的电阻。
RFID读写器的任务是控制射频模块向标签发射读取信号,并接收标签的应答,对标签的对象标识信息进行解码,将对象标识信息连带标签上其他相关信息传输到主机以供处理。读写器基本结构如图4所示,可以将读写器简化为控制系统和由射频收发器组成的射频模块两个基本的功能块。
控制系统通常采用ASIC组件和微处理器来实现,主要功能有:与应用系统软件进行通信,并执行从应用系统软件发来的动作指令;控制与标签的通信过程;信号的编码与解码;执行防碰撞算法;对读写器和标签之间传送的数据进行加密和解密;进行读写器和标签之间的身份验证。射频模块的主要功能是:产生高频发射能量;对发射信号进行调制,用于将数据传输给标签;接收并解调来自标签的射频信号。
在所设计的系统中,读写器中的射频模块与有源标签中的射频模块电路类 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文 似,只是为了更有效地传输射频信号,采用单端连接的50Ω阻抗天线,需要在芯片天线连接引脚和天线之间加一个匹配网络,如图5所示。
控制系统中的微控制器可采用高性能的单片机或ARM处理器,数字处理单元可以采用DSP或FPGA进行设计,而RS-232串口、以太网口是为和PC提供更多的接口选择,这些内容很多文献已做了大量研究,这里不再详述。在本系统中,采用三星的ARM9$3C2440A作为微控制器,将Xilinx Spartan-3E系列FPGA XC3S500E用作数字处理单元。
・通信协议标准
由于读写器与标签之间的通信可能会受到其他数据终端或外界环境的干扰而发生错误,因此,需要通信协议来保证数据传输的可靠性。nRF9E5的协议格式参见表1,其中,前缀就是数据头,设备地址包括读写器地址和标签地址,CRC校验码可选为8位或16位。
目前生产RFID产品的很多公司都采用自己的协议标准,国际上还没有统一的标准。就发展趋势来看,对于超高频(UHF)RFID系统,ISO/IEC 18000-7(针对433MHz有源RFID系统)和EPCglobal Classl Gan2(针对860MHz ~960MHz无源RFID系统)协议标准,有望成为统一的国际标准。本文所设计的RFID系统通信协议依据ISO/IEC 18000-7协议标准。读写器到标签的通信数据格式参见表2,其中用户ID、标签ID和参数为可选项,由命令类型决定是否选用。标签到读写器广播式响应的通信数据格式参见表3。
・软件配置
在整个系统的软件设计中,无线射频数据的传输是最主要的部分。首先要对nRF9E5进行初始化配置,这可以通过设置RF配置寄存器来完成,配置内容包括工作频率、输出功率、自动重发功能、校验码长度等。部分代码如下。
#define HFREQ_PLL 0//0=433MHz,1=868/915MHz
#define PA_PWR 3 //0=最小功率,…,3=最大功率
接define CRC_MODE 1//0=8位校验码,1=16位校验码
无线数据发送和接收的流程分别如图6和图7所示。图中TRX_CE为发送和接收使能寄存器位,DR为数据就绪寄存器位,AM为地址匹配寄存器位,AUTO_RETRAN为自动重发寄存器位。ShockBurst工作模式在前文已有介绍。
本系统防碰撞问题尚未完全解决,在实际应用中,需要重点考虑。除前文提到nRF9E5的载波检测功能外,还需要有专门的防碰撞算法。目前,用的较多的方法是ALOHA法和二进制树搜索算法,以及由它们改进发展得到的一系列算法,见参考文献5~7。
结束语
nRF9E5是目前外接元件需求最少的单片RF收发芯片之一,覆盖了国际上通用的ISM频段,具有很多优良的特性,适于构建各种无线数传通信平台,文中将其应用于RFID系统中,设计了一套有源UHF RFID系统,实验测试显示,最大通信距离近100米,有效识别距离超过20米。这只是初步尝试,更多工作需要深入研究,系统实用性有待于进一步验证。
IEEE推出802.16m标准 兼容WiMAX和4G
据美国电气电子工程学会(IEEE)最新公布的802.16无线宽带技术草案文本,该机构目前正在研究一项无线传输新标准――802.16m。据称新标准至少还需一到两年才能出台,IEEE的文件显示,使用该标准后,无线数据传输速率可达1Qb/s。事实上,802.16m是满足速率达1Gb/s的nomadic传输模式或高效强信号模式所必需的条件。
据报道,802.16m标准在快速移动状态下的传输速率可达1 OOMb/8。新标准之所以能达到以上速率,主要归功于MIMO(多输入多输出)技术,802.11g和802.11n标准路由器及接入节点目前已广泛采用MIMO技术。54Mb/s的路由器在采用了MIMO技术之后,理论传输速率可达108Mb/s。
IEEE委员会表示,802.16m标准不属于WiMAX标准,但可以在两标准之间建立一个共享平台。据称802.16m标准还可以兼容未来的4G标准网络,预计4G无线网络两到三年之后会在手机中得到应用。4G技术将以OFDMA标准为基础,到时目前的WCDMA和CDMA2000两项标准将不再使用。而IEEE表示,802.16m标准将兼容OFDMA技术。
802.16m标准将大大提高移动设备的数据传输速率,但IEEE打算首先将该技术应用于军事领域,然后才向民用市场全面推广。IEEE的一份有关802.16m标准的文件显示,应用于军事将有助于推动该项标准早日出炉。
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。 本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文
根据这篇文章
>
1一般要先检查硬件是不是有问题哈,一定要仔细,特别是芯片的供电,单片机供电,然后是之间的连接
2确认硬件无故障之后,你可以整个最最简单的程序,发送1bit数据,然后用8个led把发送的data显示出来,接收端也同样处理。看看是否运行顺利。
3如果在不行,还是用最简单的程序,然后用示波器依次检查nRF的引脚信号是否正确,特别是把CE、SCK、CSN以及MOSI、MISO对照着看,是否和nRF说明书上的时序一致,这样虽然麻烦 但肯定能找到问题。
注:很多中午PDF资料上内容不全,连接收、发送的时序也没。建议看英文厂商原版的资料;我附了ShockBurst模式下的发送、接收时序图,你可以直接参考下~
希望我的回答对你有所帮助哈~
你好:
状态字是当前NRF发送中断、接收中断、重发最大次数中断等的标志。
一个调试好的NRF,状态字个人感觉用处不大,但是在调试期间作用相当大,以此判断是发送的问题还是接收的问题。
是的,当然是先选择寄存器,再写值。
希望我的回答能帮助到你。
IAP,是在程序运行期间,向程序存储器,写入程序。
STC 的单片机支持这样做。
注意,正在运行的程序,它所在的程序存储器,和即将写入的程序存储器,
是两个可以互相转换的部分。它们的起始地址都是0000H。
STC 的单片机上电时,它先从一个0000H开始执行它们公司预先存好的程序。
此后,我们才能利用 PC 上的下载软件,向单片机写入我们自己编写的程序。
存放到另一个0000H开始的程序存储器。
上电下载程序,这也就是一个 IAP 过程。
下载后,它自动转向我们程序所在的0000H地址,开始执行刚刚下载的程序。
楼主想要在你的程序运行期间,再改写程序存储器,就只能擦除掉 STC 公
司预先存好的那部分程序。
那么,这块芯片,就再也不能进行《上电后下载程序》的工作了。
通常,没有足够的把握,是不会做这样的 *** 作的。
NRF905的程序中只有nRF905Init();Config905();RX(); 前两个初始化,后个传输函数,执行后在TRXBUF数组中会有相应的值。以下是接收的主函数,这是控制电机左右转动的程序。(小车部分)
void main(void)
{
nRF905Init();
Config905();
while(1)
{
RX();
if(TxRxBuf[0]==0x11){in1=1;in2=0;in5=1;in6=0;}//从左往右
if(TxRxBuf[1]==0x11){in3=1;in4=0;in7=1;in8=0;}//从右往左
if(TxRxBuf[0]==0x22){in1=1;in2=1;in5=1;in6=1;}//从左往右
if(TxRxBuf[1]==0x22){in3=1;in4=1;in7=1;in8=1;}//从右往左
in1=1;in2=0;
}
}
遥控部分:就俩按键 一个做转一个右转 这是无线遥控小车的遥控部分。
void main(void)
{
nRF905Init();
Config905();
while(1)
{
if(KEY0 ==0){TxRxBuf[0]=0x11;}
if(KEY0 ==1){TxRxBuf[0]=0x22;}
if(KEY1 ==0){TxRxBuf[1]=0x11;}
if(KEY1 ==1){TxRxBuf[1]=0x22;}
SetTxMode();// Set nRF905 in Tx mode
TxPacket(TxRxBuf);// Send data by nRF905
}
}
那么在设置上:就按以下设置:
#include <reg52h>
#include <ABSACCh>
#include <intrinsh>
#include <stdioh>
//----------------------------------------------------------------------------------------------------------------
#define uint unsigned int
#define uchar unsigned char
//----------------------------------------------------------------------------------------------------------------
#define BYTE_BIT0 0x01
#define BYTE_BIT1 0x02
#define BYTE_BIT2 0x04
#define BYTE_BIT3 0x08
#define BYTE_BIT4 0x10
#define BYTE_BIT5 0x20
#define BYTE_BIT6 0x40
#define BYTE_BIT7 0x80
//----------------------------------------------------------------------------------------------------------------
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;
//---------------------------------------------------发送数据缓冲区-------------------------------------------------
#define TxRxBuf_Len 4
unsigned char TxRxBuf[TxRxBuf_Len]=
{
0x29,0x30,0x31,0x32,
};
//----------------------------------------------NRF905控制IO------------------------------------------------------
sbit TXEN=P1^0;
sbit TRX_CE=P3^2;
sbit PWR=P1^1;
//----------------------------------------------NRF905 SPI接口---------------------------------------------------
sbit MISO=P1^6;
sbit MOSI=P1^5;
sbit SCK=P1^7;
sbit CSN=P1^3;
//----------------------------------------nrf905状态标志---------------------------------------------------------
sbit AM=P1^4;
sbit DR=P3^3;
sbit CD=P1^2;
//---------------------------------------------------------------------------------------------------------------
sbit led3=P2^0;
sbit led2=P2^1;
sbit led1=P2^2;
sbit led0=P2^3;
//--------------------------------------------------------------------------------------------------------------
sbit KEY0=P3^6;
sbit KEY1=P3^7;
//--------------------------------------------------------------------------------
sbit BELL=P3^4;
//-----------------------------------------------------------------------------------------------------------------
uchar seg[10]={0xC0,0xCF,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段码
//-------------------------------------------------------nrf905控制指令-------------------------------------------
#define WC 0x00
#define RC 0x10
#define WTP 0x20
#define RTP 0x21
#define WTA 0x22
#define RTA 0x23
#define RRP 0x24
//------------------------------------------------NRF905寄存器配置------------------------------------------------
unsigned char idata RFConf[11]=
{
0x00, //配置命令//
0x4c, //CH_NO,配置频段在430MHZ
0x0c, //输出功率为10db,不重发,节电为正常模式
0x44, //地址宽度设置,为4字节
0x04,0x04, //接收发送有效数据长度为32字节
0xCC,0xCC,0xCC,0xCC, //接收地址
0x58, //CRC充许,8位CRC校验,外部时钟信号不使能,16M晶振
};
code TxAddress[4]={0xcc,0xcc,0xcc,0xcc};
char tf;
//------------------------------------------------延时------------------------------------------------------------
static void Delay(uchar n)
{
uint i;
while(n--)
for(i=0;i<80;i++);
}
//---------------------------------------------------SPI读函数-----------------------------------------------------
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;
}
//-------------------------------------------------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;
}
SCK=1;
DATA_BUF=DATA_BUF<<1;
SCK=0;
}
}
//------------------------------------------------------初始化nRF905---------------------------------------------
void nRF905Init(void)
{
CSN=1; // Spi disable
SCK=0; // Spi clock line init low
DR=0; // Init DR for input
AM=0; // Init AM for input
CD=0; // Init CD for input
PWR=1; // nRF905 power on
TRX_CE=0; // Set nRF905 in standby mode
TXEN=0; // set radio in Rx mode
}
//-----------------------------------------------------初始化寄存器-----------------------------------------------
void Config905(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 TxPacket(uchar TxRxBuf)
{
uchar i;
//Config905();
CSN=0;
SpiWrite(WTP); // Write payload command
for (i=0;i<4;i++)
{
SpiWrite(TxRxBuf[i]); // Write 32 bytes 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(TxAddress[i]);
}
CSN=1; // Spi disable
TRX_CE=1; // Set TRX_CE high,start Tx data transmission
Delay(1); // while (DR!=1);
TRX_CE=0; // Set TRX_CE low
}
//----------------------------------------------------------设置发送状态---------------------------------------------
void SetTxMode(void)
{
TRX_CE=0;
TXEN=1;
Delay(1); // delay for mode change(>=650us)
}
//-----------------------------------------------设置发送状态---------------------------------------------------
void SetRxMode(void)
{
TXEN=0;
TRX_CE=1;
Delay(1); // delay for mode change(>=650us)
}
//-------------------------------------------------判断数据接收状态-----------------------------------------------------
unsigned char CheckDR(void) //检查是否有新数据传入 Data Ready
{
if (DR=1&&TRX_CE==1 && TXEN==0)
{
// Delay(50) ;
return 1;
}
else
{
return 0;
}
}
//----------------------------------------------------读NRF905接收数据------------------------------------------------------------
void RxPacket(void)
{
uchar i;
Delay(1);
// TRX_CE=0; // Set nRF905 in standby mode
Delay(100);
TRX_CE=0;
CSN=0; // Spi enable for write a spi command
Delay(1);
SpiWrite(RRP);
for (i = 0 ;i < 4 ;i++)
{
TxRxBuf[i]=SpiRead(); // Read data and save to buffer
}
CSN=1;
Delay(10);
TRX_CE=1;
}
//--------------------------------------------------------数据接收------------------------------------------------
void RX(void)
{
SetRxMode(); // Set nRF905 in Rx mode
while (CheckDR()==0);
Delay(10);
RxPacket();
}
这些是子函数。只要把一些关于电机的sbit定义去掉,剩下的就是真正的子函数了。
那么,需注意的就只有nRF905Init();Config905();RX(); SetTxMode();和一个TXbuf数组,把这几个用好了,程序就跳出来了。nRF905Init();Config905();收发都需要,SetTxMode();发送要,RX(); 接收要。就是这样了,最起码我看是这样。
以上就是关于超高频_基于nRF9E5的有源超高频RFID系统设计全部的内容,包括:超高频_基于nRF9E5的有源超高频RFID系统设计、NRF SDK12 空中升级时 通过python2.7安装nrfutil 出错,如何解决、nRF24l01 接收到的数据全是0xff,不插电源也是这样,改了很多程序都不行~~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)