第5课  CC2530的串行接口原理与应用

小蜜蜂笔记网 / 广东职业技术学院  欧浩源

一、并行通信与串行通信

微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。

并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本高。

串行通信:指数据一位接一位地顺 序发送或接收。需要的数据线少,成本低,但传输速度慢,效率低。

二、CC2530的串口通信模块

CC2530有两个串行通信接口USART0USART1,它们能够分别运行于异步UART模式或者同步SPI模式

两个USART接口具有相同的功能,通过PERCFG寄存器可以设置两个USART接口对应外部I/O引脚的映射关系:

位置1:RX0 --- P0_2   TX0 --- P0_3               RX1 --- P0_5   TX1 --- P0_4

  位置2:RX0 --- P1_4   TX0 --- P1_5               RX1 --- P1_7   TX1 --- P1_6

对每个USART串口通信编程,本质是设置相关的5个寄存器:

<1> UxCSR:   USARTx的控制和状态寄存器。

<2> UxUCR:  USARTx的UART控制寄存器。

<3> UxGCR:  USARTx的通用控制寄存器。

<4> UxDBUF:USARTx的接收/发送数据缓冲寄存器。

<4> UxBAUD:USARTx的波特率控制寄存器。

三、UART口与计算机的COM口连接

先认识两种电平:TTL电平和RS232电平。

  TTL电平:       逻辑0----小于0.8V     逻辑1----大于2.4V。

  RS232电平  逻辑0----5~15V         逻辑1---- -5~-15V。

计算机的串行通信接口是RS-232的标准接口,而CC2530单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。

  注意:DB9接口中,公头和母头的排列顺序是不同的

四、实训项目:上位机通过串口控制LED灯的开关

【1】计算波特率

CC2530的波特率由BAUD_E和BAUD_M共同决定:

F为微控制器的系统时钟频率:16MHz32MHz

在TI公司提供的数据手册中,给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。

【2】串口0的初始化函数

选择外设的引脚映射位置,并将对应的引脚设置为外设功能 ,然后对波特率、控制寄存器和中断的相关控制位进行设置。

【3】数据接收中断服务函数

USART0发送完成的中断向量是:0x3B ,也可以使用宏定义:URX0_VEXTOR 。在该中断服务函数中,要手工清除接收中断标志位URX0IF

当数据接收完毕后,通过将一个自定义的变量Flag设置为1,告诉主函数,已经成 功接收到所需要的数据,主函数可以对其进行解析和执行指令。

【4】发送字节及发送字符串函数

当USART 的发送/接收数据缓冲寄存器UxDBUF被写入数据时,该字节就会发送到TXD引脚,开始数据的传输。由于UxDBUF是双缓冲的,所以在发送开始后会立即触发TX完成中断标志UTX0IF,并且数据缓冲器被卸载,也就是说,当字节正在发送时,新 的字节能够装入数据缓冲器UxDBUF

在单字节的发送函数中,把要发送的数据写入UxDBUF后,查询TX完成标志UTX0IF,当该标志被置1时,表示数据发送完成,然后清除该标志。

【5】项目源代码

#include "ioCC2530.h"
#define LED5 P1_3
#define LED6 P1_4
unsigned char dataRecv;
unsigned char Flag = ;
/*===================UR0初始化函数====================*/
void Init_Uart0()
{
PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3
P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能
U0BAUD = ; //16MHz的系统时钟产生9600BPS的波特率
U0GCR = ;
U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器
U0CSR |= 0xC0; //选择UART模式,使能接收器
UTX0IF = ; //清除TX发送中断标志
URX0IF = ; //清除RX接收中断标志
URX0IE = ; //使能URAT0的接收中断
EA = ; //使能总中断
}
/*================UR0接收中断服务函数================*/
#pragma vector = URX0_VECTOR
__interrupt void UR0_RecvInt()
{
URX0IF = ; //清除RX接收中断标志
dataRecv = U0DBUF; //将数据从接收缓冲区读出
Flag = ; //设置接收指令标志
}
/*=================UR0发送单字节函数=================*/
void UR0SendByte(unsigned char dat)
{
U0DBUF = dat; //将要发送的1字节数据写入U0DBUF
while(!UTX0IF); //等待TX中断标志,即数据发送完成
UTX0IF = ; //清除TX中断标志,准备下一次发送
}
/*=================UR0发送字符串函数===============*/
void UR0SendString(unsigned char *str)
{
while(*str != '\0') //发送一个字符串
{
UR0SendByte(*str++); //逐个发送字符串中的字节
}
}
/*================执行上位机的指令=================*/
void ExecuteTheOrder()
{
Flag = ; //清除接收指令标志
switch(dataRecv)
{
case 0xa1:
LED5 = ;
UR0SendString("The LED5 is Open!\r\n");
break;
case 0xa2:
LED5 = ;
UR0SendString("The LED5 is Closed!\r\n");
break;
case 0xb1:
LED6 = ;
UR0SendString("The LED6 is Open!\r\n");
break;
case 0xb2:
LED6 = ;
UR0SendString("The LED6 is Closed!\r\n");
break;
}
}
/*=================端口初始化函数====================*/
void Init_Port()
{
P1SEL &= ~0x18; //将P1_3和P1_4设置为通用I/O端口功能
P1DIR |= 0x18; //将P1_3和P1_4的端口设置为输出
LED5 = ; //关闭LED5灯
LED6 = ; //关闭LED6灯
}
/*===================主函数=========================*/
void main()
{
Init_Port(); //初始化端口
Init_Uart0(); //初始化串口0
//先发送一个字符串,测试串口0数据传输是否正确
UR0SendString("*广东职业技术学院--欧浩源*\r\n");
while()
{
if(Flag == ) //查询是否收到上位机指令
{
ExecuteTheOrder(); //解析并执行指令
}
}
}

