
一句话: ADC 寄存器地址写成了 NOP 空操作半年没发现——因为返回值被公式包装成了合法负数。翻数据手册逐位对照 SPI 帧格式才找到这个bit级的错误。适合谁读SPI 通信不正常但看起来有返回值的嵌入式开发者。现象读 ADC 的 4 路数据全是死值但死值看起来正常——不是 0x0000 或 0xFFFF是带公式换算后的负数像 -5000mV。读代码的人第一反应是硬件接错了不是寄存器地址写错了。查了三轮第一轮怀疑基准电压没开。改了电源配置寄存器数据不动。后来确认基准本来就是开的还原。第二轮怀疑 SPI 读数据的时机不对。SPI 有个惯例——当前帧返回上一帧的结果。代码在第 3 帧读数据但 ADC 结果在第 2 帧就返回了。把读数据时机提前数据还是不动。第三轮翻数据手册逐位拆 SPI 帧格式。手工拆一个寄存器地址数据手册给出的 SPI 帧格式16 位D15D14:D11D10:D9D8:D00(写)寄存器地址保留00数据寄存器映射表0000 NOP空操作 0001 DAC 回读 0010 ADC 序列寄存器 ← 要操作的是这个 0011 通用控制 0100 ADC 引脚配置代码里写的是Spi_Tx_Buff[0] 0x01。拆成二进制0x01 0000_0001 D150, D14:D110000, D10:D900, D8:D0001 寄存器地址 0000 NOP写了 NOP 空操作——不启动任何转换。ADC 从未被触发过当然读到的全是 0。正确的值是0x100x10 0001_0000 D150, D14:D110010, D10:D900, D8:D0000 寄存器地址 0010 ADC_SEQ一个 bit 的差别0x01 把 D4 写成 00x10 把 D4 写成 1。半年没人发现。为什么半年没发现返回值被公式包装了。ADC 读回 0经过电压换算公式变成 -5000mV——一个看起来有意义的负数而不是裸的 0x0000。有值的表象掩盖了值是错的这个事实。如果直接打印原始 ADC 码值而不是换算后的工程值第一天就能发现 4 路全是 0。怎么避免读 SPI 器件返回值异常时先看原始寄存器值再看物理量换算值。裸的 0x0000 比 -5000mV 直观得多。写寄存器地址时对着手册逐位拆一次。0x10和0x01这种差一个 bit 的拼写肉眼扫过去根本看不出来。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。