4、SECS-I(SEMI E4)详解:RS-232串行通信、块传输协议、报文格式、块头结构、校验与重传机制

SECS-I(SEMI E4)是SEMI标准家族中最底层的物理与数据链路层协议,定义了设备(Equipment)与主机(Host)之间通过RS-232C串行接口进行点对点通信的电气特性、帧格式、块传输规则以及错误恢复机制。在SECS/GEM协议栈中,SECS-I位于最底层,向上承载SECS-II消息(SEMI E5),再向上对接GEM(SEMI E30)标准。理解SECS-I的块头结构、校验算法和重传状态机,是进行设备端通信固件开发、协议一致性测试以及产线通信排障的必备基础。本章将围绕其物理层约束、块传输协议、报文格式、块头字节定义、CRC校验与超时重传机制展开深度解析。

SECS-I (SEMI E4) 协议栈与块传输机制 物理层 RS-232C 9600/19200bps 数据链路层 块传输协议 块头(10B)+数据(254B) 消息层 SECS-II (E5) 消息流控制 应用层 GEM (E30) 设备控制 SECS-I 块头结构(10字节) Device ID (2B) RTS (1B) W-bit (1B) System Bytes(2B) Stream (1B) Function (1B) E-bit (1B) Block Number(1B) Total Blocks(1B) Data[0..] (≤254B) 校验机制 CRC-16 (多项式: 0x1021) 覆盖块头+数据,错误则丢弃 重传机制 T1超时(450ms) → 重发 T2超时(10s) → 连接中断

4.1 核心原理:RS-232C物理层与SECS-I的定位

SECS-I标准基于RS-232C串行通信接口,规定了设备与主机之间的物理连接方式。RS-232C采用单端信号传输,最大传输距离约15米,典型波特率为9600bps(部分设备支持19200bps或38400bps)。在SECS-I中,通信采用全双工模式,但实际应用中通常使用三线制连接(TXD、RXD、GND),辅以RTS/CTS硬件流控。值得注意的是,SECS-I并不依赖RS-232的硬件流控来实现数据完整性,而是通过协议层的块确认机制来保证可靠传输。

SECS-I在协议栈中的定位是数据链路层,它负责将上层SECS-II消息分割为若干个数据块(Block),每个块最大254字节,并添加10字节的块头(Block Header)。这些块通过RS-232逐字节发送,接收方根据块头中的信息重组完整消息。SECS-I的块传输协议本质上是一种停等(Stop-and-Wait)ARQ协议:发送方发送一个块后,必须等待接收方的确认(ACK)或否定确认(NAK),才能继续发送下一个块。这种机制虽然降低了吞吐量,但保证了在低速串行链路上的高可靠性。

关键理解:SECS-I不是简单的“串口收发”,而是一个完整的帧同步与错误恢复协议。它定义了块边界(通过块头长度和固定帧结构)、块序号(用于检测重复或丢失)、以及超时重传参数(T1、T2)。在开发设备端驱动时,必须严格实现这些状态转换,否则会出现通信卡死或数据错乱。

4.2 块传输协议与报文格式

SECS-I的报文格式分为两个层次:块(Block)和消息(Message)。一条SECS-II消息可能包含多个块,每个块独立传输并确认。块的结构固定为:块头(10字节) + 数据(0~254字节)。块头中包含了消息路由和重组所需的所有信息。

块头各字段的定义如下表所示:

字节偏移字段名长度说明
0-1Device ID2字节设备标识符,低7位有效,最高位为RTS位(0表示主机请求,1表示设备请求)
2RTS1字节实际上与Device ID的最高位合并,用于区分消息方向
3W-bit1字节等待位,0x00表示需要回复,0x80表示无需回复(仅用于Primary消息)
4-5System Bytes2字节系统字节,用于匹配Primary与Secondary消息,由发送方生成
6Stream1字节消息流编号(0~255),如Stream 1为设备控制
7Function1字节功能编号(0~255),如Function 13为Establish Communication Request
8E-bit1字节结束位,0x00表示消息结束,0x80表示还有后续块
9Block Number1字节当前块序号(从1开始)
10Total Blocks1字节消息总块数(1~127),最高位为0

