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校验与超时重传机制展开深度解析。
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),才能继续发送下一个块。这种机制虽然降低了吞吐量,但保证了在低速串行链路上的高可靠性。
4.2 块传输协议与报文格式
SECS-I的报文格式分为两个层次:块(Block)和消息(Message)。一条SECS-II消息可能包含多个块,每个块独立传输并确认。块的结构固定为:块头(10字节) + 数据(0~254字节)。块头中包含了消息路由和重组所需的所有信息。
块头各字段的定义如下表所示:
| 字节偏移 | 字段名 | 长度 | 说明 |
|---|---|---|---|
| 0-1 | Device ID | 2字节 | 设备标识符,低7位有效,最高位为RTS位(0表示主机请求,1表示设备请求) |
| 2 | RTS | 1字节 | 实际上与Device ID的最高位合并,用于区分消息方向 |
| 3 | W-bit | 1字节 | 等待位,0x00表示需要回复,0x80表示无需回复(仅用于Primary消息) |
| 4-5 | System Bytes | 2字节 | 系统字节,用于匹配Primary与Secondary消息,由发送方生成 |
| 6 | Stream | 1字节 | 消息流编号(0~255),如Stream 1为设备控制 |
| 7 | Function | 1字节 | 功能编号(0~255),如Function 13为Establish Communication Request |
| 8 | E-bit | 1字节 | 结束位,0x00表示消息结束,0x80表示还有后续块 |
| 9 | Block Number | 1字节 | 当前块序号(从1开始) |
| 10 | Total Blocks | 1字节 | 消息总块数(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次,超过后报告通信错误。
4.4 实战场景:设备端SECS-I驱动调试案例
某半导体设备厂商在开发新机台时,发现与主机通信时偶发“消息超时”错误,且多发生在传输大文件(如配方上传)时。通过串口抓包分析,发现以下现象:
- 主机发送的Primary消息被拆分为5个块,设备端正确接收了前4个块并回复ACK。
- 第5个块(最后一个块)发送后,设备端未回复ACK,主机在T2超时后重发第5块。
- 设备端收到重发的第5块后,回复ACK,但主机已判定消息失败。
进一步分析设备端日志,发现设备在接收第5块时,CRC校验失败。原因是设备端的接收缓冲区在连续接收多个块后,由于中断处理延迟,导致最后一个块的尾部字节丢失。排查发现设备端UART驱动的中断优先级设置过低,在高速率(19200bps)下无法及时读取FIFO,造成数据溢出。
解决方案:将UART中断优先级提升至最高,并启用FIFO半满中断;同时将接收缓冲区从256字节扩大至512字节。修改后,连续传输100次大文件,未再出现CRC错误或超时。
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标准文档实现各定时器参数。