2、SECS-I协议详解:RS-232物理层、块传输协议、消息格式、校验和计算

SECS-I(SEMI Equipment Communications Standard 1)是SECS/GEM协议栈中最底层的通信协议,定义了数据在物理介质上的传输方式。它基于RS-232C串行通信标准,并在此基础上增加了面向半导体设备的块传输协议、消息帧格式以及校验机制。理解SECS-I是掌握整个SECS/GEM通信体系的基础。

核心要点: SECS-I 并非单纯的 RS-232,而是在 RS-232 物理层之上,定义了一套适用于半导体制造的“块传输”协议,确保数据在噪声环境下可靠、有序地传输。

2.1 RS-232C 物理层规范

SECS-I 直接采用 RS-232C 标准作为其物理层。在半导体工厂环境中,设备通常通过专用的串行线缆连接至主机(Host)。

参数 SECS-I 规范值 说明
接口标准 RS-232C 点对点,全双工
连接器 DB-25 或 DB-9 通常使用 DB-25
传输模式 异步,全双工 可同时发送和接收
波特率 9600 bps(常用) 标准支持 1200 ~ 19200 bps
数据位 7 位 ASCII 字符传输
停止位 1 位 —
奇偶校验 偶校验(Even) 用于字节级错误检测
信号电平 ±3V ~ ±15V 标准 RS-232 电平
工程师笔记: 虽然 RS-232 理论最大距离约 15 米,但在洁净室环境中,通常使用 RS-232 转 RS-422/485 转换器来延长通信距离,或直接采用 SECS-II 中定义的 TCP/IP 网络方案(HSMS)。
SECS-I 物理层连接拓扑 Host (主机) Equipment (设备) RS-232C 串行线缆 TX (发送) RX (接收) GND (信号地) 全双工:Host 和 Equipment 可同时发送数据

2.2 块传输协议(Block Transfer Protocol)

SECS-I 的核心在于其独特的“块传输”机制。由于 RS-232 是面向字节的流式传输,SECS-I 将上层(SECS-II)的长消息分割成多个固定大小的“数据块”(Block)进行传输,接收方再将其重组。这种设计提高了抗干扰能力和传输可靠性。

2.2.1 数据块(Block)结构

每个数据块是 SECS-I 传输的基本单元,其长度固定为 13 个字节(Header 10 字节 + Data 最多 254 字节,但实际传输时 Data 部分长度可变,总长度仍以块为单位管理)。标准块结构如下:

字节偏移 字段名称 长度(字节) 描述
0 Length Byte 1 表示该块中后续数据的长度(包括 Header 和 Data)
1 ~ 10 Block Header 10 包含设备ID、消息ID、块号、系统字节等控制信息
11 ~ N Data 0 ~ 244 SECS-II 消息的实际载荷(文本或二进制)
N+1 Checksum 2 对整个块(Length Byte + Header + Data)的校验和
常见误区: 初学者常误以为 SECS-I 的块大小是固定的 13 字节。实际上,Length Byte 决定了块的总长度,Header 固定 10 字节,Data 长度可变,因此块的总长度是动态的(最小 13 字节,最大 255 字节)。

2.2.2 多块消息传输流程

当一条 SECS-II 消息超过单个块的最大数据容量时,SECS-I 会将其拆分为多个块(Multi-Block Message)。传输遵循“发送-等待-确认”的机制。

多块消息传输流程(Multi-Block) Host Equipment Block 1 (E-bit=0) ACK (确认) Block 2 (E-bit=0) ACK (确认) Block 3 (E-bit=1, 最后一块) ACK (确认) E-bit (End bit): 0 表示中间块,1 表示最后一块 接收方收到 E-bit=1 的块后,开始重组完整消息

2.3 消息格式详解

SECS-I 的消息格式以“块”为单位,每个块包含一个 10 字节的头部(Header)和可变长度的数据部分。头部是控制通信的核心。

2.3.1 10 字节块头部(Block Header)结构

