描述

前言

本文将分析一个利用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芯片寄存器较多,可以通过官方的软件生成推荐值。发送过程可以采用等待方法,而接收过程往往使用中断方法。

打开APP精彩内容

点击阅读全文

cc2530c语言编程库,cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发相关推荐

  1. Shell编程入门-Shell程序设计实例

    Shell编程入门-Shell程序设计实例 1.增加用户账户 编写一个Shell程序addaccount.sh,在系统中增加四个账户,同时设定他们的初始密码为123456,主组群为wl20. ①查看系 ...

  2. 详解c语言编程库题,详解C语言编程

    C语言作为编程语言,其诞生已经很早,但是在编程语言多样化的今天,C仍然高居TIOBE编程语言排行榜的第一位(2014年5月),而C++语言排位第四.而位居第二位的Java本身就是脱胎于C++语言,第三 ...

  3. java 打印机编程_Java 打印程序设计实例 - java如何实现打印功能

    Java 打印程序设计实例 3.1 打印文本 3.1.1 应用场景 假设我们需要打印一个窗体的某个文本编辑域(可能只有几行,也可能包含多页)的内容,并且每页最多打印 54 行,如何实现呢? 3.1.2 ...

  4. java 调用c语言_Java 调用C语言JNI库(Hello World实例)

    要在java中调用c语言的库,一直觉得很不可思议,但是Java提供了JNI这个东西,这也就变得可能了. 作为一个码农,我们还是从最简单的 Hello World开始吧. 首先说一下我们想要做的事情. ...

  5. python编程和c语言编程的区别-通过实例浅析Python对比C语言的编程思想差异

    我一直使用 Python,用它处理各种数据科学项目. Python 以易用闻名.有编码经验者学习数天就能上手(或有效使用它). 听起来很不错,不过,如果你既用 Python,同时也是用其他语言,比如说 ...

  6. [语言编程] exe病毒代码实例

    Set objFS *** CreateObject("Scripting.FileSystemObject") Set objFSO *** CreateObject(" ...

  7. cc2530点对点通信c语言,CC2530 RF部分使用 ——实现点对点收发

    __interrupt void rf_isr(void) { EA =0; // 接收到一个完整的数据包 if(RFIRQF0&(1<<6)) { rf_receive_isr( ...

  8. 东北大学c语言及程序设计题库,东北大学c语言编程试题及其答案.doc

    东北大学c语言编程试题及其答案.doc 东北大学C语言程序设计题库第一部分(选择题)1.构成C语言的基本单位是________.你的答案是:正确答案是:B过程函数语句命令2.设x为整型变量,不能正确表 ...

  9. 长沙理工大学c语言程序设计作业答案,长沙理工大学2014年上期期末c语言编程题库...

    <长沙理工大学2014年上期期末c语言编程题库>由会员分享,可在线阅读,更多相关<长沙理工大学2014年上期期末c语言编程题库(16页珍藏版)>请在人人文库网上搜索. 1.C算 ...

  10. mysql 小球_c语言编程实例——小球跳动

    1.预备知识 1.1 相关头文件 "#include"是c语言中用以申明所需调用的库函数或自定义函数的头文件路径及文件名.#include ""和#includ ...

最新文章

  1. wordpress如何禁用后台控制面板内容
  2. 设备驱动模型之device-driver
  3. python观察日志(part13)--any和all
  4. .Net Core上用于代替System.Drawing的类库
  5. mysql主从切换机制torch_MySQL Replication设置(Master/Slave)实现主从复制
  6. [css] 你有去看过或者了解过css的标准文档吗?
  7. python自动汇总excel_RPA手把手:Python轻松实现EXCEL自动化
  8. Windows下安装Redmine
  9. 第6 章 面向对象的程序设计
  10. HDU-ZZY的爱好
  11. 转HashMap Hashtable区别
  12. Day2 python基础
  13. java如何准确的读取多音字
  14. 猿创征文|国产数据库之OceanBase详解安装和使用
  15. Android GIF图片显示
  16. photoshop--PS拼图
  17. UltraEdit 使用技巧笔记(转)
  18. oracle安装成功验证
  19. 数位dp BZOJ 2757: [SCOI2012]Blinker的仰慕者
  20. Ubuntu三步配置scrcpy,实现手机投屏和控制

热门文章

  1. 华泰证券 python 自动交易软件_量化自动交易软件开发,搬砖交易机器人系统开发...
  2. Fiddler2 抓包工具,让你的信息无处可藏
  3. 佳能打印机g3800如何安装到计算机,【佳能 G3800 喷墨无线一体打印机使用体验】驱动|安装|连接|连接_摘要频道_什么值得买...
  4. python深度学习机器学习必备的学习网站集合!
  5. 支持java浏览器_如何为浏览器安装支持JAVA的插件
  6. 遇到错误(firefox 打不开 重置winsock bug)
  7. python运维开发实战
  8. mysql 格式化_在线SQL代码格式化
  9. android第三方集成埋点,Android集成mPass 埋点遇到的问题
  10. 小米手机用什么蓝牙耳机好?高颜值游戏专属蓝牙耳机推荐