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 | — | 信号地参考 |
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 标准不推荐使用流控制 |
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 校验码,覆盖头部+数据 |
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 图
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;
}
2.3.3 CRC 校验流程 SVG 图
2.4 本章小结
SECS-I 物理层基于 RS-232 串口,驱动开发需掌握以下核心要点:
- 参数配置: 默认 9600-8-N-1,驱动需支持动态切换波特率与校验模式。
- 报文块解析: 严格按 Length + Header + Data + CRC 结构解析,注意大端序与位域处理。
- CRC 校验: 使用 CRC-16-IBM 算法,查表法实现高效计算,确保数据完整性。
- 错误处理: CRC 不匹配时需丢弃报文并触发重传机制,避免错误数据进入上层协议栈。