串口
串口(UART)是嵌入式系统中最基础最常用的通信方式之一,简单,通用并且无需时钟同步。串口通信是一种异步串行通信方式,数据按位(bit)依次传输,每次传输一个字节(通常为8位)。由于是异步通信,通信双方不共享时钟信号,而是通过约定好的参数来保证数据正确接收。
1. UART
硬件连接:
最基础的串口通信只需要两根信号线:TX(Transmit):发送数据;RX(Receive):接收数据。UART 数据传输是全双工的,通信双方可以同时发送和接收数据。此外发送和接收双方需要共地以保证参考电平一致。连线方式示意图如下。
串口通信以帧为单位传输数据,一个完整的数据帧通常包括:起始位(1位),数据位(8位最常用),校验位(奇偶校验,可选),停止位(常用1位)。最常用的搭配是8N1,即8位数据位,无校验,1位停止位。由于没有时钟同步,所以通信双方必须约定一个一致的通信速率,也就是波特率。常用的波特率为9600,115200等。串口通信的简单时序如下图所示。
基础串口通信的优点在于硬件连接简单,无需额外的时钟信号即可实现数据传输,但这也带来了一些局限性。首先,串口通信的传输速率相对较低,其设计以简单可靠为主,在较高波特率或复杂电磁环境下,误码率可能会有所上升。其次,串口通信不适合长距离传输,信号在传输过程中容易受到电磁干扰以及线路延迟等因素的影响,从而降低通信可靠性。此外,串口通信通常采用点对点方式,仅适用于两个设备之间的数据交换,难以支持多设备组网通信。综上所述,串口通信常用于对实时性和速率要求不高的场景,例如调试信息输出、板级模块之间的通信以及短距离程序下载等。
2. RS232
为了解决基本串口通信在传输距离和抗干扰能力以及通信规模等方面的限制,逐渐发展出了 RS232 和 RS485 等更完善的串行通信标准。需要注意的是,这些标准并不是对 UART 协议的替代,而是在物理层对其电气特性进行改善,从而提升通信性能和适用范围。
RS232 是较早提出的一种串行通信标准,广泛应用于计算机与外设之间的连接(笔者常用的设备与上位机通信很多基于 DP9 接口)。RS232 同样是全双工通信,它通过提高信号电压幅度(通常为 ±3V~±15V)来增强抗干扰能力,并定义了完整的接口规范(如 DB9 接口)。需要注意的是,RS232 除了提高了信号电平幅度之外,其逻辑极性是与 TTL 电平相反的,可见下面时序图。RS232 仍然采用单端信号传输方式,通常用于点对点通信,传输距离一般在 15 米以内,速率相对有限。因此,它常见于早期计算机串口、工业设备调试接口以及一些简单的外设通信场景。下图是 RS232 典型的设备通信连线示意图。
RS232 的时序如下图所示:
3. RS485
随着工业控制等场景对通信距离和可靠性的要求不断提高,RS485 应运而生。RS485 采用了差分信号传输,能够有效抑制共模干扰,从而显著提升抗干扰能力和传输距离(可达上千米)。同时,RS485 支持多节点通信,一条总线上可以挂接多个设备(典型为 32 个或更多),非常适合构建分布式系统。需要注意的是,RS-485 本身只定义了物理层规范,具体的数据通信规则通常由上层协议实现,例如 Modbus 等工业通信协议。
由于 RS485 采用了差分信号传输,一位信号的表示需要两根线的电位差来判断,因此其仅支持半双工通信。差分信号采用两根线来进行信号传输,接收设备通过两根线的电压差判断逻辑值(≥+200mV 为 1,≤−200mV 为 0),因此天然抗共模干扰。
RS485 的时序逻辑如下图所示,其核心改良就是使用差分信号进行数据传输以提高长距离通信的抗干扰能力,本质上还是电气特性的改良,而时序规范还是依据串口标准。RS485 的另一特性是可以支持多设备通信,如上图所示,一般是有一个主机和若干个从机。由于 RS485 本身只是物理层标准,它只定义了电气特性(差分信号、电压范围、阻抗),不包含任何地址或寻址机制,因此要实现多设备通信需要依赖 RS485 之上的通信协议,最常见的协议是Modbus。这里只做简单介绍,知道逻辑即可。首先主机发送广播帧,广播帧中含有目标通信从机的地址,广播帧所有从机都可以收到,不匹配的从机就静默处理,匹配的从机就接收数据并发送应答帧。
二、I2C
I2C(Inter-Integrated Circuit) 是嵌入式系统中非常常用的一种同步串行通信协议,该协议最初由飞利浦(现恩智浦)提出,广泛应用于芯片之间的短距离通信,比如传感器、EEPROM、ADC/DAC 等外设。
I2C 仅通过一条串行数据线(SDA)和一条串行时钟线(SCL)即可在多个设备间进行同步、半双工的数据传输。I2C 适用于多设备通信,每个设备都有自己的地址(一般是7位),主设备负责产生时钟并发起通信,从设备则响应主设备的请求。I2C 的典型速率包括标准模式(100 kbps)、快速模式(400 kbps)以及更高速模式(如1 Mbps快速模式+和3.4 Mbps高速模式),因引脚少、连接简单且能灵活扩展,I2C被广泛应用于同一电路板内芯片之间的短距离低速通信。
I2C 的 SDA 和 SCL 都采用一种开漏结构的输出方式,其特点是只能主动输出低电平,而不能主动输出高电平。 如果所有设备都只能拉低,那“高电平”从哪来?此时就需要上拉电阻来提供高电平。上拉电阻把总线“默认拉到高电平”,任意设备需要发送“0”时把线拉低,没人拉低时线路被电阻拉回高电平。典型的硬件结构如下图所示。