第二十一届智能车雁过留痕组 逐飞库 WiFi SPI 与摄像头共存时数据震荡问题
借助claude code解决 逐飞库STC32G144K 上 WiFi SPI 与 MT9V03X 摄像头共用时示波器数据震荡问题。根因逐飞库exit_init(INT1_P33, BOTH)的BOTH在 8051 上是电平触发IT10。VSYNC 低电平期间 INT1 每个时钟周期都触发IE1 不断被硬件置位与 SPI DMA 的寄存器轮询产生 SFR 总线竞争导致数据错乱。解决发送 WiFi 数据时临时EX10关中断发完EX11恢复。仅影响发送的几毫秒不影响摄像头和图像处理省流在 SPI DMA 轮询的几毫秒内屏蔽 INT1发完立刻恢复一.摄像头与wifi发送波形信号分开写结果波形在目标值和0直接反复横跳如图二.注释摄像头初始化函数结果得到平滑波形问题在摄像头某处与wifi冲突三.参考逐飞摄像头wifi图传得到平滑波形四.加上图像处理结果震荡深入底层在exit_init(INT1_P33, BOTH)这个函数调用上。逐飞库的外部中断初始化函数exit_init中BOTH枚举值为 0typedef enum { BOTH, // 0 FALLING_EDGE, // 1 } INT_MODE_enum; void exit_init(INTN_enum int_n, INT_MODE_enum mode) { IT1 mode; // BOTH0 → IT10 EX1 1; }在 8051 架构上IT10意味着电平触发而非双边沿触发8051 根本没有双边沿模式。MT9V03X 摄像头的 VSYNC 信号接在 P3.3INT1时序如下VSYNC 高电平帧间空闲期~2msVSYNC 低电平帧读出期~18ms当 VSYNC 为低电平时由于是电平触发INT1 中断每个机器周期都在触发硬件不断置位 IE1 标志位。与此同时WiFi SPI 模块通过 SPI2 DMA 发送数据底层实现是轮询 DMA 状态寄存器DMA_SPIX_CR(spi_n) 0xC1; // 启动DMA while(!(DMA_SPIX_STA(spi_n) 0x01)); // 轮询等待完成 ← 这里被干扰当 INT1 持续触发时IE1 标志位不断被硬件写入与 SPI DMA 的寄存器轮询产生SFR 总线竞争导致读到错误的 DMA 状态值数据传输错乱 → 示波器波形震荡。有无图像处理结果不同分析情况一不加图像处理 —— 好使没有图像处理时主循环跑得很快摄像头拍完 → 收到flag → 发WiFi → 回到循环顶部 → 等下一帧拍完 → 再发...每帧只花几微秒发 WiFi然后就回到循环顶部等着。发 WiFi 的时候VSYNC 是高电平帧间空闲期中断不会疯狂触发所以数据传输正常波形平滑。情况二加上图像处理 —— 震荡加上图像处理后主循环变慢了摄像头拍完 → 收到flag → 发WiFi → 图像处理耗时20ms以上→ 回到循环顶部图像处理要 20 多毫秒而摄像头一帧 10ms。也就是说图像处理还没做完下一帧就已经拍完了。当图像处理结束回到循环顶部时flag 已经被新帧置位了程序立刻又进入发送流程。但这时候摄像头正在读出新帧VSYNC 是低电平。低电平 电平触发 中断每个时钟周期都在疯狂触发。最终解决在 SPI DMA 轮询的几毫秒内屏蔽 INT1发完立刻恢复—— ——由claude(mimo-2.5-pro)激情解答本次token消耗1亿。嘤嘤嘤不一定正确仅供参考