2、SECS-I物理层:RS-232串口通信基础、波特率/数据位/校验位配置、报文块格式与长度计算、CRC校验原理

SECS-I 是 SEMI 标准 E4 定义的物理层与数据链路层协议,其核心载体是 RS-232 串行通信。在嵌入式设备驱动开发中,理解 RS-232 的电气特性与参数配置,是正确实现 SECS-I 报文收发的前提。本章将深入剖析 RS-232 通信基础、报文块结构、长度计算以及 CRC 校验原理,为后续 GEM 状态机与消息处理打下坚实的物理层基础。

2.1 RS-232 串口通信基础

RS-232 是一种异步串行通信标准,在半导体设备中广泛用于主机(Host)与设备(Equipment)之间的点对点连接。SECS-I 规定使用全双工模式,即同时进行发送与接收。

2.1.1 电气特性与信号定义

RS-232 使用负逻辑电平:-3V ~ -15V 表示逻辑“1”(Mark),+3V ~ +15V 表示逻辑“0”(Space)。在 SECS-I 连接中,通常仅使用以下三根核心信号线:

信号名称 DB-9 引脚 方向 功能描述
TX (Transmit Data) 3 设备 → 主机 设备发送数据
RX (Receive Data) 2 主机 → 设备 设备接收数据
GND (Signal Ground) 5 — 信号地参考
开发提示: 在嵌入式驱动中,通常使用 UART 外设模拟 RS-232 时序。注意 RS-232 电平与 TTL 电平(0~3.3V/5V)不兼容,必须使用 MAX232 或类似电平转换芯片。

2.1.2 波特率/数据位/校验位配置

SECS-I 标准规定默认通信参数为:9600 波特率、8 数据位、1 停止位、无校验(N-8-1)。但在实际产线中,也支持 19200、38400 等更高波特率。驱动开发时必须支持动态配置。

参数 SECS-I 默认值 常见可选值 驱动配置注意事项
波特率 (Baud Rate) 9600 19200, 38400, 57600, 115200 需匹配主机侧设置;时钟误差 < 2%
数据位 (Data Bits) 8 7 SECS-I 消息为 8 位字节流,通常固定 8 位
校验位 (Parity) 无 (None) 偶校验 (Even) 无校验时硬件可关闭校验计算以降低延迟
停止位 (Stop Bits) 1 1.5, 2 1 停止位为默认,兼容性最好
流控制 (Flow Control) 无 硬件 (RTS/CTS) SECS-I 标准不推荐使用流控制
驱动实现要点: 在 Linux 嵌入式平台,使用 termios 结构体配置串口。关键步骤包括:设置 c_cflag 中的 CS8、CLOCAL、CREAD;清除 PARENB 以禁用校验;设置波特率通过 cfsetispeed() 和 cfsetospeed()。配置完成后需调用 tcflush() 清空缓冲区。

2.2 报文块格式与长度计算

SECS-I 将上层 SECS-II 消息封装为数据块(Block)进行传输。每个报文块由长度域、头部和数据域组成,其格式严格定义,驱动必须精确解析。

2.2.1 报文块结构

一个完整的 SECS-I 报文块包含以下字段:

字段 长度(字节) 描述
Length (L) 2 报文块总长度(包含自身 2 字节),大端序
Device ID (D) 1 设备标识,低 7 位有效,bit7 为控制位
Message ID (M) 1 消息 ID,用于匹配请求与响应
Block Number (B) 1 块序号,多块消息时递增
End Bit (E) 1 bit 0=中间块,1=最后一块
Wait Bit (W) 1 bit 0=无需回复,1=需要回复
Data (D) 0~244 SECS-II 消息数据,长度可变
CRC 2 CRC-16 校验码,覆盖头部+数据
长度计算陷阱: Length 字段包含自身 2 字节,因此最小值为 0x000A(10 字节:2 长度 + 4 头部 + 2 CRC + 2 数据?实际头部为 4 字节,数据最小 0 字节,CRC 2 字节,总固定开销 8 字节)。驱动在接收时,必须先读取 2 字节长度,再根据长度值读取剩余字节。

2.2.2 报文块长度计算示例

假设一个 SECS-I 报文块包含 100 字节的 SECS-II 数据:

总长度 = 2 (Length) + 4 (Header) + 100 (Data) + 2 (CRC) = 108 字节
Length 字段值 = 0x006C (108 的大端表示)
有效数据负载 = 100 字节
传输效率 = 100 / 108 ≈ 92.6%

2.2.3 报文块结构 SVG 图

SECS-I 报文块结构 Length (2B) Header (4B) Data (0~244B) CRC (2B) Device MsgID Block# E/W 说明: • Length 字段值为 2 + 4 + DataLen + 2,大端序存储。 • Header 中 E bit 为 1 表示最后一块,W bit 为 1 表示需要回复。

2.3 CRC 校验原理

SECS-I 使用 CRC-16-IBM(多项式 0x8005)对报文块进行校验,覆盖范围从 Device ID 到 Data 字段末尾。驱动在发送时计算并附加 CRC,在接收时重新计算并与接收到的 CRC 比较,以检测传输错误。

2.3.1 CRC-16 算法参数

参数 值
多项式 (Polynomial) 0x8005 (x¹⁶ + x¹⁵ + x² + 1)
初始值 (Init) 0x0000
结果异或值 (XOR Out) 0x0000
输入反转 (Input Reflected) 否
输出反转 (Output Reflected) 否

2.3.2 驱动中的 CRC 计算实现

在嵌入式驱动中,推荐使用查表法提高计算效率。以下为 CRC-16-IBM 的查表法实现示例:

/* CRC-16-IBM 查表法实现 */
static const uint16_t crc16_table[256] = {
    0x0000, 0x8005, 0x800F, 0x000A, /* ... 完整 256 项表 */
};

uint16_t secs_crc16(const uint8_t *data, uint16_t len) {
    uint16_t crc = 0x0000;
    for (uint16_t i = 0; i < len; i++) {
        uint8_t index = (crc >> 8) ^ data[i];
        crc = (crc << 8) ^ crc16_table[index];
    }
    return crc;
}
性能优化: 在中断驱动的接收流程中,CRC 计算可逐字节进行,避免在接收完整个报文块后再集中计算,从而降低 CPU 峰值负载。发送时则可在填充完数据后一次性计算并追加 CRC。

2.3.3 CRC 校验流程 SVG 图

SECS-I CRC 校验流程 发送端 计算 CRC 附加到报文末尾 发送完整报文 RS-232 接收端 接收报文 重新计算 CRC 比较 CRC 值 匹配? 处理报文 是 丢弃/重传 否

2.4 本章小结

SECS-I 物理层基于 RS-232 串口,驱动开发需掌握以下核心要点:

  • 参数配置: 默认 9600-8-N-1,驱动需支持动态切换波特率与校验模式。
  • 报文块解析: 严格按 Length + Header + Data + CRC 结构解析,注意大端序与位域处理。
  • CRC 校验: 使用 CRC-16-IBM 算法,查表法实现高效计算,确保数据完整性。
  • 错误处理: CRC 不匹配时需丢弃报文并触发重传机制,避免错误数据进入上层协议栈。