如何利用CC2530实现无线串口

cc2530是符合802.15.4标准的无线收发芯片,但是本文并没有遵守802.15.4协议规则,在发送过程中忽略了网络id、源地址和目标地址等参数,在接收的过程中禁止了帧过滤。通过发送和接收过程的处理使得cc2530无线部分的使用尽可能的简单清晰,通过最少的代码说明问题。
无线芯片的调试具有一定的难度,一般存在发送设备和接收设备。为了通过最简单的代码说明无线芯片的使用,本文中仅编写一种设备代码同时实现发送和接收功能。设备的功能也相对简单,cc2530从串口接收数据并把数据通过rf部分“无损”发送,于此同时cc2530把从rf部分接收的数据通过串口“无损”发送,通过这样的方式实现无线串口。
串口数据属于“流”型数据包,rf部分属于“帧”型数据包。在串口数据处理与分析中,一般采用特定的串口头和长度的方式解析数据,但是本文采用通过串口时间间隔的方式接收数据,这种方法等同于modbus-rtu串口数据处理方法。通过这种检测字节数据时间间隔的方法使得cc2530的串口部分可以接收无特殊格式要求的数据,真正实现无线串口功能。
代码仓库位于bitbucket,请使用hg克隆或下载zip包,请勿使用任何版本的ie浏览器,除非您了解html4和html5对于浏览器的影响,推荐使用谷歌或火狐浏览器,若使用国产双核浏览器请切换到极速模式。
1.1实验准备
为了实现无线串口功能,需要准备两套cc2530模块和一个仿真器。如果条件允许可以增加一个仿真器,仿真器可以是cc debugger也可以是smartrf04eb,同时也可以准备一套cc2531 usbdongle做为嗅探器,抓取rf发送数据做调试分析。
1.2 实验结果
本文主要实现了无线串口功能,通过串口调试助手发送字节数据。例如通过串口向设备a发送hello cc2530,设备b可收到hello cc2530,并把该字符串通过串口调试助手打印至屏幕。设备b发送hello rf,设备a同样可以收到数据并打印至屏幕。
图1.2.1(a-b) 设备a和设备b串口调试界面
图中中括号包含的数字为rssi结果,rssi表示接收信号强度,例如图中的-28。rssi结果的单位为dbm,dbm为绝对单位且参考的标准为1mw。
2.初始化
rf部分的寄存器较多,需要耐心阅读数据手册和相关工具才可以完成设置。虽然rf部分的寄存器较多,但是还是借助smartrf工具、数据手册和示例代码,依然可以总结出使用cc2530无线部分的一般方法。
初始化部分包括接收数据包帧过滤控制,发射功率控制和信道选择;借助smartrf工具生成若干推荐值;打开接收终端并进入接收状态。
2.1 代码
voidrf_init()
{
frmfilt0=0x0c;//静止接收过滤,即接收所有数据包
txpower=0xd5;//发射功率为1dbm
freqctrl=0x0b;//选择通道11
ccactrl0=0xf8;//推荐值smartrf软件生成
fscal1=0x00;
txfiltcfg=0x09;
agcctrl1=0x15;
agcctrl2=0xfe;
txfiltcfg=0x09;
rfirqm0|=(1《《6);//使能rf数据包接收中断
ien2|=(1《《0);//使能rf中断
rfst=0xed;//清除rf接收缓冲区isflushrx
rfst=0xe3;//rf接收使能isrxon
}
2.2 分析
frmfilt0的默认值为0x0d,该寄存器的最后一位为frame_fliter_en,该位的具体含义为使能帧过滤,该位在接收过程中发挥重要的作用。cc2530是符合802.15.4协议的rf芯片,在802.15.4协议中,mac层有固定的协议格式和不同种类的命令,协议中包括命令类型、源地址和目标地址等重要信息,使能该位cc2530可以自动过滤不需要接收的无线数据帧,例如无线数据帧的目标地址和cc2530寄存器中的自身地址不符合,那么cc2530可以忽视该无线数据帧且不会触发中断。具体的过滤过程可以查看数据手册,在这里不详细解释。为了实现最简单的应用,禁止该位使得cc2530可以接收任意无线数据帧。
关于frmctrl0,本程序中保留了默认值所以并没有在代码中体现。从网上查找的代码中,绝大多数代码使能了auto_ack标志位,即使得cc2530芯片可以自动应答无线数据帧。从表面上看,cc2530的应答机制可以保证无线通信的可靠性,但是这种应答机制需要遵循802.15.4标准,若使能自动应答,那么cc2530发送的数据包也必须符合802.15.4标准。为了尽可能的简单,本程序禁止了该位。
关于frmctrl0,autocrc默认为使能状态,cc2530会自动进行crc校验的计算和解析。
smartrf可以帮助用于生成若干比较冷门的寄存器的建议值,这些寄存器关系到cc2530无线调试和解调相关部分,在实际使用的过程中可以采纳建议值不做深究。
初始化最后,使能rf接收终端。并通过rfst寄存器写入清空接收缓冲区和进入接收状态命令。
3.发送过程3.1 代码
voidrf_send(char*pbuf,intlen)
{
rfst=0xe3;//rf接收使能isrxon
//等待发送状态不活跃并且没有接收到sfd
while(fsmstat1&((1《《1)|(1《《5)));
rfirqm0&=~(1《《6);//禁止接收数据包中断
ien2&=~(1《《0);//清除rf全局中断
rfst=0xee;//清除发送缓冲区isflushtx
rfirqf1=~(1《《1);//清除发送完成标志
//填充缓冲区填充过程需要增加2字节,crc校验自动填充
rfd=len+2;
for(inti=0;i
{
rfd=*pbuf++;
}
rfst=0xe9;//发送数据包istxon
while(!(rfirqf1&(1《《1)));//等待发送完成
rfirqf1=~(1《《1);//清除发送完成标志位
rfirqm0|=(1《《6);//rx接收中断
ien2|=(1《《0);
}
3.2 分析
发送过程本身不困难,大致可分为侦听sfd清除信道,关闭接收中断,填充缓冲区,启动发送并等待发送完成,最后恢复接收中断。在这几个过程中唯一需要说明的便是填充缓冲区过程,在初始化过程中提到frmctrl0寄存器,该寄存器中auto_crc标志位默认为使能状态,阅读数据手册不难发现,cc2530的物理层负载部分第一个字节为长度域,填充实际负载之前需要先填充长度域,而物理层负载在原长度的基础上增加2。长度域数值增加2的原因是由于自动crc的存在,crc部分占两个字节cc2530会把这两个字节填充至发送缓冲区。
4.接收过程
和发送部分略有不同,接收部分可以分为接收中断部分和接收数据帧处理部分。
4.1 代码
#pragmavector=rf_vector
__interrupt

如何提高CAD的运行效率?
兆驰照明与恒大地产战略合作 打造现代化智慧生活的愿景
中国电信天翼1号2021云手机值得入手吗?
电瓶修复技术之锂电池充电的原理解析(一)
电源滤波器的特性_电源滤波器的结构_电源滤波器对其他零件的影响
如何利用CC2530实现无线串口
机房精密空调制冷剂纯度低会导致哪些后果?
国外通信运营商出现两漏洞,客户数据信息或遭受攻击
联发科公布2019年9月份营收 符合先前预期顺利达成营收目标
安装前如何检查电缆防爆接头
三星 | 手机新专利,又一个关于柔性面板的奇思妙想
科技巨头争相发力,电池瓶颈突破在即
高效广告传播媒体——镜面广告机
中国信通院与华为签署合作框架协议,共建下一代超融合数据中心网络
采暖散热器品牌哪家好
炬烜能量站:晶振电路电容的作用
百亿级市场待开发,生物识别市场前景可期
DS8007 多协议双智能卡接口
三相电源系统中的“三相四线制”是什么意思呢?
2023中国工业互联网技术发展的十大科技趋势