前言
本文将分析一个利用cc2530实现无线串口,文中将会列举部分代码并对cc2530的具体操作进行分析。本文的具体的内容包括以下几个部分:
cc2530是符合802.15.4标准的无线收发芯片,但是本文并没有遵守802.15.4协议规则,在发送过程中忽略了网络id、源地址和目标地址等参数,在接收的过程中禁止了帧过滤。通过发送和接收过程的处理使得cc2530无线部分的使用尽可能的简单清晰,通过最少的代码说明问题。
无线芯片的调试具有一定的难度,一般存在发送设备和接收设备。为了通过最简单的代码说明无线芯片的使用,本文中仅编写一种设备代码同时实现发送和接收功能。设备的功能也相对简单,cc2530从串口接收数据并把数据通过rf部分“无损”发送,于此同时cc2530把从rf部分接收的数据通过串口“无损”发送,通过这样的方式实现无线串口。
串口数据属于“流”型数据包,rf部分属于“帧”型数据包。在串口数据处理与分析中,一般采用特定的串口头和长度的方式解析数据,但是本文采用通过串口时间间隔的方式接收数据,这种方法等同于modbus-rtu串口数据处理方法。通过这种检测字节数据时间间隔的方法使得cc2530的串口部分可以接收无特殊格式要求的数据,真正实现无线串口功能。
1、实验准备
为了实现无线串口功能,需要准备两套cc2530模块和一个仿真器。如果条件允许可以增加一个仿真器,仿真器可以是ccdebugger也可以是smartrf04eb,同时也可以准备一套cc2531usbdongle做为嗅探器,抓取rf发送数据做调试分析。
2、实验结果
本文主要实现了无线串口功能,通过串口调试助手发送字节数据。例如通过串口向设备a发送hellocc2530,设备b可收到hellocc2530,并把该字符串通过串口调试助手打印至屏幕。设备b发送hellorf,设备a同样可以收到数据并打印至屏幕。
图中中括号包含的数字为rssi结果,rssi表示接收信号强度,例如图中的-28。rssi结果的单位为dbm,dbm为绝对单位且参考的标准为1mw。
3、初始化
rf部分的寄存器较多,需要耐心阅读数据手册和相关工具才可以完成设置。虽然rf部分的寄存器较多,但是还是借助smartrf工具、数据手册和示例代码,依然可以总结出使用cc2530无线部分的一般方法。
初始化部分包括接收数据包帧过滤控制,发射功率控制和信道选择;借助smartrf工具生成若干推荐值;打开接收终端并进入接收状态。
代码
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
}
4、发送过程
代码
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《len;i++)
{
rfd=*pbuf++;
}
rfst=0xe9;//发送数据包istxon
while(!(rfirqf1&(1《《1)));//等待发送完成
rfirqf1=~(1《《1);//清除发送完成标志位
rfirqm0|=(1《《6);//rx接收中断
ien2|=(1《《0);
}
发送过程本身不困难,大致可分为侦听sfd清除信道,关闭接收中断,填充缓冲区,启动发送并等待发送完成,最后恢复接收中断。在这几个过程中唯一需要说明的便是填充缓冲区过程,在初始化过程中提到frmctrl0寄存器,该寄存器中auto_crc标志位默认为使能状态,阅读数据手册不难发现,cc2530的物理层负载部分第一个字节为长度域,填充实际负载之前需要先填充长度域,而物理层负载在原长度的基础上增加2。长度域数值增加2的原因是由于自动crc的存在,crc部分占两个字节cc2530会把这两个字节填充至发送缓冲区。
5、接收过程
和发送部分略有不同,接收部分可以分为接收中断部分和接收数据帧处理部分。
代码
#pragmavector=rf_vector
__interruptvoidrf_isr(void)
{
ea=0;
//接收到一个完整的数据包
if(rfirqf0&(1《《6))
{
rf_receive_isr();//调用接收中断处理函数
s1con=0;//清除rf中断标志
rfirqf0&=~(1《《6);//清除rf接收完成数据包中断
}
ea=1;
}
voidrf_receive_isr()
{
intrf_rx_len=0;
intrssi=0;
charcrc_ok=0;
rf_rx_len=rfd-2;//长度去除两字节附加结果
rf_rx_len&=0x7f;
for(inti=0;i《rf_rx_len;i++)
{
rf_rx_buf[i]=rfd;//连续读取接收缓冲区内容
}
rssi=rfd-73;//读取rssi结果
crc_ok=rfd;//读取crc校验结果bit7
rfst=0xed;//清除接收缓冲区
if(crc_ok&0x80)
{
uart0_sendbuf(rf_rx_buf,rf_rx_len);//串口发送
printf(“[%d]”,rssi);
}
else
{
printf(“\r\ncrcerror\r\n”);
}
}
6、串口部分
串口部分的内容其实和rf部分无关,但是为了方便调试还是列举了该部分的代码。串口部分的代码包括定时器t1和uart两部分,uart中断中往接收缓冲区中填充数据并重新启动定时器,在定时器中断中指示串口数据接收完毕,改变一个软件标志位is_serial_receive。
代码
voiduart0_init()
{
percfg=0x00;//uart0选择位置0tx@p0.3rx@p0.2
p0sel|=0x0c;//p0.3p0.2选择外设功能
u0csr|=0xc0;//uart模式接收器使能
u0gcr|=11;//查表获得u0gcr和u0baud
u0baud=216;//115200
utx0if=1;
urx0ie=1;//使能接收中断ien0@bit2
}
voidtimer1_init()
{
t1ctl=0x0c;//@div分频系数128@mode暂停运行
t1cctl0=0x44;//@im通道0中断使能@mode比较匹配模式
t1stat=0x00;//清除所有中断标志
t1ie=1;//ien1@bit1使能定时器1中断
t1cc0l=250;//溢出周期为2ms
t1cc0h=0;
}
voidtimer1_disbale()
{
t1ctl&=~(1《《1);//恢复为停止模式
}
voidtimer1_enable()
{
t1ctl|=(1《《1);//改变模式为比较匹配模式mode=0x10;
t1stat=0x00;//清除中断标志位
t1cnth=0;//重新开始计数
t1cntl=0;
}
#pragmavector=urx0_vector
__interruptvoiduart0_isr(void)
{
urx0if=0;//清除接收中断标志
serial_rxbuf[serial_rxpos]=u0dbuf;//填充缓冲区
serial_rxpos++;
serial_rxlen++;
timer1_enable();//定时器重新开始计数
}
#pragmavector=t1_vector
__interruptvoidtimer1_isr(void)
{
t1stat&=~(1《《0);//清除定时器t1通道0中断标志
is_serial_receive=1;//串口数据到达
timer1_disbale();
}
7、总结
大多数rf芯片都可以分为初始化,接收和发送这三个过程。而初始化过程可包括设置信道、功率、帧过滤等参数,由于rf芯片寄存器较多,可以通过官方的软件生成推荐值。发送过程可以采用等待方法,而接收过程往往使用中断方法。
库克马云马化腾齐聚深圳 三亮点点亮国际创客周
Steam公布2018年大数据:9000万月活跃玩家,今年公布Steam中国细节
苹果手机又出奇葩规定: 备用机不按时还 “没收”送修机
电磁兼容设计包含什么内容
盘点超级电容器的几大性能特点
cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发
人工智能的两面性认知 深度学习或成软肋
什么是接触电阻?接触电阻的特性及其工作原理,晶闸管为什么两端要对接电阻电容?
工业物联网数据中台实现多种数据监控与智能管理
ADI推出旨在加快音频DSP项目开发的SHARC音频模块平台
介绍控制器实现EtherCAT与RTEX驱动器的回零及其配置
一种通用的计价器防作弊脉冲的识别与控制方法
比特币质押系统开发数字资产抵押平台搭建
SystemVerilog中bind用法总结+送实验源码和脚本
人工智能的洪荒之力正在吞噬一切
系统设计的概念介绍
“中国芯”发展强劲 信息化惠及亿万人民
生物识别技术的发展在一定程度上解决了门禁系统的漏洞问题
什么是C语言表驱动法编程?
欧洲新大型垂直农场启动,完全依靠风力发电