13.3 UART 与 8251 串行通信
处理器会同时处理一个字节的多位,而串行导线让这些位依次通过。通用异步收发器(universal asynchronous receiver/transmitter, UART)在 CPU 的并行字节与定时串行波形之间转换。Intel 8251 是通用同步/异步收发器(universal synchronous/asynchronous receiver/transmitter, USART);本节先使用其异步行为,即每个数据位旁边没有单独的时钟导线。
构造并解码异步帧
异步线路空闲时为逻辑 1。一个帧以逻辑 0 的起始位(start bit)开始,随后是从最低有效位起发送的五至八个数据位,可以包含一个奇偶校验位(parity bit),最后以一个或多个逻辑 1 的停止位(stop bit)结束。接收端与发送端必须事先约定波特率和格式,才能定位并解释相同的位单元。
波特率(baud rate)表示每秒的信号间隔数量。在这里使用的简单二进制信号中,一个波特携带一位,因此
一个包含八个数据位、一个起始位、一个奇偶校验位和一个停止位的帧占 11 个位时间。9600 波特时,传输时间约为 ms,尽管它只交付一个八位有效载荷字节。
偶校验要求数据位与校验位中的 1 总数为偶数;奇校验则要求总数为奇数。校验不匹配能发现一部分损坏帧,但不能指出损坏的位,也无法检测所有多位错误。停止位采样为低会产生帧错误(framing error)。若收发两端波特率不同,采样位置会在帧内逐渐漂移,最终可能形成错误数据或帧错误。
下面的帧示波器允许编辑有效载荷与格式、在线路上注入错误,再比较发送位序列、接收器解码字节与状态。
通过模式、命令和状态操作 8251
复位后,8251 期待一个模式字(mode word)。在异步工作方式下,它选择时钟倍率、字符长度、奇偶校验与停止位长度。此后的控制写入是命令字(command word),用于启停发送器与接收器、控制调制解调器信号、复位错误标志或让设备回到初始状态。
数据通路具有彼此独立的发送与接收两侧:
- 只有
TxRDY表明发送缓冲器可以接收新字节时,软件才能写入。
- 硬件串行化该字节;只有缓冲器和移位寄存器都空时才报告
TxEMPTY。
- 接收器组合出完整帧,把字节放入接收缓冲器并置位
RxRDY。
- 软件必须在下一个完整字节覆盖该缓冲器前读取,否则会置位溢出错误(overrun error,
OE)。
状态位是证据,而不是装饰。TxRDY=1 才允许新数据写入;RxRDY=1 要求读取数据;PE、OE、FE 分别指出奇偶校验、溢出与帧故障。软件可以查询这些位,也可以把就绪输出接入第 12 章的中断系统。中断改变的是软件获知事件的时机,并不会取消正确读取状态与数据寄存器的要求。
两个端点可能各自都工作正常,却因波特率、字符长度、奇偶校验或停止位不一致而无法通信。终端实验会模拟两端、暴露不匹配,并在软件忽略接收缓冲器时让它真的溢出。
第 13.3 节把字节转换成定时帧,并用状态标志保护它们。第 13.4 节将跨越另一种边界:连续物理量与有限数字编码之间的边界。