SPI 总线是嵌入式开发里的常用通信方式,标准包含 SCK、MOSI、MISO、CS 四根信号线,支持一主多从架构,具备全双工、传输速度快、硬件电路简洁的特点,传感器、SD 卡、以太网芯片等外设大多会采用该总线通信。LuatOS 配套有成熟的 SPI 驱动库,同时附带 Flash、RC522 等实战案例,可用于功能调试与项目开发。。


SPI作为总线协议,
单条 SPI 总线可外接多个设备,依靠独立 CS 片选引脚区分设备,拉低对应片选信号即可选中目标外设,能有效节约单片机 IO 口,不少开发板也用该方案同时挂载 SD 卡、CH390H 等器件。SPI 协议本身逻辑不难,但实际使用中存在不少容易出错的细节,这里整理了两个实操中高频遇到的问题,供参考。
坑一:你的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 为嵌入式常用四线同步总线,支持一主多从、全双工通信,常挂载 SD 卡、CH390H 等外设。实际调试中存在两类典型故障:CH390H 未上电时内部下拉会拉低 SPI 信号电平,导致同总线其他外设通信异常;SD 卡侧 SPI 上拉所接 LDO 关闭后,LDO 内部放电电阻会拉低总线电平,造成通信失败。解决要点为确保 CH390H 正常供电、SPI 上拉对应的 LDO 必须开启,调试前应查阅器件手册确认供电与电平要求。
好了,今天先就聊到这儿。你在SPI调试中还遇到过哪些问题?欢迎评论区告诉我~