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的主要内容,如果未能解决你的问题,请参考以下文章

am335x UART1输入u-boot 调试信息代码修改

Linux UART介绍

我的 ESP32 代码在 Arduino uno 之间建立 UART 通信是不是正确?

高通平台开发系列讲解(UART篇)高速串口代码流程

开发过程中,调用别人开发的代码,用到啥关键字

在 Atmel SAM L21 Xplained Pro 上通过 UART 发送请求和接收响应的代码问题