4、SPI物理层设计:IO接口类型、电平匹配与驱动能力

各位同学,今天我们聊聊SPI物理层。说实话,很多工程师写RTL代码时只关注逻辑功能,觉得物理层是PCB工程师的事。但我在项目中吃过不少亏——逻辑仿真跑得完美,板子一调就翻车。问题出在哪?十有八九是物理层没处理好。

物理层设计,说白了就是回答三个问题:

  • IO口用什么结构?推挽还是开漏?
  • 电压怎么匹配?3.3V和1.8V怎么互连?
  • 驱动电流选多大?信号会不会振铃?

我们一个一个拆开讲。

SPI物理层设计核心要素 IO接口类型 推挽 vs 开漏 电平匹配 3.3V ↔ 1.8V 驱动能力 2mA / 4mA / 8mA SCK/MOSI:推挽 MISO:开漏(多从机) 电平转换器(TXS系列) OD门 + 上拉电阻 短距:2mA够用 长距:8mA+串阻 信号完整性:过冲 < 10% VCC,振铃 < 5% VCC

4.1 IO接口类型:推挽 vs 开漏

先说说推挽输出。这是SPI最常用的模式。SCK、MOSI、CS这些信号,主机主动驱动,高低电平都靠内部PMOS和NMOS轮流导通。速度快,驱动强。我习惯在FPGA里直接把SPI主机的输出口设成推挽,省事。

但MISO不一样。多从机共享一条MISO线时,你想想看——如果两个从机同时驱动,一个拉高一个拉低,那就是短路。所以MISO必须用开漏输出,配合上拉电阻。

核心原则:

  • SCK、MOSI、CS(主机输出)→ 推挽模式
  • MISO(从机输出)→ 开漏模式(多从机场景)
  • 单从机场景:MISO也可以用推挽,但建议养成开漏习惯

我在一个项目里遇到过这样的坑:四个传感器挂同一条SPI总线,MISO用了推挽。结果两个从机同时被选中(CS逻辑写错了),MISO线上电流瞬间飙到50mA,芯片直接冒烟。嗯,从那以后我所有多从机设计的MISO都强制开漏。

4.2 电平匹配:3.3V vs 1.8V

现在芯片的工作电压越来越低。主控可能是3.3V,传感器可能是1.8V。直接连?不行。1.8V的IO口承受不了3.3V,会烧。

电平匹配有几种做法:

方案 优点 缺点 适用场景
专用电平转换器
(如TXS0102)
双向、自动方向检测 成本略高、占PCB面积 多信号、高速(>10MHz)
开漏+上拉电阻 零成本、简单 速度受限、功耗略大 低速(<1MHz)、单方向
电阻分压 极低成本 驱动能力弱、边沿变缓 调试用、不推荐量产

我个人习惯用TXS系列电平转换器。虽然贵几毛钱,但省心。你想想看,如果因为电平不匹配导致通信偶尔出错,排查起来多痛苦?

小技巧:如果SPI速率不高(1MHz以下),可以用两个电阻加一个NMOS做单向电平转换。MOSI方向:3.3V→1.8V,用电阻分压就行。MISO方向:1.8V→3.3V,用开漏NMOS加3.3V上拉。我早期做IoT项目时经常这么干,成本几乎为零。

4.3 驱动能力选择

驱动能力,就是IO口能输出多大电流。常见的有2mA、4mA、8mA、12mA等选项。选大了信号边沿陡,但容易振铃。选小了信号爬坡慢,时序容易跑飞。

怎么选?我一般按这个经验来:

  • 板内短距离(<5cm):2mA足够。负载电容小,信号干净。
  • 板内中等距离(5-15cm):4mA。比如FPGA到Flash之间。
  • 板间连接器(>15cm):8mA。但要加串阻(22Ω-33Ω)抑制过冲。
  • 超过30cm:建议用差分SPI或降低速率,单端驱动容易出问题。

注意:驱动能力不是越大越好。我见过有人把驱动设成12mA,结果信号过冲达到VCC的40%,芯片IO口长期处于过压状态,几个月后批量失效。驱动能力够用就行,留20%余量。

4.4 信号完整性基础

信号完整性,说白了就是让波形好看。SPI是同步接口,时钟和数据之间的时序关系必须干净。

几个关键指标:

  • 过冲(Overshoot):信号超过VCC的部分。超过10% VCC就有风险。
  • 下冲(Undershoot):信号低于GND的部分。超过0.5V就可能触发寄生BJT。
  • 振铃(Ringing):信号跳变后的震荡。幅度超过5% VCC就需要处理。
  • 单调性(Monotonic):时钟边沿必须单调上升/下降。非单调时钟会导致误触发。

改善信号完整性的三板斧:

  1. 串阻:在驱动端串联22Ω-33Ω电阻,吸收反射能量。我习惯在SCK和MOSI上都加。
  2. 降低驱动:如果串阻效果不明显,试试降低一级驱动能力。
  3. 调整PCB走线:SPI信号走线尽量短,避免90度拐角,保持阻抗连续。

实战经验:有一次调试SPI Flash,读数据偶尔出错。示波器一看,SCK下降沿有20ns的振铃,正好落在数据采样窗口内。我在SCK上串了33Ω电阻,振铃从300mV降到50mV,问题解决。有时候问题就这么简单,但你不看波形永远想不到。

最后说一句:物理层设计没有银弹。每个项目都要根据实际PCB布局、器件手册、速率要求来调。我建议你每次做SPI设计时,都先画个简单的信号链框图,标出电压域、驱动能力、串阻值。画完再布线,能省很多调试时间。

好了,这一章就到这里。记住:逻辑对了只是第一步,物理层稳了才是真本事。

可可精品资料库