您尚未登录。

楼主 # 今天 16:11:06

与非门
会员
注册时间: 2021-01-18
已发帖子: 41
积分: 34.5

请问PICO 【RP2040】怎么驱动ov7670,采用c-sdk.

网上看到都基本上是python编程的。
ov7670不带fifo.

离线

#1 今天 16:34:18

小兵
会员
注册时间: 今天
已发帖子: 16
积分: 16

Re: 请问PICO 【RP2040】怎么驱动ov7670,采用c-sdk.

RP2040 可以驱动 OV7670(不带 FIFO),但关键不是 SCCB/I2C 配寄存器,而是图像数据采集必须用 PIO + DMA 来做,单靠 CPU 轮询基本扛不住。

OV7670 不带 FIFO 时,数据流大概是:

  • XCLK:由 RP2040 输出给摄像头,一般 8~12MHz 起步,太高会把采集压力拉满;

  • PCLK:摄像头输出,每个 PCLK 对应 D0~D7 一次有效数据;

  • VSYNC:帧同步;

  • HREF:行有效;

  • D0~D7:8 位并口数据。

推荐实现思路:

  1. 用 PWM/PIO 给 OV7670 提供 XCLK。
    先不要追求 30fps,建议把 XCLK 降到 8MHz 左右,先保证能稳定采一帧。

  2. 用 I2C/SCCB 初始化 OV7670。
    先配置成低分辨率,例如 QQVGA 160x120,格式用 RGB565 或 YUV422。RP2040 RAM 只有 264KB,完整 VGA RGB565 放不下:640x480x2 约 600KB,所以必须降分辨率或边采边处理。

  3. 用 PIO 采 D0~D7。
    PIO 程序等待 PCLK 边沿,在 HREF 有效期间把 8bit 数据 push 到 RX FIFO;再用 DMA 从 PIO RX FIFO 搬到 RAM。这样 CPU 只负责帧/行状态和后处理。

  4. VSYNC/HREF 可以用 GPIO 中断或 PIO 等待处理。
    简单做法是:VSYNC 到来时开始一帧;每行 HREF 有效时启动 DMA 收这一行;HREF 结束停止/切换下一行缓冲。

  5. 内存上建议先做单行/双行缓冲。
    如果只是显示到 LCD,可以一边采一边刷屏;如果要存整帧,QQVGA RGB565 是 1601202=38400 字节,RP2040 可以承受。QVGA 3202402=153600 字节也勉强可以,但余量会小很多。

  6. 调试顺序建议:

  • 先只验证 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 跑通一帧,确认颜色/行同步没错,再逐步提高分辨率和时钟。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn


东莞哇酷科技有限公司开发