UART
Posted 一只小阿大嗷
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UART相关的知识,希望对你有一定的参考价值。
UART(Universal Asynchronous Receiver/Transmitter)即通用异步收发传输器,是一种通用的串行,异步通信总线,该总线有两条数据线,可以实现全双工的发送和接收,在嵌入式系统中常用于主机与辅助设备之间的通信。
并行总线:
串行总线:
串行传输和并行传输的优缺点:
1. 串行传输
优点:使用的数据线少,在远距离通信中可以节约通信成本。
缺点:因为每次只能传输一位数据,所以传输速度比较低。
2. 并行传输
优点:因为可以多位数据一起传输,所以传输速度很快。
缺点:内存有多少位,就要用多少数据线,所以需要大量的数据线,成本很高。线和线会有一些信号干扰。
波特率用于描述UART通信时的通信速度,单位为bps(bit per second)即每秒钟传送的bit的数量
UART帧格式:
串口协议规定,数据位先发低位后发高位。
为什么需要起始位?
如果没有起始位,空闲位为高电平,发送的数据也全是高电平,怎么知道什么时候是空闲状态还是发数据的状态。
校验位可以校验数据的正确性
和校验:比如发的是123,接收到的是223,加起来6不等于7,数据发送错误。
奇偶校验:计算啊数据中有几个1,是偶数个的话就是1,奇数个就为0
校验位只能去校验数据有无错误,不能修正错误
接收方怎么知道发的是10还是1100,就需要波特率了(相当于语速),比如我一秒说一个字,他那就会一秒收到那一个字,我说了2秒就说明我同一个字说了两次。
因为这是异步的,有可能导致我发了1s,接收到的是0.9s。
连续发送就会产生累计误差,就会错出一位后续数据全乱了。
那么如何避免累计误差?
每次通信最多一个字节。
异步:发送和接收的时钟不同步,就会有误差。
UART控制器
一般情况下处理器中都会集成UART控制器,我们使用UART进行通信时候只需对其内部的相关寄存器进行设置即可。
#include "exynos_4412.h"
int main()
{
/*1.将GPA1_0和GPA1_1设置成UART2的接收引脚和发送引脚 GPA1CON[7:0]*/
GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);
/*2.设置UART2的帧格式 8位数据位 1位停止位 无校验位 正常模式 ULCON2*/
UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0x3<<0);
/*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/
UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5 << 0);
/*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/
UART2.UBRDIV2 = 54;
UART2.UFRACVAL2 = 4;
while(1){
/*将发送的数据写入发送寄存器UTXH2*/
while(!(UART2.UTRSTAT2 & (1 << 1)));
UART2.UTXH2 = 'A';
UART2.UTXH2 = 'B';
UART2.UTXH2 = 'C';
}
return 0;
}
以上是关于UART的主要内容,如果未能解决你的问题,请参考以下文章