cc2530串口通信

编写程序实现实验板定期向pc机串口发送字符串“hello ! i am cc2530 。\n”。实验板开机后按照设定的时间间隔,不断地向pc及发送字符串,报告自己的状态,每发送一次字符串消息,led1闪亮一次。具体工作方式如下:
① 通电后led1熄灭。
② 设置usart 0使用位置。
③ 设置uart工作方式和波特率。
④ led1点亮。
⑤ 发送字符串“hello ! i am cc2530。\n”。
⑥ led1熄灭。
⑦ 延时一段时间,延时时间可以设置为3秒。
⑧ 返回步骤④循环执行。
串口通信介绍 数据通信时,根据cpu与外设之间的连线结构和数据传送方式的不同,可以将通信方式分为两种:并行通信和串行通信。
并行通信是指数据的各位同时发送或接收,每个数据位使用单独的一条导线,有多少位数据需要传送就需要有多少条数据线。并行通信的特点是各位数据同时传送,传送速度快效率高,并行数据传送需要较多的数据线,因此传送成本高,干扰大,可靠性较差,一般适用于短距离数据通信,多用于计算机内部的数据传送方式。
串行通信是指数据一位接一位顺序发送或接收。串行通信的特点是数据按位顺序进行,最少只需一根数据传输线即可完成,传输成本低传送数据速度慢,一般用于较长距离的数据传送。
串行通信又分同步和异步两种方式。 (1)串行同步通信
同步通信中,所有设备使用同一个时钟,以数据块为单位传送数据,每个数据块包括同步字符、数据块和校验字符。同步字符位于数据块的开头,用于确认数据字符的开始;接收时,接收设备连续不断地对传输线采样,并把接收到的字符与双方约定的同步字符进行比较,只有比较成功后才会把后面接收到的字符加以存储
同步通信的优点是数据传输速率高,缺点是要求发送时钟和接收时钟保持严格同步。在数据传送开始时先用同步字符来指示,同时传送时钟信号来实现发送端和接收端同步,即检测到规定的同步字符后,接着就连续按顺序传送数据。这种传送方式对硬件结构要求较高。
(2)串行异步通信
异步通信中,每个设备都有自己的时钟信号,通信中双方的时钟频率保持一致。异步通信以字符为单位进行数据传送,每一个字符均按照固定的格式传送,又被称为帧,即异步串行通信一次传送一个帧。
每一帧数据由起始位(低电平)、数据位、奇偶校验位(可选)、停止位(高电平)组成。帧的格式如图5-1所示:
起始位:发送端通过发送起始位而开始一帧数据的传送。起始位使数据线处于逻辑0,用来表示一帧数据的开始。
数据位:起始位之后就开始传送数据位。在数据位中,低位在前,高位在后。数据的位数可以是5、6、7或者8。
奇偶校验位:是可选项,双方根据约定用来对传送数据的正确性进行检查。可选用奇校验、偶校验和无校验位。
停止位:在奇偶检验位之后,停止位使数据线处于逻辑1,用以标志一个数据帧的结束。停止位逻辑值1的保持时间可以是1、1.5或2位,通信双方根据需要确定。
空闲位:在一帧数据的停止位之后,线路处于空闲状态,可以是很多位,线路上对应的逻辑值是1,表示一帧数据结束,下一帧数据还没有到来。
2.cc2530的串口通信模块 cc2530有两个串行通信接口usart 0和usart 1,它们能够分别运行于异步uart模式或者同步spi模式。两个usart具有同样的功能,可以设置在单独的i/o引脚,如表5-1所示
根据映射表可知,在uart模式中,使用双线连接方式,uart 0和uart 1对应的外部设置i/o引脚关系分别为:
位置1:rx0----p0_2 tx0----p0_3 p0_5----rx1 tx1----p0_4
位置2:rx0----p1_4 tx0----p1_5 p1_7----rx1 tx1----p1_6
uart模式的操作具有下列特点:
 8位或者9位有效数据
 奇校验、偶校验或者无奇偶校验
 配置起始位和停止位电平