字节 字段 位 描述
0 Device ID bit 0-7 设备ID(低8位),用于标识通信的设备
1 Device ID / R-bit bit 0-6 / bit 7 bit 0-6 为设备ID高7位;bit 7 为 R-bit(回复位)
2 Message ID (Low) bit 0-7 消息ID低8位
3 Message ID (High) bit 0-7 消息ID高8位
4 Block Number bit 0-7 块号(低8位),从0开始递增
5 Block Number / E-bit bit 0-6 / bit 7 bit 0-6 为块号高7位;bit 7 为 E-bit(结束位)
6 System Bytes (High) bit 0-7 系统字节高8位,用于消息匹配
7 System Bytes bit 0-7 系统字节
8 System Bytes bit 0-7 系统字节
9 System Bytes (Low) bit 0-7 系统字节低8位
关键字段解读:
  • R-bit (Reply bit): 1 表示发送方期望接收方回复;0 表示不需要回复。
  • E-bit (End bit): 1 表示当前块是该消息的最后一个块;0 表示后续还有块。
  • System Bytes: 4 字节的唯一标识符,用于将请求和回复消息配对。

2.4 校验和计算(Checksum)

SECS-I 使用 16 位循环冗余校验(CRC-16) 来保证数据传输的完整性。校验和覆盖从 Length Byte 开始到 Data 结束的所有字节。

2.4.1 校验和算法

标准 SECS-I 使用 CRC-16-IBM 多项式:x¹⁶ + x¹⁵ + x² + 1(多项式值:0x8005)。

计算步骤:

  1. 初始化 CRC 寄存器为 0xFFFF。
  2. 对每个字节(从 Length Byte 开始到 Data 的最后一个字节),与 CRC 寄存器低8位进行异或运算。
  3. 对每个字节的8个位,依次右移一位,如果移出的位为1,则与多项式 0x8005 进行异或。
  4. 处理完所有字节后,对 CRC 寄存器取反(按位取反),得到最终的 16 位校验和。
  5. 将校验和以 高字节在前(Big-Endian) 的顺序附加在数据块末尾。

2.4.2 校验和计算示例(C语言风格)

// CRC-16-IBM 校验和计算函数
unsigned short calculate_secs1_checksum(unsigned char *data, int length) {
    unsigned short crc = 0xFFFF;
    int i, j;

    for (i = 0; i < length; i++) {
        crc ^= data[i];  // 与当前字节异或
        for (j = 0; j < 8; j++) {
            if (crc & 0x0001) {
                crc = (crc >> 1) ^ 0x8005;  // 多项式异或
            } else {
                crc = crc >> 1;
            }
        }
    }
    return ~crc;  // 取反得到最终校验和
}
验证方法: 接收方使用相同的算法计算收到的数据块(包括 Length Byte、Header 和 Data)的 CRC 值,然后与发送方附加的 2 字节校验和进行比较。如果一致,则数据完整;否则请求重传。
SECS-I 数据块校验范围 Length Block Header (10 Bytes) Data (0 ~ 244 Bytes) CRC-16 CRC 计算覆盖范围 附加在末尾

2.5 通信流程与状态机

SECS-I 的通信遵循严格的状态机,确保双方同步。主要状态包括:

  • Disabled(禁用): 物理层未连接或初始化失败。
  • Enabled(启用): 物理层就绪,等待通信。
  • Selected(选中): 已建立逻辑连接,可以发送和接收数据块。
  • Communicating(通信中): 正在传输多块消息。
避坑指南: 在实际调试中,最常见的 SECS-I 故障是 校验和不匹配 和 块号乱序。务必确保发送方和接收方的 CRC 算法实现一致,并且块号严格从 0 开始递增。

通过以上对 RS-232 物理层、块传输协议、消息格式和校验和计算的详细解析,你已经掌握了 SECS-I 协议的核心机制。这是后续理解 SECS-II 消息结构和 HSMS 通信的基础。