网上看到都基本上是python编程的。
ov7670不带fifo.
离线
RP2040 可以驱动 OV7670(不带 FIFO),但关键不是 SCCB/I2C 配寄存器,而是图像数据采集必须用 PIO + DMA 来做,单靠 CPU 轮询基本扛不住。
OV7670 不带 FIFO 时,数据流大概是:
XCLK:由 RP2040 输出给摄像头,一般 8~12MHz 起步,太高会把采集压力拉满;
PCLK:摄像头输出,每个 PCLK 对应 D0~D7 一次有效数据;
VSYNC:帧同步;
HREF:行有效;
D0~D7:8 位并口数据。
推荐实现思路:
用 PWM/PIO 给 OV7670 提供 XCLK。
先不要追求 30fps,建议把 XCLK 降到 8MHz 左右,先保证能稳定采一帧。
用 I2C/SCCB 初始化 OV7670。
先配置成低分辨率,例如 QQVGA 160x120,格式用 RGB565 或 YUV422。RP2040 RAM 只有 264KB,完整 VGA RGB565 放不下:640x480x2 约 600KB,所以必须降分辨率或边采边处理。
用 PIO 采 D0~D7。
PIO 程序等待 PCLK 边沿,在 HREF 有效期间把 8bit 数据 push 到 RX FIFO;再用 DMA 从 PIO RX FIFO 搬到 RAM。这样 CPU 只负责帧/行状态和后处理。
VSYNC/HREF 可以用 GPIO 中断或 PIO 等待处理。
简单做法是:VSYNC 到来时开始一帧;每行 HREF 有效时启动 DMA 收这一行;HREF 结束停止/切换下一行缓冲。
内存上建议先做单行/双行缓冲。
如果只是显示到 LCD,可以一边采一边刷屏;如果要存整帧,QQVGA RGB565 是 1601202=38400 字节,RP2040 可以承受。QVGA 3202402=153600 字节也勉强可以,但余量会小很多。
调试顺序建议:
先只验证 SCCB,读写寄存器确认摄像头有 ACK;
再输出 XCLK,用示波器/逻辑分析仪看 PCLK、VSYNC、HREF 是否正常;
再用 PIO 采一行固定长度数据;
最后再拼成整帧。
如果用 C SDK,可以参考 RP2040 官方 pico-examples 里的 PIO + DMA 例子,再把 PIO 输入逻辑改成按 PCLK 采 8 位并口。网上很多 MicroPython 例程能跑,核心也是一样:寄存器初始化 + PIO/DMA 采样,只是 C 里要自己把 PIO 和 DMA 部分搭起来。
不建议一开始就上 VGA。先用 QQVGA/RGB565 或 YUV422 跑通一帧,确认颜色/行同步没错,再逐步提高分辨率和时钟。
离线