理解 UART
UART 或通用异步接收器-发送器,是最常用的设备到设备通信协议之一。本文展示了如何按照标准流程使用UART作为硬件通信协议。
正确配置后,UART 可以使用多种不同类型的串行协议,包括发送和接收串行数据。在串行通信中,数据使用单根线或线逐位传输。在双向通信中,我们使用两条线来成功进行串行数据传输。根据应用和系统要求,串行通信需要较少的电路和电线,从而降低了实现成本。
在本文中,我们将讨论使用 UART 时的基本原则,重点是数据包传输、标准帧协议和自定义帧协议,这些是实现安全合规性的增值功能,尤其是在代码开发过程中。在产品开发过程中,本文档也旨在分享在实际使用中检查数据表时的一些基本步骤。
在文章的最后,目标是更好地理解和遵守 UART 标准,以最大限度地发挥功能和应用,尤其是在开发新产品时。
“沟通中最大的一个问题是它已经发生的错觉。”
——萧伯纳
通信协议在组织设备之间的通信方面起着重要作用。它根据系统需求以不同的方式设计,这些协议在设备之间达成了特定的规则以实现成功的通信。
嵌入式系统、微控制器和计算机大多使用 UART 作为设备到设备硬件通信协议的一种形式。在现有的通信协议中,UART的发送端和接收端仅使用两根线。
尽管是一种广泛使用的硬件通信协议方法,但它并没有一直得到充分优化。在微控制器内部使用 UART 模块时,通常会忽略帧协议的正确实现。
根据定义,UART 是一种硬件通信协议,它使用具有可配置速度的异步串行通信。异步意味着没有时钟信号来同步从发送设备到接收端的输出位。
界面
图 1. 两个 UART 直接相互通信。
每个UART设备的两个信号命名为:
- 发射器 (Tx)
- 接收器 (Rx)
每个设备的发送器和接收器线的主要用途是发送和接收用于串行通信的串行数据。
图 2. 带有数据总线的 UART。
发送 UART 连接到以并行形式发送数据的控制数据总线。从这里开始,数据现在将在传输线(电线)上串行传输,逐位传输到接收 UART。反过来,这会将串行数据转换为并行数据以供接收设备使用。
UART 线路用作通信介质,将一个数据传输到另一个数据并将其接收。请注意,UART 设备具有专用于发送或接收的发送和接收引脚。
对于 UART 和大多数串行通信,需要在发送和接收设备上设置相同的波特率。波特率是信息传输到通信信道的速率。在串口上下文中,设置的波特率将作为每秒传输的最大比特数。
表 1 总结了我们必须了解的有关 UART 的知识。
表 1. UART 汇总
Wires2Speed9600, 19200, 38400, 57600, 115200, 230400, 460800, 921600, 1000000, 1500000传输方式异步最大主站数1lavesimum1UART 接口不使用时钟信号来同步发送器和接收器设备;它异步传输数据。发送器不是时钟信号,而是基于其时钟信号生成比特流,而接收器则使用其内部时钟信号对传入数据进行采样。通过在两个设备上具有相同的波特率来管理同步点。否则可能会影响发送和接收数据的时间,从而导致数据处理过程中出现差异。波特率允许偏差在位时序过远前可达10%。
数据传输
在 UART 中,传输模式采用数据包的形式。连接发送器和接收器的部分包括创建串行数据包并控制那些物理硬件线路。数据包由起始位、数据帧、奇偶校验位和停止位组成。
图 3. UART 数据包。
开始位
UART 数据传输线在不传输数据时通常保持在高电压电平。为了开始数据传输,发送 UART 将传输线从高电平拉至低电平一 (1) 个时钟周期。当接收UART检测到高低电压转换时,开始以波特率的频率读取数据帧中的位。
图 4. 起始位。
数据框
数据帧包含正在传输的实际数据。如果使用奇偶校验位,它可以是五 (5) 位到八 (8) 位长。如果未使用奇偶校验位,则数据帧的长度可以是九 (9) 位。大多数情况下,数据以最低有效位在前发送。
图 5. 数据框。
平价
奇偶性描述了一个数的偶数或奇数。奇偶校验位是接收 UART 判断传输过程中是否有任何数据发生变化的一种方式。位可以通过电磁辐射、不匹配的波特率或长距离数据传输来改变。
接收 UART 读取数据帧后,计算值为 1 的位数,并检查总数是偶数还是奇数。如果奇偶校验位为 0(偶校验),则数据帧中的 1 或逻辑高位总计应为偶数。如果奇偶校验位为 1(奇校验),则数据帧中的 1 位或逻辑高位合计为奇数。
当奇偶校验位与数据匹配时,UART 就知道传输没有错误。但如果奇偶校验位为 0,且总数为奇数,或奇偶校验位为 1,且总数为偶数,则 UART 知道数据帧中的位发生了变化。
图 6. 奇偶校验位。
停止位
为了发出数据包结束的信号,发送 UART 将数据传输线从低电压驱动到高电压,持续一 (1) 到两 (2) 位。
图 7. 停止位。
UART 传输步骤
第一:发送UART从数据总线并行接收数据。
图 8. 到发送 UART 的数据总线。
第二:发送UART在数据帧中添加起始位、奇偶校验位和停止位。
图 9. Tx 端的 UART 数据帧。
第三:整个数据包从开始位到停止位从发送UART串行发送到接收UART。接收UART以预先配置的波特率对数据线进行采样。
图 10. UART 传输。
第四:接收UART丢弃数据帧中的起始位、奇偶校验位和停止位。
图 11. Rx 端的 UART 数据帧。
第五:接收UART将串行数据转换回并行数据,传送到接收端的数据总线上。
图 12. 接收 UART 到数据总线。
帧协议
UART 中可用但尚未完全使用的一项关键功能是帧协议的实现。其主要用途和重要性是为每个设备的安全和保护增加附加值。
例如,当两台设备使用相同的UART帧协议时,存在这样的趋势,即在不检查配置的情况下连接到同一个UART时,设备会连接到不同的引脚,从而可能导致系统出现故障。
另一方面,由于需要按照设计帧协议解析接收到的信息,因此实现这一点可确保安全性。每个帧协议都专门设计为独特且安全。
在设计帧协议时,设计人员可以为不同的设备设置所需的报头和报尾,包括 CRC。在图 13 中,两 (2) 个字节被设置为标头的一部分。
第二:在内存映射下,检查UART地址。
图 13. UART 帧协议示例。
根据示例,您可以设置设备独有的标头、尾标和 CRC。
标题 1(H1 为 0xAB)和标题 2(H2 为 0xCD)
Header 是唯一标识符,用于确定您是否正在与之通信
正确的设备。
命令 (CMD) 选择
命令将取决于旨在创建两个设备之间的通信的命令列表。
每个命令的数据长度 (DL)
数据长度将基于选择的命令。您可以根据选择的命令最大化数据长度,因此它可以根据选择而变化。在这种情况下,可以调整数据长度。
数据 n(变化数据)
数据是要从设备传输的有效载荷。
预告片 1(T1 为 0xE1)和预告片 2(T2 为 0xE2)
尾部是传输结束后添加的数据。就像 Header 一样,它们可以被唯一标识。
循环冗余校验(CRC 公式)
循环冗余校验公式是一种附加的错误检测模式,用于检测原始数据的意外更改。发送设备的 CRC 值必须始终等于接收端的 CRC 计算值。
建议通过为每个 UART 设备实施帧协议来增加安全性。帧协议需要在发送和接收设备上进行相同的配置。
UART 操作
使用任何硬件通信协议时,先查看数据手册和硬件参考手册。
以下是要遵循的步骤:
第一:查看设备的数据手册界面。
图 14. 微控制器数据表。
图 15. 微控制器内存映射。
第三:检查UART PORT的具体细节,如操作模式、数据位长度、奇偶校验位和停止位。数据表中的示例 UART 端口详细信息:
UART 端口
示例 MCU 提供全双工 UART 端口,与 PC 标准 UART 完全兼容。 UART 端口为其他外设或主机提供简化的 UART 接口,支持全双工、DMA 和串行数据的异步传输。 UART 端口支持 5 到 8 个数据位,以及无、偶或奇奇偶校验。一帧以一个半或两个停止位结束。
第四:检查UART操作细节,包括波特率计算。使用以下示例公式配置波特率。该公式因微控制器而异。
UART操作的示例细节:
- 5 到 8 个数据位
- 1、2 或 1 和 ½ 个停止位
- 无,或奇偶校验
- 4、8、16、32 的可编程过采样率
- 波特率 =PCLK/((M + N/2048) × 2 OSR + 2 × DIV
其中,
OSR(过采样率)
UART_LCR2.OSR =0 到 3
DIV(波特率分频器)
UART_DIV =1 到 65535
M(DIVM 小数波特率 M)
UART_FBR.DIVM =1 到 3
N(DIVM 小数波特率 M)
UART_FBR.DIVN =0 到 2047
第五:对于波特率,一定要检查使用什么外设时钟(PCLK)。在本例中,有 26 MHz PCLK 和 16 MHz PCLK 可用。请注意,OSR、DIV、DIVM 和 DIVN 因设备而异。
表 2. 基于 26 MHz PCLK 的波特率示例
波特率 OSR DIV DIVM DIVN 9600324310781152003411563表 3. 基于 16 MHz PCLK 的波特率示例
波特率 OSR DIV DIVM DIVN 960031731078115200322348第六:接下来是查看UART Configuration的详细寄存器。查看计算波特率的参数,例如UART_LCR2、UART_DIV 和UART_FBR。表 4 将导致要涵盖的特定寄存器。
表 4. UART 寄存器说明
姓名 说明 UART_DIVBaud率分频器UART_FIBR小数波特率UART_LCR2二线控制第七步:在每个寄存器下,检查细节并代入计算波特率的值,然后开始实现UART。
为什么重要?
熟悉 UART 通信协议在开发稳健、质量驱动的产品时具有优势。知道如何仅使用两条线发送数据,以及如何传输一整包数据或有效载荷,将有助于确保数据的传输和接收没有错误。由于 UART 是最常用的硬件通信协议,因此这些知识可以在未来的设计中实现设计灵活性。
用例
您可以将 UART 用于许多应用程序,例如:
- 调试:在开发过程中及早发现系统错误很重要。在这种情况下,添加 UART 可以通过从系统捕获消息来提供帮助。
- 制造功能级跟踪:日志在制造中非常重要。他们通过提醒操作员生产线上发生的事情来确定功能。
- 客户或客户更新:软件更新非常重要。拥有完整、动态的硬件和可更新的软件对于拥有完整的系统很重要。
- 测试/验证:在产品离开制造过程之前对其进行验证有助于向客户提供最优质的产品。
参考文献
“UART 通信基础。”电子中心,2017 年 7 月。
坎贝尔,斯科特。 “UART 通信基础。” 电路基础 .凯姆,罗伯特。
“回归基础:通用异步接收器/发送器。” 关于电路的一切 , 2016 年 12 月。
“什么是UART协议? UART 通信解释。”箭头。
嵌入式