本帖最后由 gjianw217 于 2016-10-1 01:40 编辑
1 应用原理 串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。那么UART与RS232的关系怎样,而RS232和USB的关系又怎样呢? 曾经看到一个形象的比喻,即公交运行可以简单分成两个部分:车站和公路,其中车站决定了车上装什么(人),怎么发送(班次)等;当汽车跑在路上,就要遵守公路交通的规则,过桥有过桥的规则,高速有高速的规则,和车站没有关系了。其实,UART就相当于车站,而RS23则对应于公路的规则。UART,是通用异步收发传输器(UniversalAsynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。例如: 内存中的数据是: 1 1 1 0 0 1 0 1 串行发送的实际效果是 1 0 1 0 0 1 1 1 接收则是上述过程的逆过程。 那么道路上的规定是什么样的呢? RS232是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的。RS232与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。 而RS232和USB是运行在道路上的两种规则。
2 CC2530 UART CC2530有两个串口,分别是USART0和USART1。USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/O引脚。
USART模式的操作具体下列特点:
(1)8位或者9位负载数据
(2)奇校验、偶校验或者无奇偶校验
(3)配置其实位和停止位电平
(4)配置LSB(最低有效位)或MSB(最高有效位)首先传输
(5)独立接收中断
(6)独立收发DMA触发
在CC2530中,与UART相关的寄存器,主要有:PERCFG(外设控制寄存器)、P2DIR (端口2方向和端口0外设优先级控制)、IEN0(中断使能0寄存器)、IRCON2(中断标志控制寄存器)UxCSR(USARTx 控制和状态寄存器)、UxUCR(USARTx 串口控制寄存器)、UxGCR(USARTx 通用控制寄存器)、UxBUF( USARTx 接收/发送数据缓冲寄存器)、UxBAUD(USARTx 波特率控制寄存器)。具体的功能配置,可参见CC2530 UART模块部分。
本次实验的电路,如下图所示,即使用了UART0模块,并通过转换成USB接口,方便与PC端的连接、通信。
CC2530配置串口的一般步骤:
(1)配置串口的备用位置,是备用位置1,还是备用位置2。配置寄存器PERCFG外设控制寄存器
(2)配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0
(3)配置端口的外设优先级。此处配置P0外设优先作为UART0
(4)配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器
(5)配置串口工作的波特率。此处配置为波特率115200
(6)将对应的串口接收/发送中断标志位清0,接收/发送一个字节都将产生一个中断,在接收时需要开总中断和使能接收中断,以及运行接收。
3 代码结构#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define UART0_RX 1
#define UART0_TX 2
#define SIZE 51
char RxBuf;
char UartState;
uchar count;
char RxData; //存储发送字符串
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i= 50) //判断数据合法性,防止溢出
{
count = 0; //计数清0
memset(RxData, 0, SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = 0;
}
}
if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = 0; //计数清0
memset(RxData, 0, SIZE); //清空接收缓冲区
}
}
}
4 实现效果
本帖最后由 gjianw217 于 2016-10-1 01:40 编辑
1 应用原理 串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。那么UART与RS232的关系怎样,而RS232和USB的关系又怎样呢? 曾经看到一个形象的比喻,即公交运行可以简单分成两个部分:车站和公路,其中车站决定了车上装什么(人),怎么发送(班次)等;当汽车跑在路上,就要遵守公路交通的规则,过桥有过桥的规则,高速有高速的规则,和车站没有关系了。其实,UART就相当于车站,而RS23则对应于公路的规则。UART,是通用异步收发传输器(UniversalAsynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。例如: 内存中的数据是: 1 1 1 0 0 1 0 1 串行发送的实际效果是 1 0 1 0 0 1 1 1 接收则是上述过程的逆过程。 那么道路上的规定是什么样的呢? RS232是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的。RS232与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。 而RS232和USB是运行在道路上的两种规则。
2 CC2530 UART CC2530有两个串口,分别是USART0和USART1。USART0和USART1是串行通信接口,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具体同样的功能,可以设置在单独的I/O引脚。
USART模式的操作具体下列特点:
(1)8位或者9位负载数据
(2)奇校验、偶校验或者无奇偶校验
(3)配置其实位和停止位电平
(4)配置LSB(最低有效位)或MSB(最高有效位)首先传输
(5)独立接收中断
(6)独立收发DMA触发
在CC2530中,与UART相关的寄存器,主要有:PERCFG(外设控制寄存器)、P2DIR (端口2方向和端口0外设优先级控制)、IEN0(中断使能0寄存器)、IRCON2(中断标志控制寄存器)UxCSR(USARTx 控制和状态寄存器)、UxUCR(USARTx 串口控制寄存器)、UxGCR(USARTx 通用控制寄存器)、UxBUF( USARTx 接收/发送数据缓冲寄存器)、UxBAUD(USARTx 波特率控制寄存器)。具体的功能配置,可参见CC2530 UART模块部分。
本次实验的电路,如下图所示,即使用了UART0模块,并通过转换成USB接口,方便与PC端的连接、通信。
CC2530配置串口的一般步骤:
(1)配置串口的备用位置,是备用位置1,还是备用位置2。配置寄存器PERCFG外设控制寄存器
(2)配置IO,使用外部设备功能。此处配置P0_2和P0_3用作串口UART0
(3)配置端口的外设优先级。此处配置P0外设优先作为UART0
(4)配置相应串口的控制和状态寄存器。此处配置UART0的工作寄存器
(5)配置串口工作的波特率。此处配置为波特率115200
(6)将对应的串口接收/发送中断标志位清0,接收/发送一个字节都将产生一个中断,在接收时需要开总中断和使能接收中断,以及运行接收。
3 代码结构#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define UART0_RX 1
#define UART0_TX 2
#define SIZE 51
char RxBuf;
char UartState;
uchar count;
char RxData; //存储发送字符串
/****************************************************************************
* 名 称: DelayMS()
* 功 能: 以毫秒为单位延时
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i= 50) //判断数据合法性,防止溢出
{
count = 0; //计数清0
memset(RxData, 0, SIZE);//清空接收缓冲区
}
else
UartState = UART0_TX; //进入发送状态
}
RxBuf = 0;
}
}
if(UartState == UART0_TX) //发送状态
{
U0CSR &= ~0x40; //禁止接收
UartSendString(RxData, count); //发送已记录的字符串。
U0CSR |= 0x40; //允许接收
UartState = UART0_RX; //恢复到接收状态
count = 0; //计数清0
memset(RxData, 0, SIZE); //清空接收缓冲区
}
}
}
4 实现效果