做嵌入式开发,几乎每天都要和 SPI 总线打交道。它由四根引脚构成,支持主从架构与全双工通信,速率表现亮眼,外围电路也不复杂,驱动各类传感器、存储卡、网络控制器都十分普遍。
SPI作为总线协议,
一条 SPI 链路可以接入多个外设,只要为每个设备单独配置片选引脚,通过电平拉低完成设备选中,就能在节省 IO 资源的前提下拓展外设。很多开发板便是如此,同时搭载了 SD 卡与 CH390H。协议原理看着简单,真正上手才会发现不少隐藏问题,结合日常调试遇到的情况,分享两个典型问题避坑。
坑一:你的CH390H不供电?其他外设别想干活
**当CH390H未供电时:**其MISO、MOSI、CLK三个信号在CH390H芯片内部为下拉状态,这时会将三个信号的电平拉低到非正常逻辑电平状态。
**这个时候如果打开SPI总线上的其它外设:**比如SD卡,会造成SD卡的读取失败,或者几率性失败或成功,原因就是——SPI信号的逻辑电平混乱所致。
举个例子:我们设置的IO电平为3.3V,实际此时的电平可能是2V左右,其逻辑高电平处于临界状态,进而造成通信异常。
解决办法:必须将给CH390H的供电打开。
这里建议大家在任何外设上SPI总线之前,第一件事是翻开它的数据手册,确认供电说明等信息。
下图是CH390H手册中相关描述的截图(红框标出下拉说明):
**坑二:你把SD卡槽的上拉LDO关了?SPI总线当场“摆烂” **
SPI总线接上拉电阻到LDO后,会出现异常。
比如Air780系列V1.4开发板:SD卡部分将SPI总线上拉高到SD_3V3,用于增加SPI总线的驱动能力。
**问题来了:**当其他同路SPI外设要使用时,SD卡的这路LDO必须要打开,否则会造成SPI通信不正常。
**原因很简单:**给每个外设供电的LDO,以LP5907MFX为例,其在关闭时,LDO电源输出管脚会有下拉电阻到地,进而造成SPI电平拉低——实测Air780EHM的电平本来设置为3.3V,结果被拉低到2.2V甚至2V以下,SPI通信自然就不正常了。
LP5907MFX手册截图如下:
**所以记住一句话:**当硬件设计中将SPI上拉到某一LDO时,**一定要将该LDO打开,**才可以保证SPI正常通信。
共用 SPI 总线挂载多外设时,供电与上拉电源处理不当会直接瘫痪总线。CH390H 失电会使 MOSI/MISO/SCK 被内部下拉,3.3V 电平被拉至临界区,SD 卡等设备读写随机失败。SD 卡 SPI 上拉电源若关闭,LDO 关断时的放电回路会拉低总线电压,SPI 无法正常通信。硬件设计与调试需保证片上外设供电正常、上拉电源持续有效,避免因局部断电影响整条总线。
好了,今天先就聊到这儿。你在SPI调试中还遇到过哪些问题?欢迎评论区告诉我~