通信接口、协议和总线
引言
操作系统本身作为一个运行在保护内存空间的软件,并不直接感知物理电信号。因此,它必须借助总线、接口与协议这三者来共同构建一个稳定、统一的硬件抽象层。
- 通信接口(硬件,物理)
物理特性:连接器的形状、尺寸、引脚数量、引脚排列。
电气特性:代表数字0和1的电压水平是多少、信号的传输速率(波特率)、阻抗匹配等。
功能特性:引脚作用(数据线,时钟线,电源线,地线)。
- 通信协议(逻辑,软件)
数据帧格式:通常包括起始位、地址域、控制域、数据域、校验位(CRC)、停止位。
通信时序:什么时候可以开始发送数据?发送方和接收方如何同步?是否需要时钟信号?(同步 vs 异步)
握手与应答:双方确认数据已成功接收;
寻址机制:多个设备通信时找到目标设备;
错误检测与纠正:发现传输过程中的错误(如奇偶校验、CRC校验)。
- 总线(共享的通信路径)
共享性:多个设备挂接在同一组信号线上,通过仲裁来分时使用这条通道。
拓扑结构:通常是多对多的结构(如一条总线连接一个主设备和多个从设备)。
标准化:涵盖了机械接口、电气特性、信号时序、通信协议等所有方面。
1. USART(通用同步/异步收发器)
串行通信为通用同步/异步收发器接口(Universal Synchronous/Asynchronous Receiver/Transmitter,USART),同时支持同步单向数据通信和半双工单线通信(单线模式)。如下图则是PC与微处理器之间通过USART进行数据交换和通信。
简单来说,USART的物理层就是两个通信线(接收和发送)双方约定好通信的速度,也就是波特率 Baud Rate,单位为bps(bit per second,bps)。
USART 的通信协议
- 关键时序特征
- 波特率:串口通信的速率,异步通讯中由于没有时钟信号,所以两个通讯设备之间应该约定好波特率。
- 起始位:标志一个内容帧的开始,固定为低电平,串口的空闲状态位高电平。
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行。
- 校验位:用于数据验证,根据数据位计算得来。
- 停止位:用于数据帧间隔,固定为高电平,为下一个起始位做准备。
USART 缺点
- 不能远距离传输信号(发展出 RS232,RS485)
[!NOte]
UART本身定义的是“逻辑电平”,而不是“物理电平”。
- 电压衰减:TTL电平的电压较低(5V),在长距离传输时,导线电阻和干扰会导致信号电压衰减,接收端可能无法正确识别0和1。
- 抗干扰能力差:TTL是单端信号(一根信号线,以地线为参考)。长距离布线就像一根天线,会引入大量的外部电磁干扰。这些干扰会叠加在信号上,严重扭曲波形。
- 地电位差:在长距离通信中,发送端和接收端的“地”可能不在同一个电位上(存在地电位差)。这个电压差会直接导致信号判决错误。
- 较慢的通信速度(发展出SPI)
[!NOte]
UART是异步通信,且依赖于精确的预定义波特率。
- 时钟累积误差:发送器和接收器使用各自独立的内部时钟。即使初始波特率设置相同,晶体振荡器的微小误差也会随着时间(随着每个比特的传输)而累积。这限制了单个数据帧不能太长(通常是8-10位),否则会因为时钟不同步而采样到错误的比特。
- 起始位同步的精度:接收端仅在每个字节的起始位边沿进行一次同步,之后的所有比特都基于这个初始同步和预定的波特率进行采样。如果波特率有偏差,在帧的末尾采样点就可能偏离比特中心,导致误码。这从根本上限制了其最高速率。
- 开销:每个字节都需要额外的起始位和停止位(至少2位开销),有效数据吞吐量降低。
- 不能一对多通信(发展出I2C)
[!NOte]
UART的通信模型是点对点的,没有寻址机制。
- 点对点模型:一个UART端口通常只能直接连接另一个UART端口。TX对RX,RX对TX。如果要将一个主设备连接到多个从设备,你需要为每个从设备配备一个独立的UART端口,这非常浪费硬件资源。
- 没有地址概念:UART发送的数据就是纯数据流,数据帧里不包含任何地址信息。接收端无法判断这个数据是不是发给自己的。
2. RS232 和 RS485
这些协议在UART的上层,定义了更强大、更适合远距离的物理层标准。UART负责组帧(起始位、数据位、停止位),RS232/RS485负责将TTL电平转换成更适合传输的电平。
