两颗SPI器件共用MISO时的总线冲突
两颗SPI器件共用MISO时的总线冲突
SPI共用MISO本来是常规连接方式,前提是未被选中的从设备必须释放这根线。某些器件、电平转换电路或软件初始化状态会让MISO继续输出高低电平,从而引起总线冲突。
一块控制板接了两颗SPI器件,SCK和MOSI共用,片选各走各的,MISO也接在一起。单独焊一颗,读写没问题;两颗都焊上以后,偶尔读错,甚至某一颗完全不响应。
很多人第一反应是SPI时序不对。时序当然要查,但有一种更基础的情况容易漏掉:没有被选中的器件,是不是真的把MISO释放了?
01片选无效时的MISO状态
标准的多从设备SPI连接,主机只允许一个从设备在同一时刻驱动MISO,其余设备应处于高阻态。这样一根数据线才能轮流使用。
麻烦在于,不是所有叫作SPI的接口都按同一种方式实现。有些可编程从设备要在软件中明确切换MISO引脚方向;还有器件在上电复位、掉电或特殊工作模式下,输出状态与正常通信时不同。
如果其中一颗器件始终把MISO拉低,另一颗即使按协议返回了正确数据,MCU端也可能只读到低电平。反过来输出相互冲突时,还会出现额外电流和边沿异常。
02完整的片选切换时序
用逻辑分析仪抓SPI时,重点不只在时钟相位与数据采样点。最好把两个片选、SCK、MOSI和MISO放在同一组记录里,看从一颗器件切换到另一颗器件的过程。
可以做个简单对比:先让从设备A不选中,观察B通信;再断开A的MISO,看看B是否恢复。如果断开某一路后问题消失,总线占用或外部电路对线的影响就值得重点查。
示波器也有用。逻辑分析仪把电压直接判成0和1,有时看不到两颗输出互相较劲导致的中间电平、毛刺或缓慢边沿。两种工具看的是不同信息。

多从设备SPI连接示意,未选中的MISO必须满足高阻要求。
03电平转换器与MISO总线占用
如果SPI总线跨3.3V、1.8V或者其他电源域,MISO线上多出来的电平转换器可能改变三态行为。某些自动方向识别器件并不适合高速推挽SPI,具体要看芯片的数据手册和推荐拓扑。
还要查上电顺序。主机已经开始通信,但某颗从设备电源还没起来,其I/O钳位或接口结构是否会影响总线?这跟“两个片选不会同时有效”不是同一个问题。
对于片选由GPIO控制的方案,复位后的默认电平也得确认。片选线若在初始化之前短暂有效,可能让本不该输出的器件进入工作状态。
能用软件修的,先把片选切换时序、从设备输出使能和复位默认状态确认清楚。若器件本身不支持合适的MISO高阻状态,就要考虑外部三态缓冲器或多路复用器,而不是反复改SPI时钟分频。
如果问题来自电平转换方案,应按实际方向和速率重新选型。软件、器件和硬件连线三个层面都有可能,不能因为“SPI协议很简单”就默认PCB一定没问题。
这类问题的排查目标很明确:任意时刻,MISO到底由谁驱动?只要这个问题有答案,后续多数排查就不难展开。

真实SPI时序抓图,片选、时钟和数据线应放在一起检查。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207






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