任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX)。

RX:接收数据串行输入。通过采样技术来区别数据和噪音,从而恢复数据。

TX :发送数据输出。当发送器被禁止时,输出引脚恢复到它的I/O端口配置。当发送器被激活,并且不发送数据时,TX引脚处于高电平。在单线和智能卡模式里,此I/O 口被同时用于数据的发送和接收。

并行通信与串行通信

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

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

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

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

PERCFG寄存器:

UART口与计算机的COM口连接

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

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

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

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

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

需要用到的寄存器:

端口相关的配置

PERCFG:设置两个USART接口对应外部I/O引脚的映射关系:

P0SEL: 设置成外设功能(1为外设)

波特率相关的配置

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

给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。

U0BAUD = 59;          //32MHz的系统时钟产生9600BPS的波特率

  U0GCR = 8;            //16MHz---9; 32MHz---8

串口属性相关的配置:

U0UCR:USART 0 UART控制

U0SCR:USART 0 控制与状态

串口中断相关的配置

UTX0IF = 0;           //清除TX发送中断标志

 URX0IF = 0;           //清除RX接收中断标志

 URX0IE = 1;           //使能URAT0的接收中断

EA = 1;           //使能总中断

 

题目:上位机通过串口控制LED灯的开关

CC2530的串口0与上位机连接,在16HMz的内部系统时钟下产生9600BPS的波特率,禁止流控,无奇偶校验,采用8位数据,1位停止位,LSB先发送。上位机发送一一个字节控制目标板上的LED5和LED6的开关,具体要求如下:

(1)0xA1--LED5点亮;返回字符串“The LED5 is Open!" (LED6用0xB1)

(2)0xA2--LED5熄灭;返回字符串“The LED5 is Closed!" (LED6用0xB2)

(3) 串口0数据的接收数据采用中断方式,发送数据采用查询方式。

 

 

思路:

1】计算波特率

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

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

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

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

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

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

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

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

代码:

 #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 0100 0000 0位默认1的位置
P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能 0000 1100 1为外设功能
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("I am OK!\r\n");
while()
{
if(Flag == ) //查询是否收到上位机指令
{
ExecuteTheOrder(); //解析并执行指令
}
}
}

CC2530串口通信的更多相关文章

  1. cc2530串口通信流程

    //串口发送接收流程 main: //主函数 ->osal_init_system(); //操作系统初始化 ->osalInitTasks(); //任务初始化 -->ZDApp_ ...

  2. ZStack串口通信

    要使用ZStack就不得不先了解ZStack的OSAL工作原理 http://blog.csdn.net/qinpeng_zbdx/article/details/20990797 http://we ...

  3. .NET 串口通信

    这段时间做了一个和硬件设备通信的小项目,涉及到扫描头.输送线.称重机.贴标机等硬件.和各设备之间通信使用的是串口或网络(Socket)的方式.扫描头和贴标机使用的网络通信,输送线和称重机使用的是串口通 ...

  4. BluetoothChat用于蓝牙串口通信的修改方法

    本人最近在研究嵌入式的串口通信,任务是要写一个手机端的遥控器用来遥控双轮平衡小车.界面只用了一个小时就写好了,重要的问题是如何与板子所带的SPP-CA蓝牙模块进行通信. SPP-CA模块自带代码,在这 ...

  5. Win10 IoT C#开发 4 - UART 串口通信

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,既可以开发设备UI与用户交互式操作,又可以控制GPIO等接口,使得原来嵌入式繁琐的开发变得简单.通过Remote Debug ...

  6. 使用Java实现简单串口通信

    最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...

  7. Java 串口通信

    在Windows系统下,用Java开发串口通信相关的程序时,需要用到几个文件. (1)win32com.dll 要放在jdk\jre\bin目录下. (2)comm.jar 和javax.comm.p ...

  8. .NET 串口通信中断接收,包含0X1A(作为EOF)

    .NET串口通信中将`0X1A`当做EOF处理,.NET接收到EOF会触发一次接收中断,此时事件形参`SerialDataReceivedEventArgs`值为枚举 `Eof`,其他为`Chars` ...

  9. STC12C5A60S2 双串口通信

    STC12C5A60S2单片机是一款功能比较强大的单片机,它拥有两个全双工串行通信接口,串口1的功能及操作与传统51单片机串行口相同:特殊的是STC12C5A60S2单片机内部有一个独立波特率发生器, ...

随机推荐

  1. GeoGebra简单使用

    上课过程中的一些知识和一丢丢工具使用例子 1.常用的变量输入 2.好用的函数检视工具 3.使用动态的移动,关键是右键-开启跟踪 4.输入指令(推荐用英文输入,因为有提示)

  2. 在数组添加元素时报错:IndexError: list index out of range

    今天第一次发随笔还有许多不足之处,欢迎评论!!! 最近在写一个成语接龙的小游戏,结果在数组添加元素时报错:IndexError: list index out of range 源码: import ...

  3. 词向量模型word2vector详解

    目录 前言 1.背景知识 1.1.词向量 1.2.one-hot模型 1.3.word2vec模型 1.3.1.单个单词到单个单词的例子 1.3.2.单个单词到单个单词的推导 2.CBOW模型 3.s ...

  4. TCP基础概念

    定义 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议 特点 TCP是一种面向广域网的通信协议,目的是在跨越多个网 ...

  5. linux之cat 操作

    1.查看或创建 cat 1.txt #如果目录有这个文件则会打开查看,没有则会创建 2.压缩空白 cat 1.txt 我是第一行 我是第二 行 cat -bs 1.txt # 变成 cat 1.txt ...

  6. 8个超好用的Python内置函数,提升效率必备(小白必看)

    python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率. 这次来梳理下8个好用的python内置函数. 1.set() 当需要对一个列表进行去重操作的 ...

  7. PHP的yield是个什么玩意

    来源:https://segmentfault.com/a/1190000018457194 其实,我并不是因为迭代或者生成器或者研究PHP手册才认识的yield,要不是协程,我到现在也不知道PHP中 ...

  8. css3--:target选择器称为目标选择器

    :target选择器称为目标选择器,用来匹配文档(页面)的url的某个标志符的目标元素.我们先来上个例子,然后再做分析. 示例展示 点击链接显示隐藏的段落. HTML代码: <h2>< ...

  9. Python与Excel交互——Xlwings实战

    这一期直接来实战. 比如说,我们在一个快递网站上爬取了几个快递的轨迹信息,我们需要将数据保存下来,一个常规做法是把数据保存在数据库里(Mysql,MongoDB,Redis),另一个是用Excel的形 ...

  10. Libra教程之:Libra testnet使用指南

    文章目录 Libra testnet网络 下载和安装Libra 编译Libra client并连接到Testnet网络 创建两个A和B的两个账号 检查libra cli Client是否运行 创建A的 ...