[具身智能-587]:SPI 无长度字段、靠硬件信号边界区分数据帧
一、核心结论
SPI协议层不存在专门的长度字节 / 长度域(不像 Modbus、I2C 无固定帧长标识); SPI 一整段数据传输的起止边界,完全依靠CS 片选电平区分:
- CS 拉低:开始一段数据传输
- CS 全程低:持续收发字节
- CS 拉高:本段传输结束
总线上只要 CS 保持低、SCK 持续输出时钟,就代表在传送数据;
CS 一旦拉高,视为一帧完整传输结束,总线空闲无有效数据。
二、对比其他总线,直观看出 SPI 缺失长度域
1. Modbus-RTU(串口)
帧自带隐性长度逻辑:
- 帧结构:从站地址 + 功能码 + 数据区 + CRC;
- 靠3.5 字符空闲时序分割帧;
- 数据区隐含长度信息(读取寄存器个数、字节计数字段)。
2. I2C
没有显式长度字节,但时序自带分段标识: START / 重复 START/STOP 作为分段标记;每段读写多少字节由上层软件控制,硬件时序分割传输段。
3. SPI
- 无任何字节用于表示 “本次要传多少字节”;
- 无 START/STOP 时序信号;
- 唯一分割手段:CS 高低电平;
- SCK 时钟输出多少个脉冲,就传输多少字节,长度完全由主机软件控制。
三、SPI 如何依靠总线信号区分数据传送(时序逻辑)
-
总线空闲状态(无数据传送) CS = 高电平,SCK 保持空闲电平(Mode0 为低),MOSI/MISO 无有效驱动,总线无时钟脉冲,判定无数据传输。
-
开始传送数据 主机将对应从机的 CS 拉低,随后持续输出 SCK 同步时钟脉冲; 只要 SCK 有时钟跳变,总线上就在同步收发 MOSI/MISO 比特,代表正在传输数据。
-
结束当前一段数据 所有需要收发的字节全部传输完成后,主机拉高 CS; CS 变高后,从机 MISO 输出高阻,SCK 停止脉冲输出,本段数据传输终止。
关键特性:长度完全由主机决定
SPI 从机无法预判本次会传输几个字节,主机想发 N 个字节,就输出 N×8 个 SCK 脉冲,全程 CS 保持低。 示例:
- 读寄存器:发 2 字节(指令 + dummy)→ CS 低期间输出 16 个时钟;
- 连续读 5 字节:发 6 字节(指令 + 5 个 dummy)→ CS 低期间输出 48 个时钟; 传输多长,完全看主机持续驱动时钟的时长,协议本身不携带长度说明。
四、衍生问题:为什么 SPI 不需要长度域?
- 硬件片选天然隔离帧 每一个外设独占独立 CS 引脚,不同设备的传输段物理隔离,不会总线数据混杂,不需要用长度区分不同报文。
- 全双工同步传输,主机完全掌控时序 时钟由主机产生,主机提前知晓本次读写需要多少字节,无需把长度发给从机;从机被动跟随时钟收发比特。
- 外设内部规则固化长度逻辑 如 ADC、Flash、传感器芯片,芯片手册固定指令格式:读指令后固定 N 个返回字节;软件提前约定长度,不靠总线协议携带长度字段。
五、该机制带来的优缺点
优点
- 协议极简,无额外开销字节,传输效率高;
- 帧边界判断逻辑简单,仅靠 GPIO 电平,控制器硬件实现成本低。
缺点
- 无硬件层帧校验 / 帧分隔保护;软件一旦时钟数量写错,通信直接错乱;
- 无法总线广播,多设备必须多路独立 CS;
- 无法自动识别报文截断,若传输中途意外拉高 CS,从机只会丢弃不完整数据,无报错反馈。
六、一句话精炼总结你的原话
SPI 总线协议内部没有专门用于标记数据长度的字段,不依靠数据字节描述报文长短;通信帧的起始与结束完全由片选 CS 电平信号界定,总线存在持续 SCK 时钟脉冲即代表正在传送数据,CS 拉高、时钟停止则代表传输结束。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)