UART之硬件篇(1)
介绍
开发中经常用到串口通讯,串即串行,顾名思义,是指数据在一根数据线上按照二进制,从低到高位一位一位的传输。
Universal Asynchronous Receiver/Transmitter,通常称为UART
,UART/USART 在许多 DIY 电子项目中用于将 GPS 模块、蓝牙模块、 RFID 读卡器。USART在UART基础上增加了同步功能,即USART是UART的增强型。
UART是异步串行通信口的总称,它包括了RS232、RS449、RS423、RS422和RS485等接口标准规范和总线标准规范。不同UART标准规定了通信接口的电气特性、传输速率、连接特性和接口的机械特性等内容。实际上是属于通信网络中的物理层(Physical Layer)的概念,与通信协议没有直接关系。而通信协议,是属于通信网络中的数据链路层(Data Link Layer)的概念。COM是PC(个人计算机)上,异步串行通信口的简写。由于历史原因,IBM的PC外部接口配置为RS232
,成为实际上的PC界默认标准。所以,现在PC机的COM均为RS232。若配有多个异步串行通信口,则分别称为COM1、COM2... 。不同标准的UART通信需要使用电平转换器
,如嵌入式单板的UART通过MAX232电平转换才能与PC的RS232通信。
工作原理
串行收发
发送端:发送端把数据的字节按照bit从低到高进行顺序发送
接收端:接收端把bit组装成字节
单工:UART只用Tx或Rx其中一根线进行通讯,也就是只作接收或发送;
半双工:UART在同一时间,只用作发送或接收;
全双工:UART在发送的同时,也可以接收;
数据帧
UART属于异步传输数据,这意味着没有时钟信号将发送的位输出与接收的位采样同步,也就是发送与接收使用各自的时钟。发送端将开始和停止位添加到传输的数据帧中,通过数据帧中定义的开始位和结束位,接收端知道何时开始读取这些位。
为了使 UART 工作,发送端和接收端的以下设置需要相同:
波特率
奇偶校验位
数据位大小
停止位大小
流量控制
每个数据帧包含 1 个起始位、5 到 9 个数据位(取决于 UART的设置,如果有奇偶校验位是5到8,没有则是5到9)、一个可选的奇偶校验位和 1 个或 2 个停止位:
1 | 5-9 | 0-1 | 1-2 |
---|---|---|---|
起始位 | 数据框 | 奇偶校验位 | 停止位 |
起始位
:UART 数据传输线在不传输数据时通常保持在高电平。要开始发送数据时,发送端UART先在一个时钟周期内将传输线从高电平拉到低电平。当接收端UART 检测到从高到低的电压转换时,它开始以设置好的波特率的频率读取数据帧中的位。
数据位
:数据帧包含正在传输的实际数据。如果使用奇偶校验位,它可以是 5 位到 8 位。如果不使用奇偶校验位,则数据帧可以是 9 位。在大多数情况下,首先发送的数据是最低有效位。
校验位
:奇偶校验位是接收端UART 判断数据在传输过程中是否发生变化的一种方式。位会因电磁辐射、不匹配的波特率或长距离数据传输而发生改变。接收端 UART 读取数据帧后,检查数据部分值为1的个数是奇数还是偶数。当奇偶校验位与数据匹配时,UART 知道传输没有错误。
停止位
:发送端UART 将数据传输线从低电平拉到高电平持续至少两个位的时间来表示整个数据包的传输已经结束。
波特率
波特率是指bit传输的速率,波特率的常用值有 2400、9600、19200、115200。传输效率的原因,实际传输的数据是小于波特率的。
\(BAUDDIV=F_{UARTCLK}/(16×Baud rate)\)
其中\(F_{UARTCLK}\)是UART的参考时钟,\(BAUDDIV\)包括整数部分和小数部分
If the required baud rate is 230400 and UARTCLK = 4MHz then:
Baud Rate Divisor = (4×106)/(16×230400) = 1.085
This means BRDI = 1 and BRDF = 0.085.
收发过程
- UAR 从数据总线并行接收数据
- 发送端 UART 将起始位、奇偶校验位和停止位添加到数据帧
- 整个数据包从发送端 UART 串行发送到接收端 UART。接收端 UART 以预配置的波特率对数据线进行采样
- 接收端 UART 丢弃数据帧中的起始位、奇偶校验位和停止位
- 接收端 UART 将串行数据转换回并行,并将其传输到接收端的数据总线
不同UART型号
UART经过长久发展,不同公司的UART有不同的feature。
Model | Description |
---|---|
Intel 8251 | USART,异步通信最高 19.2kbit/s,同步通信最高 64kbit/s[3] |
NS INS8250 | 缓冲器只有 1 字节的老旧型式 |
Motorola 6850 | |
16450 | 具有两组 UART, 代号 164 = 82 x 2 暗示了它的特性。 以下 16 开头的都有两组 UART |
16550 | 推出后发现 FIFO 存在 bug,随即以 16550A 取代 |
16550A | 16 字节缓冲器,可设为 TL=1,4,8,14; 标准最高速度 115.2 kbit/s, 也有可达 230.4 或 460.8 kbit/s 的,支持 DMA [4] |
16650 | 32 字节缓冲器,最高速度 460.8 kbit/s |
16750 | 64 字节发送缓冲器, 56 字节接收缓冲器,最高速度 921.6 kbit/s |
16850 | 128 字节缓冲器,最高速度 460.8 kbit/s 或 1500 kbit/s |
Hayes ESP | 1 k 字节缓冲器 |
UART使用场景
- 调试:与PC通信,打印日志
- 打印机:早期打印机的通信接口
- 红外传输:外接红外设备
下一步
现在我们知道了UART是什么以及UART的基本工作原理,那么软件是怎么控制UART的,软件做了什么事情,这得参考具体的UART IP,接下来以ARM PL011作为研究对象。
Reference
https://www.analog.com/en/analog-dialogue/articles/uart-a-hardware-communication-protocol.html