配置lsb或者msb首先传送
 独立收发中断
 独立收发dma触发
 奇偶校验和数据帧错误状态指示
uart模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个uart字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。实际发送的帧包含8位或者9位,但是数据传送只涉及一个字节。
1234567891011121314
3.cc2530串口通信的相关寄存器 对于cc2530的每个usart串口通信,有5个如下的寄存器(x是usart的编号,为0或者1):
 uxcsr:usartx控制和状态寄存器
 uxucr:usartx uart控制寄存器
 uxgcr:usartx 通用控制寄存器
 uxbuf:usart x接收/发送数据缓冲寄存器
 uxbaud:usart x波特率控制寄存器
1234567
4.串口0初始化 串口0 初始化
percfg=0x00; //外设控制寄存器 这里使用串口0位置1
p0sel=0x0c; //0_2 0_3设置特殊端口
u0csr |=0x80;//0100 0000 0x80 串口通信的语言这里使用usart
u0baud =216 ;
u0gcr=10 ; //波特率
u0ucr |=0x80; //流控制禁止
u0csr |=0x40; //允许接受数据
utx0if = 0; //接受标志位
urx0if = 0; //发送标志位
urx0ie=1; //使能中断
ea=1; //中断总开关
串口设置
tx 发送数据
rx 接收数据
123456789101112131415161718192021
波特率设置
12
u0csr和u0baud用来设置波特率
例如设置波特率位57600:
u0baud = 216;
u0gcr = 10;
12345
具体初始化
uart0初始化配置
1、设置usartx0 为备用位置1,一般采用上电默认,无需配置
percfg &= ~0x01;
2、设置p0用作串口,p0_2、p0_3作为片上外设i/0
p0sel |= 0x0c;
3、设置p0口外设优先级,采用上电默认值(p2dir),无需配置
4、设置uart0波特率
u0baud = 59;
u0gcr = 10;
5、usart 模式选择,uart 模式,允许接收
u0csr |= 0xc0;
6、进行usart 清除,并设置数据格式为默认值
u0ucr |= 0x80;
7、清零uart0 rx 和 uart0 tx 中断标志
urx0if = 0;
utx0if = 0;
8、使能uart0 rx 中断
urx0ie = 1;
9、使能全局中断
ea = 1;
123456789101112131415161718192021
如果接收到了串口发来的数据urx0if置1;
如果发送成功utx0if置1;
串口收发配置
1、串口初始化配置
2、发送函数
void sendstring(char *p) //发送字符串
{
while(1)
{
if(*p == ‘\0’)
break;
u0dbuf = *p++;
while(!utx0if);
utx0if = 0;
}
}
12345678910111213141516
3、串口接收中断服务函数 #pragma vector = urx0_vector
__interrupt void urx0_f()
{
urx0if = 0;
buff[i] = u0dbuf;
if(buff[i] == ‘#’)
{
txstring(buff);
i = 0;
}
else
i++;
}
123456789101112131415
4、main函数及时钟源的配置
void main()
{
clkconcmd &= ~0x47;
inituart0();
while(1);
}
u0csr
usart模式选择
开启/关闭 接收数据功能,在发送数据的时候需要关闭接收数据功能
u0csr |= 0x40; / u0csr &= ~0x40;
123456789101112
u0ucr
一般采用上电默认值
u0ucr |= 0x80;
1234
urx0if
清空uart0、uart1的rx 中断标志
urx0if = 0;
1234
utx0if
12
u0csr
一般设置:
u0csr |= 0x40; //允许接收
1234
urx0ie
ien0 的第二位,使能uart0 rx 中断
123
p2dir
端口0外设优先级控制
使用usart0时 采用上电默认值
1234
代码
/* 文件名称:uart1.c
* 功 能:cc2530系统实验-----单片机串口发送数据到pc
* 描 述:实现从 cc2530 上通过串口每3秒发送字串“hello ,i am cc2530 。\n ”,在pc端实验串口助手来接收数据。使用 cc2530 的串口 uart 0 ,波特率为 57600,其他参数为上电复位默认值。
*/
/* 包含头文件 */
#include “iocc2530.h” //定义led灯端口
#define led1 p1_0 // p1_0定义为p1.0
unsigned int counter=0; //统计定时器溢出次数
void inituart0(void)
{
percfg = 0x00;
p0sel = 0x3c;
u0csr |= 0x80;
u0baud = 216;
u0gcr = 10;
u0ucr |= 0x80;
utx0if = 0; // 清零uart0 tx中断标志
ea = 1; //使能全局中断
}
/************************************************************
* 函数名称:initttimer1
* 功 能:初始化定时器t1控制状态寄存器
*************************************************************/
void initttimer1()
{
clkconcmd &= 0x80; //时钟速度设置为32mhz
t1ctl = 0x0e; // 配置128分频,模比较计数工作模式,并开始启动
t1cctl0 |= 0x04; //设定timer1通道0比较模式
t1cc0l =50000 & 0xff; // 把50000的低8位写入t1cc0l
t1cc0h = ((50000 & 0xff00) 》》 8); // 把50000的高8位写入t1cc0h
t1if=0; //清除timer1中断标志
t1stat &= ~0x01; //清除通道0中断标志
timif &= ~0x40; //不产生定时器1的溢出中断
//定时器1的通道0的中断使能t1cctl0.im默认使能
ien1 |= 0x02; //使能定时器1的中断
ea = 1; //使能全局中断
}
void uart0sendbyte(unsigned char c)
{
u0dbuf = c;
while (!utx0if); // 等待tx中断标志,即u0dbuf就绪
utx0if = 0; // 清零tx中断标志
}
/**************************************************************
* 函数名称:uart0sendstring
* 功 能:uart0发送一个字符串
**************************************************************/
void uart0sendstring(unsigned char *str)
{
while(*str != ‘\0’)
{
uart0sendbyte(*str++); // 发送一字节
}
}
/************************************************************
* 功 能:定时器t1中断服务子程序
************************************************************/
#pragma vector = t1_vector //中断服务子程序
__interrupt void t1_isr(void)
{
ea = 0; //禁止全局中断
counter++; //统计t1的溢出次数
t1stat &= ~0x01; //清除通道0中断标志
ea = 1; //使能全局中断
}
/************************************************************
* 函数名称:main
* 功 能:main函数入口
*******************************************************/
void main(void)
{
p1dir |= 0x01; /* 配置p1.0的方向为输出 */
led1 = 0;
initttimer1(); //初始化timer1
inituart0(); // uart0初始化
while(1)
{
if(counter》=15)
{
counter=0;
led1 = 1;
uart0sendstring(“hello ! i am cc2530 。\n”);
led1 = 0;
}
}
}

普源数字示波器的使用方法
国外发现了表明以钠和钾为基础的电池,将有望替代锂电池
smt加工厂如何活下来
性价比暴跌 小米6将涨价500块?
200V耐压肖特基势垒二极管:RBxx8BM200/RBxx8NS200
cc2530串口通信
4G网络到底有没有被降速
智能照明控制系统在绿色建筑中的应用
千元机旗舰机决战,红米Note 4对决酷派cool1
三星不做电子去织布? 投资1.5亿进军纺织行业
非晶硅薄膜技术受追捧
电蜂优选教您使用HTMD连接器时需注意哪些事项?
32位RISC CPU ARM芯片有哪些应用?应该怎样选型?
江西国际移动物联网博览会下月在鹰潭举行
关于论辩图谱的互动论点对识别
使用ZCU102开发板运行xdpdma例程
射频电路layout总结
自动驾驶点云标注的挑战与解决方案
刘烈宏:5G融合发展需各方协同发力
汽车产业未来探索 电动汽车至少还有五六亿辆的增量空间