【CC2530入门教程-05】CC2530的串行接口原理与应用的更多相关文章

  1. 【CC2530入门教程-增强版】基础技能综合实训案例(基础版)-上位机源码

    [CC2530入门教程-增强版]基础技能综合实训案例(基础版)-上位机源码 广东职业技术学院  欧浩源 一.需求分析 按照指定参数打开串口,与测控终端建立数据传输通道,并根据应用要求实现程序逻辑,具体 ...

  2. 【CC2530入门教程-04】CC2530的定时/计数器原理与应用

    第4课  CC2530的定时/计数器原理与应用 广东职业技术学院  欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...

  3. CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制

    第2课  CC2530的通用I/O端口输入和输出控制 广东职业技术学院  欧浩源 一.CC2530的引脚概述 CC2530微控制器采用QFN40封装,有40 个引脚.其中,有21个数字I/O端口,其中 ...

  4. 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制

    第2课  CC2530的通用I/O端口输入和输出控制 小蜜蜂科教 / 广东职业技术学院  欧浩源 [通用I/O端口视频教程:https://v.qq.com/x/page/x0793aol7us.ht ...

  5. 【CC2530入门教程-03】CC2530的中断系统及外部中断应用

    第3课  CC2530的中断系统及外部中断应用 广东职业技术学院  欧浩源 一.中断相关的基础概念  内核与外设之间的主要交互方式有两种:轮询和中断. 轮询的方式貌似公平,但实际工作效率很低,且不能及 ...

  6. 【CC2530入门教程-06】CC2530的ADC工作原理与应用

    第6课  CC2530的ADC工作原理与应用 广东职业技术学院  欧浩源 一.A/D转换的基本工作原理 将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是AD ...

  7. 【CC2530入门教程-01】IAR集成开发环境的建立与项目开发流程

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:1.CC2530单片机开发入门.2.通用I/O端口的输入和输出.3.外部中断初步应用.4.定时/计 ...

  8. 【CC2530入门教程-01】CC2530微控制器开发入门基础

    [引言] 本系列教程就有关CC2530单片机应用入门基础的实训案例进行分析,主要包括以下6部分的内容:[1]CC2530微控制器开发入门基础.[2]通用I/O端口的输入和输出.[3]外部中断初步应用. ...

  9. 一步步Cobol 400上手自学入门教程05 - 表

    在COBOL中有几类典型结构的表.这几类典型结构的表在大体上可分为下标表和索引表两大类.另外,根据表的重复次数定义又有定长表和变长表.此外,表还允许嵌套,因此还有嵌套表.这几类表均符合表的基本定义,都 ...

随机推荐

  1. C++ 中的一些错觉

    1. 默认构造函数和不带参数的构造函数之间无联系 默认构造函数是编译器发现类不存在显式构造函数时自动生成的无参数的构造函数.同样,用户可以定义显示的无参数构造函数. 2. 在构造函数.析构函数中调用v ...

  2. 1.javascript节点的操作 创建、添加、移除、移动、复制、插入(修改)

    (1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节 ...

  3. python 基本数据类型set

    set 是一个无序且不重复的序列 set 是一个无序且不重复的序列 set 不允许重复的集合.set不允许重复的序列 1.创建 s=set() #创建空集合只能用这种方法 s={11,222,233, ...

  4. 学习SpringMVC中优秀的代码编写风格

    在org.springframework.web.servlet.FrameworkServlet 中有下面这段代码 private class ContextRefreshListener impl ...

  5. Neo4j 第二篇:图形数据库

    在深入学习图形数据库之前,首先理解属性图的基本概念.一个属性图是由顶点(Vertex),边(Edge),标签(Lable),关系类型和属性(Property)组成的有向图.顶点也称作节点(Node), ...

  6. java关键字transient与volatile小结

    本文转自:http://heaven-arch.iteye.com/blog/1160693 transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶 ...

  7. countDownLatch和cyclicBarrier

    < Effecit In Java >说过,从java 1.5发现版本开始, 就不建议使用wait和notify,它们使用比较困难,可以使用更高级并发工具来替代. 图一所说的同步器是指那些 ...

  8. IPad分屏,当电脑第二显示屏

    最在在网上看到使用IPad可以做为电脑的第二个显示屏,对于我这样一个程序猿来说,这真是我的福音呀!因此在网上搜了许多关于Ipad投屏的信息,下面简单说明一下,包括怎么使用! 1.根据在网上搜索的结果, ...

  9. 在Intellij Idea中使用JSTL标签库

    习惯了eclipse和myeclipse开发的我们总是依赖于系统的插件,而当我想当然的以为IntelliJ IDEA 的jstl 的使用应该和myeclispe一样,当时使用起来却到处碰壁,完全找不到 ...

  10. Spring的<context:property-placeholder.../>在junit中不起作用,失效,解决方法

    大家都知道,我们使用spring框架的时候喜欢把可以配置的变量放入一个properties配置文件中,然后在spring的applicationContext.xml配置文件中加入配置: <co ...