SPI读回来的全是0xFF,芯片坏了吗?
SPI时钟有了、片选也在跳,读寄存器却一直返回0xFF。这个值有时是芯片数据,有时只是MISO没有被有效驱动。把CS、SCK、MOSI、MISO放到同一张波形里看,通常比反复改程序更快。
0xFF是芯片真的回了一个FF吗?
调硬件时,SPI读数全是0xFF,算是一个很有迷惑性的现象。程序看起来没报错,发送函数能跑,示波器也能看到SCK一串一串地跳,但每次打印出来都是FF FF FF。
看到FF并不能直接宣布芯片坏了。SPI接收实际上是在时钟边沿读取MISO的电平,如果连续八个采样位都是高电平,得到的自然就是0xFF。关键是:这些高电平是从设备主动送出来的,还是MISO根本没人驱动?
有些芯片在未被选中时会让MISO处于高阻态。如果板上有上拉,或者这根线恰好被其他电路拉高,主控也可能读到连续的1。当然也有例外,比如某些Flash空白区域读出的数据本来就可能是0xFF。要结合读的命令和地址判断。

CS到底有没有选中它?
SPI常见的片选CS是低有效,但要以当前器件的数据手册为准。有些设计一眼看波形,CS也确实在低电平和高电平之间切换,于是就认为“片选没问题”。
真正应该对照的是芯片引脚上的CS,而不是只看MCU一侧的GPIO。中间如果经过电平转换、缓冲器,或者连线焊接出了问题,主控输出正确也不代表从机收到正确。
还要看CS拉低之后,SCK是什么时候开始跑的;一笔读操作没结束,CS是不是提前拉高了。Microchip的SPI资料就说明,部分从设备在片选失效时会退出通信,并让MISO恢复高阻。

测量时把CS和SCK同时抓出来,通常比单看时钟是否存在更有用。
如果板上有不止一颗SPI从设备,还要确认是不是选错了CS。几颗器件可能共用SCK、MOSI、MISO,但各自的片选不能弄混;有的故障并不是波形坏了,而是波形跑到了另一颗器件上。
时钟有了,MISO就一定有数据?
不一定。SPI没有像I²C那样的应答位,你发出去的命令是否被从机理解,单凭SCK跳动看不出来。主控在MOSI上发出的地址、读写位、字节数如果不符合芯片协议,对方可能不会在预期时刻输出数据。
有的器件要求先发命令,再发地址,之后还要送几个空字节让时钟继续运行;有的读寄存器还涉及Dummy Cycle。如果刚发完地址就停止时钟,或从错误的字节位置开始取数据,就可能得到全高或错位的结果。
再看CPOL和CPHA。它们决定时钟空闲电平和在哪个边沿采样。主从模式不一致,常见结果是读数错位、乱跳,未必一定等于0xFF,但这仍是值得核对的一项。
四根线一起看,比改十次代码有用
调试时可以把CS、SCK、MOSI、MISO同时接上逻辑分析仪或示波器,先确认芯片确实被选中,再看命令是否完整送到器件引脚。不要只看软件打印的十六进制数据。
如果CS、SCK、MOSI都有正确波形,而MISO在整个交易期间始终高电平,就重点看从机供电、复位、输出使能、MISO线路、上拉和电平转换器。断电后还可以检查焊接和导通情况。
如果MISO确实有高低变化,软件却读回0xFF,那就要回到采样边沿、输入复用、数据位宽和解码配置。还有些芯片读取状态前必须等待上电或内部初始化完成,过早访问也可能拿不到预期数据。
逻辑分析仪能快速看解码,但它的阈值会把波形归成0或1。如果怀疑电平转换、上升沿过慢、振铃或MISO电压不够,仍需要示波器看看模拟电压波形,不能只凭解码栏里的FF下结论。
换芯片当然是排查手段之一,但通常不应该排在第一步。先弄清那八个“1”究竟是谁送出来的,范围就能缩小很多。
声明:
本文由凡亿教育整理,转载请注明来源!
投稿/招聘/广告/课程合作/资源置换 请加微信:13237418207

扫码关注










































