一句话: ADC 读数全是死值或跳变别在几千行项目代码里改来改去。三步走——先检查 MCU 端通讯代码和转换逻辑再和开源驱动对比找差异最后写一个独立的最小程序验证硬件。适合谁读ADC 读数不对项目代码太复杂不知道从哪开始的嵌入式开发者。为什么不要在大项目里排查项目代码几万行。ADC 读数异常时本能反应是看 SPI 驱动、改初始化参数、加延时、试不同的通道配置。改了半天发现是另一个模块的中断打断了 SPI 时序——跟 ADC 驱动本身没关系。变量太多。你不知道是哪一层出的问题——硬件、SPI 驱动、数据转换、还是业务逻辑。在大项目里排查等于在暴雨里找雨伞——全是水。第一步检查通讯和转换逻辑ADC 的完整链路传感器 → ADC芯片 → SPI → MCU → 原始码值 → 公式换算 → 物理量异常读数时先把公式关掉——只看原始 ADC 码值。公式把 0x0000 包装成了 -5000mV看起来合法但实际上 ADC 根本没输出。拿三个数据点验证输入期望 ADC 码值实际码值判断ADC 输入接 GND0~50实际值偏零对不对ADC 输入接 VREF4090~4095实际值满量程对不对ADC 输入接 VREF/22000~2100实际值中间线性对不对如果全是 0 或全是固定值——ADC 根本没在采样。问题在 SPI 通讯或寄存器配置。如果值跳变但范围对——通讯正常问题在转换逻辑或硬件噪声。第二步和开源驱动对比你的 ADC 芯片大概率有开源驱动。GitHub 上搜芯片型号找一份能用的代码跟你的一行行对比。重点看四样SPI 模式CPOL/CPHA 设的一样吗寄存器地址你写的是 0x10 还是 0x01初始化序列你的顺序和开源的一不一样缺了哪步数据读取时机ADC 返回数据在第几帧开源代码不一定对但它至少跑通过。跟你不一样的地方就是排查重点。第三步写最小验证程序新建一个空白工程。只保留这几样时钟初始化 → SPI 初始化 → ADC 读写函数 → 串口打印main 循环里只做一件事——读 ADC打印原始码值。没有操作系统、没有中断、没有其他外设。这个程序能跑通 硬件没坏、SPI 驱动正确、ADC 配置正确。问题在项目代码的其他部分——中断冲突、时序竞争、DMA 踩内存。最小程序跑不通 问题在硬件或基础驱动层。拿着这个最小程序去示波器上量 CS/SCK/MOSI/MISO逐位和手册对比。三步速查步骤做什么排除什么1查通讯链路看原始码值公式换算层、业务逻辑层2对比开源驱动找差异初始化序列错误、寄存器地址错误3最小程序独立验证中断冲突、时序竞争、DMA 问题先看裸数据再算物理量。先比开源再改自己。先最小验证再回大项目。三步下来要么定位了要么目标缩小到能掌控的范围。有用的话点个收藏下次调试直接用。有问题欢迎评论区交流看到了都会回。