cc2530c语言教程,cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发 - 全文...
前言
本文将分析一个利用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(in=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芯片寄存器较多,可以通过官方的软件生成推荐值。发送过程可以采用等待方法,而接收过程往往使用中断方法。
cc2530c语言教程,cc2530程序设计实例之CC2530 RF部分使用—实现点对点收发 - 全文...相关推荐
- python编程实例教程-Python程序设计实例教程
图书简介 配套资源:电子课件,习题答案,教学大纲,源代码 本书特色: ★本书共14个项目,主要包括Python编程基础.网络爬虫.数据分析和数据可视化四大部分内容. ★全部代码适用于Python 3. ...
- cc2530点对点通信c语言,CC2530 RF部分使用 ——实现点对点收发
__interrupt void rf_isr(void) { EA =0; // 接收到一个完整的数据包 if(RFIRQF0&(1<<6)) { rf_receive_isr( ...
- msp430单片机c语言应用程序,MSP430单片机C语言应用程序设计实例精讲
本书首先介绍了C语言的基本知识,使读者能使用C语言进行程序设计:然后介绍了30个开发例子.全书主要通过实例的形式来介绍MSP430单片机在不同领域中的应用,从而使读者掌握MSP430单片机开发的流程. ...
- c语言程序设计移动字母,C语言程序设计实例大全(220个例子)
C语言程序设计实例大全,C语言是世界上最流行.使用最广泛的高级程序设计语言之一,这里c语言 程序设计 实例 大全有220个例子供大家参考 c语言开发实例目录: 第一部分 基础篇 001 第一个C程序 ...
- c语言程序设计培训课件打包,C语言程序设计实例PPT培训课件.ppt
C语言程序设计实例PPT培训课件 第 14章 C语言程序设计实例 ;实例一 成绩处理程序 ; 2. 数据说明 (1) 学生人数假定不超过1000人, 课程门数假定不超过30门,分别用符号常量N.M描 ...
- atmega16单片机c语言程序设计经典实例pdf,《AVR单片机C语言程序设计实例精粹》.pdf...
AutodeskAsiaPteLtd主编的<AutodeskRevitStructure2012应用宝典>是对AutodeskRevitStructure2012进行全面介绍的权威用书.全 ...
- c语言程序设计教程博客,嵌入式C语言教程以及C编程要素
计算机嵌入式行业逐渐成为就业者的新宠儿,而作为一个嵌入式C编程技术人员,熟练使用C语言是非常重要的,下面尚观教育小编就来跟大家聊一聊嵌入式C语言教程以及C编程要素. 嵌入式C语言教程以及C编程要素: ...
- ∑ n!(1! 2!)用c语言怎么编,数控车床编程教程,图文实例详解!
原标题:数控车床编程教程,图文实例详解! 第一节数控车床编程基础 一.数控车编程特点 (1) 可以采用绝对值编程(用X.Z表示).增量值编程(用U.W表示)或者二者混合编程. (2) 直径方向(X方向 ...
- c语言是面向对象程序设计,C语言面向对象程序设计.ppt
C语言面向对象程序设计.ppt 面向对象程序设计 C 程序设计语言主讲 陈泽琳 学时安排 上课学时 24上机学时 16 参考资料 美 H M Deitel等著 薛万鹏等译 C 程序设计教程 郑莉等编著 ...
- while保留五位小数c语言,C语言教程(共同学习)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言教程第三章: C语言程序设计初步 C语言程序设计 本课介绍C语言程序设计的基本方法和基本的程序语句. 从程序流程的角度来看,程序可以分为三种基本结构 ...
最新文章
- iOS设备屏幕像素总览
- 再见了kafka2.0时代,去掉了zk的kafka3.0才是时代新王!
- (五)uboot移植补基础之shell
- jQuery基础学习笔记(下)
- Pi 3B+编译安装python3.6.8
- zip 后压缩包带路径
- 计算机版本过低怎么办,浏览器版本过低嗡嗡叫怎么办_电脑显示浏览器版本过低嗡嗡叫如何处理-win7之家...
- SATA工作模式咋选?揭秘AHCI和IDE区别(1)
- Windows服务器安全策略配置——简单实用
- word文档被覆盖了怎么恢复原状
- spring boot 集合 shiro
- 操作系统原理分析实验
- Hive之——数据定义
- cuda官网下载,本机显卡驱动与cuda、cudnn、pytorch、torchvision安装版本对应表,以及完全卸载CUDA方法
- JAVA安卓4.4.4_Android源码4.4.4_r1下载和编译
- V-REP 泡泡机器人教程
- 修复由于找不到vcruntime140.dll,无法继续执行代码的问题方法【常用运行库】
- TECPLOT画流固耦合的流场图--学习笔记
- mysql rc是什么版本_docker rc版本是什么意思?
- EFI 分区/恢复分区不可删除?你需要使用命令行了(配合鼠标操作)