一、定义
UART(Universal Asynchronous Receiver/Transmitter)是一种广泛使用的串行通信协议,用于在设备间通过异步方式传输数据。它无需共享时钟信号,而是依赖双方预先约定的参数(如波特率)完成通信。
功能和特点
基本的 UART 系统只需三个信号即可提供稳健的中速全双工通信:Tx(传输的串行数据)、Rx(接收的串行数据)和接地。
与SPI和I2C等其他协议相比,不需要专门的clock信号来同步数据传输,这是由其独特的通信机制决定的。
异步通信方式:发送方在发送数据时,会根据预设的波特率(即每秒传输的位数)来发送数据,而接收方也根据相同的波特率来接收并解析数据。这种机制使得UART能够在没有外部时钟信号的情况下进行有效的数据传输
内部时钟控制:虽然UART不需要外部的clock信号,但它仍然依赖于内部的时钟信号来控制数据的发送和接收。这些内部时钟信号由UART硬件模块自身提供,用于生成发送和接收数据的节拍。然而,这些内部时钟信号并不需要像SPI或I2C那样通过外部线路传输到其他设备,而是只在本地设备内部起作用。
二、工作原理
将要传输数据的 UART 从数据总线接收数据。数据总线用于通过 CPU、内存或微控制器等其他设备将数据发送到 UART。数据以并行形式从数据总线传输到传输 UART。发送 UART 从数据总线获取并行数据后,添加一个起始位、一个奇偶校验位和一个停止位,从而创建数据包。
接下来,数据包在 Tx 引脚上逐位串行输出。接收 UART 在其 Rx 引脚上逐位读取数据包。然后,接收 UART 将数据转换回并行形式,并删除起始位、奇偶校验位和停止位。最后,接收 UART 将数据包并行传输到接收端的数据总线:
发送 UART 不是 clock 信号,而是将 start 和 stop 位添加到正在传输的数据包中。这些位定义了数据包的开头和结尾,因此接收 UART 知道何时开始读取这些位。
当接收 UART 检测到起始位时,它开始以称为波特率的特定频率读取输入位。波特率是衡量数据传输速度的指标,以每秒位数 (bps) 表示。 两个 UART 必须以大致相同的波特率运行。在位的时序相差太大之前,发送和接收 UART 之间的波特率只能相差约 10%,超过此值,位的时序就会脱节。
两个 UART 还必须配置为发送和接收相同的数据包结构。
关于UART必须了解的几点
波特率
特率表示每秒传输的符号数(单位:bps,bits per second),决定了数据传输的速率。
常见值:9600、19200、38400、57600、115200 bps等
重要性:发送端和接收端的波特率必须一致(波特率误差需控制在允许范围内)。
常见问题:波特率不匹配导致数据乱码;高频时钟误差积累引发通信失败。
三、协议帧
在UART中,传输模式为数据包形式。连接发送器和接收器的机制包括串行数据包的创建和物理硬件线路的控制。数据包由起始位、数据帧、奇偶校验位和停止位组成。
3.1 起始位
起始位是单字节 UART 传输的 first bit。它指示数据行正在离开其空闲状态。
当不传输数据时,UART数据传输线通常保持高电压电平。若要开始数据传输,发送UART会将传输线从高电平拉到低电平并保持1个时钟周期。当接收UART检测到高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。