
一句话: CPOL 管空闲时时钟线是高还是低CPHA 管第几个边沿锁数据。Mode 0上升沿锁CPHA0Mode 1下降沿锁CPHA1。设反了每个 bit 都在错误时刻采样——SPI 通信正常但数据全错。适合谁读SPI 能发能收但数据总是不对的嵌入式开发者。四个模式一表搞定SPI 有四种模式由 CPOL 和 CPHA 两个位组合决定ModeCPOLCPHA空闲时钟锁存边沿000低电平上升沿第一个边沿101低电平下降沿第二个边沿210高电平下降沿第一个边沿311高电平上升沿第二个边沿CPOL 是 Clock Polarity——时钟极性。管的是不传数据时时钟线什么状态。0低1高。CPHA 是 Clock Phase——时钟相位。管的是第几个边沿锁数据。0第一个边沿锁1第二个边沿锁。大多数器件用的是 Mode 0 或 Mode 3。具体哪个要看手册的时序图。设反了是什么现象代码把 CPHA 设成了 1Mode 1下降沿锁存但芯片手册要求 CPHA0Mode 0上升沿锁存。结果SPI 波形在示波器上看一切正常——SCK 在跳、MOSI 在发、CS 在拉低——但芯片就是不工作。因为芯片在每个 SCK 的下降沿尝试锁数据而主机的数据在上升沿就变了。芯片锁到的永远是错误时刻的数据。就像两个人击掌——你觉得在数一的时候合掌对方觉得在数二的时候合掌。你们都在拍手但永远拍不到一起。不疼但不对。怎么查接示波器看 SCK 和 MOSI 的相位关系。在 Mode 0 下SCK 上跳时 MOSI 数据已稳定芯片在这个边沿采样。在 Mode 1 下SCK 下跳时采样但此时 MOSI 可能正在切换。数据手册的时序图里会画一条竖虚线标注数据锁存时刻。找到那条虚线对应的边沿就知道 CPOL 和 CPHA 该设什么。代码改法// 改前Mode 1 (CPHA1, 下降沿锁) SPI_InitStructure.SPI_CPHA SPI_CPHA_2Edge; // 改后Mode 0 (CPHA0, 上升沿锁) SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge;改一个枚举值所有调不通的器件全活了。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。