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摘要
电线 | 2 |
速度 | 9600、19200、38400、57600、115200、230400、460800、921600、1000000、1500000 |
传播方式 | 异步 |
最大硕士 | 1个 |
最大从站数 | 1个 |
UART接口不使用时钟信号来同步发送器和接收器设备。它异步传输数据。当接收器使用其内部时钟信号采样输入数据时,发送器将根据其时钟信号生成比特流,而不是时钟信号。通过在两个设备上具有相同的波特率来管理同步点。否则可能会影响发送和接收数据的时间,从而导致数据处理过程中的差异。在位的时序变得太远之前,波特率的允许差异最大为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依次发送。接收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)
标头是确定您是否与之通信的唯一标识符
正确的设备。
命令(CMD)选择
命令将取决于旨在创建两个设备之间的通信的命令列表。
每个命令的数据长度(DL)
数据长度将基于所选命令。您可以根据所选择的命令来最大化数据长度,因此它可以根据选择而变化。在这种情况下,可以调整数据长度。
数据n(变化数据)
数据是要从设备传输的有效负载。
尾部1(T1为0xE1)和尾部2(T2为0xE2)
尾部是在传输结束后添加的数据。就像标题一样,它们可以唯一地标识。
循环冗余校验(CRC公式)
循环冗余校验公式是一种附加的错误检测模式,用于检测原始数据的意外更改。发送设备的CRC值必须始终等于接收器端的CRC计算值。
建议通过为每个UART设备实现帧协议来增加安全性。帧协议在发送和接收设备上都需要相同的配置。
UART操作
使用任何硬件通信协议时,必须先阅读数据表和硬件参考手册。
以下是要遵循的步骤:
首先:检查设备的数据表接口。
图14.单片机数据表。
图15.微处理器内存映射。
第三:检查UART端口的详细信息,例如操作模式,数据位长度,奇偶校验位和停止位。数据手册中的示例UART端口详细信息:
UART端口
示例MCU提供了一个全双工UART端口,该端口与PC标准UART完全兼容。UART端口为其他外围设备或主机提供了简化的UART接口,支持全双工,DMA和串行数据的异步传输。UART端口支持五到八个数据位,无奇偶校验。帧以一个半或两个停止位终止。
第四:检查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 | 虚拟机 | 迪文 |
9600 | 3 | 24 | 3 | 1078 |
115200 | 3 | 4 | 1个 | 1563 |
表3.基于16 MHz PCLK的波特率示例
波特率 | OSR | DIV | 虚拟机 | 迪文 |
9600 | 3 | 17 | 3 | 1078 |
115200 | 3 | 2 | 2 | 348 |
第六:下一部分是检查UART配置的详细寄存器。看一下计算波特率时的参数,例如UART_LCR2,UART_DIV和UART_FBR。表4将列出一个特定的寄存器。
表4. UART寄存器说明
名称 | 描述 |
UART_DIV | 波特率分频器 |
UART_FIBR | 小数波特率 |
UART_LCR2 | 二线控制 |
第七:在每个寄存器下,检查详细信息并用值替代波特率,然后开始实现UART。
它为什么如此重要?
在开发强大的,质量驱动的产品时,熟悉UART通信协议非常有帮助。知道如何仅使用两条线发送数据,以及如何传输整包数据或有效载荷,将有助于确保正确无误地传输和接收数据。由于UART是最常用的硬件通信协议,因此该知识可以在将来的设计中实现设计灵活性。
用例
您可以将UART用于许多应用程序,例如:
- 调试:在开发过程中及早发现系统错误很重要。在这种情况下,添加UART可以通过捕获系统消息来提供帮助。
- 制造功能级别跟踪:日志在制造中非常重要。他们通过提醒操作员生产线上正在发生的事情来确定功能。
- 客户或客户更新:软件更新非常重要。具有完整的,具有可更新功能的软件的动态硬件对于拥有完整的系统至关重要。
- 测试/验证:在产品离开制造过程之前对其进行验证有助于为客户提供最优质的产品。