4、SPI物理层设计:IO接口类型、电平匹配与驱动能力
各位同学,今天我们聊聊SPI物理层。说实话,很多工程师写RTL代码时只关注逻辑功能,觉得物理层是PCB工程师的事。但我在项目中吃过不少亏——逻辑仿真跑得完美,板子一调就翻车。问题出在哪?十有八九是物理层没处理好。
物理层设计,说白了就是回答三个问题:
- IO口用什么结构?推挽还是开漏?
- 电压怎么匹配?3.3V和1.8V怎么互连?
- 驱动电流选多大?信号会不会振铃?
我们一个一个拆开讲。
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):时钟边沿必须单调上升/下降。非单调时钟会导致误触发。
改善信号完整性的三板斧:
- 串阻:在驱动端串联22Ω-33Ω电阻,吸收反射能量。我习惯在SCK和MOSI上都加。
- 降低驱动:如果串阻效果不明显,试试降低一级驱动能力。
- 调整PCB走线:SPI信号走线尽量短,避免90度拐角,保持阻抗连续。
实战经验:有一次调试SPI Flash,读数据偶尔出错。示波器一看,SCK下降沿有20ns的振铃,正好落在数据采样窗口内。我在SCK上串了33Ω电阻,振铃从300mV降到50mV,问题解决。有时候问题就这么简单,但你不看波形永远想不到。
最后说一句:物理层设计没有银弹。每个项目都要根据实际PCB布局、器件手册、速率要求来调。我建议你每次做SPI设计时,都先画个简单的信号链框图,标出电压域、驱动能力、串阻值。画完再布线,能省很多调试时间。
好了,这一章就到这里。记住:逻辑对了只是第一步,物理层稳了才是真本事。