在块头之后是数据区,最大254字节。如果消息数据超过254字节,则必须拆分为多个块,每个块的E-bit设置为0x80(除最后一个块外),最后一个块的E-bit为0x00。接收方通过Block Number和Total Blocks字段判断是否收到完整消息。

4.3 校验与重传机制

SECS-I使用CRC-16校验算法,多项式为0x1021(x^16 + x^12 + x^5 + 1),初始值为0xFFFF。CRC计算覆盖块头和数据区(共10+N字节),计算出的2字节CRC附加在数据区之后。接收方对收到的完整块(含CRC)重新计算CRC,若结果不为0,则丢弃该块并发送NAK。

重传机制由三个定时器控制:

  • T1(Inter-Character Timeout):默认450ms,用于检测字符间超时。如果接收方在T1时间内未收到下一个字符,则认为帧不完整,丢弃已收到的数据。
  • T2(Block Timeout):默认10秒,用于等待块的确认。发送方发出一个块后,在T2时间内未收到ACK/NAK,则重发该块。
  • T3(Reply Timeout):默认45秒,用于等待Primary消息的Secondary回复。若超时则整个消息失败。

发送方的状态机如下:发送块 → 启动T2 → 等待ACK/NAK → 收到ACK则发送下一块;收到NAK则重发当前块;T2超时则重发当前块。重发次数通常限制为3次,超过后报告通信错误。

风险提示:在实际产线中,T1设置过短会导致高波特率下频繁误判超时;T2设置过长会拖慢通信效率。建议根据实际波特率和线缆长度调整T1,但T2和T3应保持标准值,以确保与主机端兼容。

4.4 实战场景:设备端SECS-I驱动调试案例

某半导体设备厂商在开发新机台时,发现与主机通信时偶发“消息超时”错误,且多发生在传输大文件(如配方上传)时。通过串口抓包分析,发现以下现象:

  1. 主机发送的Primary消息被拆分为5个块,设备端正确接收了前4个块并回复ACK。
  2. 第5个块(最后一个块)发送后,设备端未回复ACK,主机在T2超时后重发第5块。
  3. 设备端收到重发的第5块后,回复ACK,但主机已判定消息失败。

进一步分析设备端日志,发现设备在接收第5块时,CRC校验失败。原因是设备端的接收缓冲区在连续接收多个块后,由于中断处理延迟,导致最后一个块的尾部字节丢失。排查发现设备端UART驱动的中断优先级设置过低,在高速率(19200bps)下无法及时读取FIFO,造成数据溢出。

解决方案:将UART中断优先级提升至最高,并启用FIFO半满中断;同时将接收缓冲区从256字节扩大至512字节。修改后,连续传输100次大文件,未再出现CRC错误或超时。

复盘经验:SECS-I的CRC错误往往不是线路噪声问题,而是接收端软件处理不及时导致的字节丢失。在调试时,应优先检查UART FIFO溢出标志和中断响应时间,而非盲目更换线缆或降低波特率。

4.5 常见误区与总结

在SECS-I协议实现中,工程师常犯以下错误:

  • 误区一:将Device ID与RTS位混淆。Device ID是16位字段,但最高位是RTS标志,实际设备ID只有7位(0~127)。在解析时需先提取RTS位,再取低7位作为设备地址。
  • 误区二:忽略W-bit的作用。W-bit为0x80时表示发送方不期待回复,此时接收方不应发送Secondary消息。若错误回复,会导致发送方状态混乱。
  • 误区三:CRC计算范围错误。CRC必须覆盖块头和数据区,但不包括CRC本身。有些实现将CRC也纳入计算,导致校验永远失败。
  • 误区四:多块消息的Block Number从0开始。标准规定Block Number从1开始,Total Blocks表示总块数。若从0开始,接收方重组时会错位。

总结而言,SECS-I作为SEMI通信的基石,其设计虽然简单但非常严谨。掌握块头结构、CRC校验和重传状态机,是确保设备与主机稳定通信的前提。在开发过程中,建议使用协议分析仪或串口抓包工具进行验证,并严格按照SEMI E4标准文档实现各定时器参数。