板子是STM32F407+FreeRTOS,SPI2用DMA从外部ADC(AD7606)读8通道数据,10ms一帧。现在批量500台里有十几台,运行几个小时后偶尔丢一整包,DMA完成中断进了但接收buffer后半段全是0。试过把DMA buffer改成32字节对齐、加大栈、把SPI中断优先级调到最高,都没根治。示波器看CS和SCLK时序正常,怀疑是DMA和CPU抢总线或者cache一致性问题,但F407没有D-Cache啊。产线等着出货,头大。有没有兄弟踩过类似的坑?是不是我中断里直接喂看门狗导致的临界区问题?
兄弟,F407没D-Cache,别往那想。DMA完成中断进了但后半段全0,我第一反应是DMA传输长度或外设请求被提前掐断——重点查SPI2的DMA通道配置和ADC的CS/转换时序配合。
排查点:1)确认SPI2_RX的DMA是循环还是单次,单次模式下每帧要重新装NDTR,装的时候如果上一帧DMA还没真正结束就重装,后半段就丢了;2)AD7606是并行还是SPI模式?SPI模式下BUSY拉低后要等够转换时间再读,读太快后半通道数据没出来;3)中断里喂狗没问题,但别在DMA完成中断里做长操作,把处理丢给任务。
另外十几台才出,建议查电源和SPI时钟相位,个别板子器件批次差异也会这样。