SPI时钟没乱,为何两颗从机一起回话?
发表时间:2026-08-05 17:54:37
SPI的SCK和MOSI可以同时送到多颗从机,但每颗从机需要独立片选。若两路CS重叠,或未选中器件没有释放MISO,两颗推挽输出可能同时驱动一条线,出现中间电平、错误位和额外电流。
一颗SPI Flash单独工作正常,再并上一颗ADC后,SCK和MOSI在逻辑分析仪上仍很整齐,读回数据却随机错误。有时把第二颗器件复位,问题暂时消失。这样的故障不一定是时钟模式或频率,而可能是两颗从机在同一时刻驱动MISO。
SPI能共享MISO,是因为未被片选的从机应该释放输出。只要两路CS同时有效,或某颗器件在上电、复位、掉电期间没有进入高阻,两侧输出一个拉高、一个拉低,就会在总线上形成电气争用。
先把四根线的方向说清楚
SCK和MOSI通常由主机输出,可并联送到多颗从机;MISO由当前被选中的从机返回;CS则告诉每颗从机本次传输是否属于它。多从机结构的关键不是多了几根时钟线,而是每颗器件拥有可控、互斥的片选。
图1 W25Q64的CS、MISO、CLK与MOSI实际连接
不同器件的CS有效电平、上电默认状态和释放时机要看各自数据手册。主机复位时GPIO可能暂时是高阻输入,若外部上拉/下拉没有定义,片选就可能在软件初始化前误有效。
多从机SPI先验收片选互斥,再讨论时钟模式。
两颗输出同时有效,会发生什么
若从机A尝试把MISO驱高,从机B同时驱低,节点电压由两颗输出级的导通电阻和线路阻抗共同决定。逻辑分析仪可能看到不稳定的中间电平,MCU则按输入阈值把它随机判成0或1。
图2 Flash器件端片选、时钟和双向数据引脚
争用电流还会通过两个IO口流动,持续时间长时增加器件应力。串联小电阻可以限制电流并帮助定位,但不能替代正确片选;电阻过大又会与总线电容形成慢边沿。
· 正常:只有被选中的从机驱动MISO。
· 重叠:两路CS同时有效,输出状态可能冲突。
· 异常释放:未选中器件因模式或掉电状态仍占用总线。
时钟正常,为何数据仍错
SCK由主机产生,即使MISO争用,时钟本身仍可以边沿整齐;MOSI也只是主机到从机方向。只看这两条线,会得到“SPI时序没问题”的错觉。真正要同时观察的是两路CS和MISO。
图3 SCK正常但CS重叠导致MISO错误的逻辑波形
当错误只出现在某两颗器件同时连接、某个复位阶段或片选交接处,争用优先级应高于重新调CPOL、CPHA。时钟模式不匹配通常会稳定地错在采样边沿,片选争用更容易表现为与器件组合和状态相关。
用三步把争用抓出来
第一步,让从机A独占总线,从机B保持片选无效,记录MISO;第二步交换;第三步恢复双从机,观察片选交接处是否重叠。若单独都正常、组合才异常,片选和释放状态就是重点。
示波器比逻辑分析仪更适合确认中间电平和边沿冲突,逻辑分析仪则便于对齐协议帧。必要时在每颗从机的MISO支路串入小阻值测试电阻,分别观察两侧电压,但最终数值要按频率和负载验证。
图4 两路CS与MISO争用的联合检查界面
1. 测上电软件初始化前两路CS是否都有确定无效电平。
2. 测独占每颗从机单独工作时MISO是否正确释放。
3. 测交接一次事务结束到下一次开始之间是否留有非重叠时间。
掉电从机也可能拖住总线
多电源域系统中,某颗从机掉电而主机仍在工作,其IO保护结构可能通过MISO、MOSI或CS被反向供电。器件是否在掉电时高阻,不能凭“CS为高”推断,要核对Ioff、容忍电压和上电时序。
如果器件不支持掉电高阻,可考虑总线开关、电平转换器的关断状态、独立串阻或调整供电顺序。解决目标是让任何电源状态下都只有一侧能够有效驱动共享节点。
软件也要保证互斥
片选控制分散在中断、DMA回调和多个驱动模块中时,很容易出现事务尚未结束就启动另一颗从机。总线驱动应统一管理CS、模式、频率和完成标志,不让上层代码直接交叉拉低不同片选。
把逻辑分析仪触发设在两路CS同时为低,往往比持续盯着数据帧更快。只要抓到一次重叠,就能沿调用链追到真正的互斥缺口。
切换不同CPOL、CPHA器件时,还要在拉低新片选前完成控制器配置,并确认上一笔传输的移位寄存器真正空闲。只看DMA完成标志可能过早释放总线;外设忙标志和最后一个时钟边沿才决定片选何时可以交接。
结论
SPI时钟正常,只能证明主机发出了节拍,不能证明共享MISO只有一个驱动者。多从机总线的电气前提,是片选互斥和未选中器件可靠高阻。
排查时同时看两路CS和MISO,先做单从机、互斥片选、片选重叠三组对照。错误跟着片选状态走,就不要再把时间浪费在盲调时钟频率。
你的SPI错误出现在上电初始化、片选交接,还是某颗从机掉电之后?






哔哩哔哩
微信公众号
小红书
抖音
知乎
西瓜视频
头条
微信视频号