SPI读数据要等一帧——当前帧返回上一帧结果

发布时间:2026/7/27 17:51:44
SPI读数据要等一帧——当前帧返回上一帧结果 一句话: 很多 SPI 器件有当前帧返回上一帧结果的时序惯例。你在第 N 帧写命令ADC 结果在第 N1 帧才从 SDO 返回。改寄存器地址的同时也要改读数据时机——单独改哪个都不够。适合谁读SPI 通信读到的值像对的但总觉得偏移了一拍的嵌入式开发者。为什么不是发了就回SPI 是同步双向协议。主机发一帧数据时 SDO 上同时有数据回来——但这帧数据是上一次请求的结果不是这一次请求的。就像点外卖你打电话下单第 1 帧电话里没人告诉你饭好了没。你打第二个电话问第 2 帧对方说上顿饭好了。你打第三个电话第 3 帧对方说第二顿饭好了——永远滞后一拍。ADC 读值的时序代码做了 3 次 SPI 传输帧主机发SDO 返回代码在干嘛1写 ADC 通道掩码启动转换无效数据丢弃2清通道NOPADC 结果丢弃 ← 错在这里3NOP0x0000清通道的确认读这个 ← 读错了代码在第 3 帧之后读数据但 ADC 结果在第 2 帧就返回了。第 3 帧 SDO 返回的是清通道操作的确认——永远是 0x0000。怎么改把读数据提前到第 2 帧之后// 帧 1写通道掩码启动转换 Spi_Tx[0] REG_ADC_SEQ; // ADC 序列寄存器 Spi_Tx[1] CHANNEL_MASK; SPI_Transmit(); // SDO 数据丢弃 // 帧 2清通道SDO 返回 ADC 结果 Spi_Tx[1] 0x00; SPI_Transmit(); result Spi_Rx[0] 8 | Spi_Rx[1]; // 在这读 // 帧 3NOP 占位维持时序 Spi_Tx[0] 0x00; Spi_Tx[1] 0x00; SPI_Transmit(); // 丢弃不是所有 SPI 器件都这样有些器件在同一个帧内就返回结果先发地址再收数据。有些器件延迟两帧。没有统一规则——翻手册看时序图里标注的数据有效位置。手册里通常在时序图下面用箭头标SDO: X X X X [ADC DATA] X X——箭头指在哪一帧就在哪一帧读。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。