SPI 物理层

SPI 物理层

SPI 的物理层很简单:4 根单向信号线 + 推挽驱动。相比 I2C 的开漏结构,SPI 的电气特性决定了它能跑出远高于 I2C 的速率。

引脚电气特性

信号 方向 电气特点 说明
SCK 主机 → 从机 推挽输出 时钟,由主机产生,决定传输速率
MOSI 主机 → 从机 推挽输出 主机发送的数据流
MISO 从机 → 主机 推挽输出 从机返回的数据流
CS/SS 主机 → 从机 推挽输出 片选,低电平有效
  • 推挽输出:每个引脚由一个设备独占驱动,高低电平都是强驱动,边沿陡峭 → 速率可以很高(几十 MHz);
  • 对比 I2C 的开漏 + 上拉:不需要上拉电阻,也没有”线与”和仲裁,代价是不支持多主机;
  • 电平通常是标准 TTL/CMOS(3.3V 或 5V),驱动能力与器件有关;
  • 单向线:MOSI 只发、MISO 只收,数据流向固定,所以同一时刻可以”一进一出”(全双工)。

片选信号 CS

  • SPI 没有地址概念,主机用 CS 片选选中目标从机:拉低 CS → 该从机参与传输,拉高 → 从机忽略总线;
  • 一个从机占一根 CS 线,n 个从机共需 3 + n 根线;
  • 空闲时所有从机的 CS 都保持高电平。

一主多从拓扑

graph TB
  M[主机 Master]
  S1[从机 1]
  S2[从机 2]
  S3[从机 3]

  M -- SCK --> S1
  M -- SCK --> S2
  M -- SCK --> S3
  M -- MOSI --> S1
  M -- MOSI --> S2
  M -- MOSI --> S3
  S1 -- MISO --> M
  S2 -- MISO --> M
  S3 -- MISO --> M
  M -- "CS0" --> S1
  M -- "CS1" --> S2
  M -- "CS2" --> S3
  • SCK / MOSI / MISO 三根线所有从机共享,靠 CS 区分当前与主机通信的从机;
  • 未被选中的从机必须把 MISO 置为高阻,否则多个从机同时驱动 MISO 会短路——这是从机硬件必须遵守的规则;
  • MISO 共享线没有上拉(推挽结构),空闲时电平不确定,仅在 CS 有效的传输期间有意义。

📌 待补图:FPGA 与 Flash/ADC 的 SPI 硬件连接原理图

菊花链(Daisy Chain)拓扑

对引脚特别紧张的场景,可以让多个从机串成一链:

graph LR
  M[主机] -- MOSI --> S1[从机1] -- MOSI --> S2[从机2] -- MOSI --> S3[从机3]
  S3 -- MISO --> M
  M -- SCK/CS --> S1
  M -- SCK/CS --> S2
  M -- SCK/CS --> S3
  • 所有从机共享一个 CS 和 SCK,数据像移位寄存器一样逐级穿过每个从机;
  • 缺点:任一级故障整条链失效,且传输 n 个设备需要 n 倍时间。

📌 待补图:SPI 菊花链连接原理图

速率与距离

  • SPI 没有协议规定的速率上限,实际取决于器件和布线;
  • 板内走线可达数十 MHz;距离越远速率越低,跨板连接时 SCK 边沿劣化是主要瓶颈;
  • 主从器件在 PCB 上应尽量靠近(见 SPI 概览 的附注)。