尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

OV5640双接口摄像头寄存器配置实战:从DVP到MIPI

OV5640双接口摄像头寄存器配置实战:从DVP到MIPI 1. OV5640为什么现在还值得写双接口设计决定了它的“万能”属性做嵌入式视觉这几年我前前后后调过的摄像头传感器不下十款但OV5640始终是绕不开的那一个。500万像素、自带ISP、支持DVP和MIPI CSI-2双接口价格便宜、资料多、模组遍地都是从STM32到ESP32-S3从FPGA到瑞芯微、全志的Linux平台几乎都能见到它的身影。很多人觉得它“老”但实际上在720p和1080p这种主流分辨率下OV5640的性能和灵活性依然能打尤其当你需要在不同硬件平台之间切换接口方案时这个双接口设计简直救命。这篇东西不是给你念数据手册而是把我实际调OV5640时的寄存器配置思路、DVP和MIPI两种接口的切换细节、720p60Hz的实战参数计算以及那些手册上查不到、只有踩过坑才知道的问题一次性整理出来。适合正在做摄像头驱动、图像采集、FPGA视频通路或者MCU视觉项目的人参考。不管你是第一次点亮OV5640还是已经在调MIPI但被时序折腾得头疼这篇文章都能给你一个相对完整的下手路径。先说明一点OV5640本身的可配置性非常强同样的分辨率可以有不同的HTS/VTS/PCLK组合不同厂商的模组尤其镜头和晶体也会有细微差异。我给的寄存器表是基于常见24MHz XVCLK模组、实测可以稳定运行的配置具体到你的板子可能需要根据示波器实测微调。这也正是我要重点讲的部分——配置寄存器不只是“抄一遍”而是要明白每个关键寄存器改的是时钟树里的哪一环。2. 先从芯片本身说起DVP和MIPI到底差在哪2.1 两种接口的物理层差异很多新手拿到OV5640的模组第一反应是问“我该买DVP版本还是MIPI版本”。实际上OV5640这个芯片本身是同时支持两种接口的模组厂商只是把引脚引出来了而已区别在于你用什么主控去接。DVPDigital Video Port是传统的并行接口一组数据线加上同步信号典型接法是PCLK像素时钟每个上升沿传一个像素VSYNC帧同步一帧图像的开始/结束标志HSYNC行同步一行图像的开始/结束标志DATA[9:0]或8位像素数据YUV/RGB格式按位输出MIPI CSI-2则是差分串行接口一组差分时钟lane加一组或两组差分数据lane每lane速率可达几百Mbps到1Gbps级别。OV5640在MIPI模式下数据lane通常配置为1-lane或2-lane逻辑上仍然是像素流但物理传输变成串行差分信号。用一句话概括区别DVP是“一条马路十辆车并排走”MIPI是“一辆车跑得飞快”。DVP并行接口在PCB上占用大量引脚和走线空间高分辨率高帧率下信号完整性很难保证MIPI差分对则天然抗干扰线少、速率高现代SoC基本都是MIPI输入。2.2 选型时怎么判断用哪个我在实际项目里的选型经验是这样判断的主控是STM32、ESP32-S3这类MCU90%用DVP因为MCU没有MIPI控制器即便有比如ESP32-S3的LCD接口是MIPI DSI不是CSI采集摄像头也通常走DVP或直接查官方驱动支持。主控是FPGA两种都常见。DVP实现简单FIFO加计数器就能采集MIPI则要看FPGA型号Xilinx 7系列以上有硬核或软核IP否则就需要自己写DPHY层逻辑难度明显更高。主控是Linux应用处理器瑞芯微、全志、NXP i.MX等一律用MIPI因为SoC的ISP和CSI控制器原生就是MIPI接口你硬要接DVP反而需要转换芯片。另外要记住一个关键点OV5640的DVP和MIPI接口不是同时工作的只能二选一具体由寄存器0x3017和0x3018控制。切换接口时必须先复位传感器然后按对应接口重新初始化寄存器组不能在运行中热切换。2.3 为什么OV5640到今天还有市场一个芯片在市场上生存十年以上一定有它的道理。OV5640的ISP功能集成度很高自动曝光、自动白平衡、自动增益、色彩矩阵、Gamma校正、镜头校正这些全都内置你只需要通过SCCB兼容I2C接口写配置寄存器它就能输出比较像样的图像。对比一些需要外接ISP或者需要主控端做大量后处理的sensorOV5640大大降低了开发门槛。更关键的是它的分辨率档位全从QVGA到500万像素全覆盖。很多项目最终只用到720p或者1080p但OV5640还能往上留足余量同一颗料可以覆盖多个产品线供应链管理方便。这也是为什么市面上那么多开源硬件和开发板都选择它。3. 寄存器体系拆解到底哪些寄存器决定了“能不能出图”OV5640的寄存器有几百个刚接触时很容易被吓到。但如果你把它分成几个功能块来看其实脉络非常清晰。我调摄像头的时候基本只看这几组寄存器。3.1 系统控制与上电时序系统控制的几个寄存器是基座任何配置之前都要先确认它们的状态。0x3008是系统控制寄存器bit7是软复位控制写0x82会启动软复位复位完成后传感器会重新进入初始化状态。每次切换分辨率或者切换DVP/MIPI模式之前我都习惯先软复位一次确保内部状态干净。0x3103是系统时钟控制寄存器bit0是系统时钟分频选择bit2、bit3控制PLL和系统时钟的关系bit5是PLL分频使能。这个寄存器决定传感器内部数字核心的时钟来源配置不对直接导致sensor不工作或者输出花屏。0x3009、0x300A、0x300B、0x300C这四个寄存器是PLL倍频/分频参数配置区。OV5640内部时钟树的关系大致是输入XVCLK模组晶体常见24MHz或27MHz经过PLL倍频再分频出sensor内部各个模块的工作时钟以及最终输出像素时钟PCLK。0x3010是MIPI的PLL控制如果你用MIPI模式需要把MIPI的PLL使能打开并且根据目标lane速率配置分频参数。实际操作时我遇到过不少次“寄存器都写进去了I2C也正常但sensor就是没有PCLK输出”的情况最后排查下来基本都是PLL没有锁定。所以配置完PLL相关寄存器后我会读一下0x3028寄存器确认锁相环状态这个寄存器bit6表示PLL是否锁定锁定为1配置过程中为0。如果一直读不到锁定状态优先检查XVCLK是否真实输入、输入频率是否在规格范围内。3.2 输出格式与分辨率0x3808到0x3811这一组寄存器控制图像的输出尺寸和裁剪窗口。0x3808和0x3809是水平输出尺寸也就是最终输出图像宽度。0x380A和0x380B是垂直输出尺寸也就是输出图像高度。以720p为例水平输出为1280写成十六进制就是0x0500所以0x38080x05、0x38090x00垂直输出为720写成十六进制就是0x02D0所以0x380A0x02、0x380B0xD0。0x380C和0x380D是水平总尺寸HTSHorizontal Total Size0x380E和0x380F是垂直总尺寸VTSVertical Total Size。这两个寄存器直接影响帧率后面我会专门讲它和PCLK之间的关系。0x3818和0x3819是水平偏移0x3820和0x3821是垂直偏移以及翻转控制。这里有个容易踩的坑OV5640的阵列输出有一个对称裁剪的机制0x3820和0x3821的值会同时影响图像方向和裁剪窗口位置。如果你改了镜像模式之后发现图像位置偏了不是分辨率配置错了而是这两个寄存器没有和裁剪窗口配合好。数据格式由0x4300这一组寄存器控制。0x4300的bit3到bit0选择输出格式比如0x30对应RGB5650x22对应YUV422 8bit。720p60Hz下我一般用YUV422输出数据量适中颜色还原也比较好。如果做二值化或者颜色识别RGB565也合适看主控需要什么格式。3.3 接口方向与控制0x3017、0x3018、0x3019这组寄存器是DVP和MIPI切换的“开关”也是很多人最蒙的地方。0x3017的bit7控制DVP的PCLK输出极性bit6控制HSYNC极性bit5控制VSYNC极性bit4控制HREF与HSYNC的映射关系bit3到bit0则配置DVP数据线的使能。如果配置不对即使分辨率、时钟都对了采集端也可能出现图像错位、颜色错位甚至完全黑屏的问题。0x3018的bit7和bit6控制MIPI的lane数量常见配置是2-lane。bit0控制MIPI接口的时钟输出。0x3019是MIPI的时钟分频配置当MIPI时钟源来自PLL时需要按lane速率做分频。在实际工程中同一份sensor初始化代码如果只是把0x3017和0x3018改一下DVP和MIPI两个平台往往就能共用大部分寄存器表。这是我后来做FPGA和瑞芯微双平台项目时效率最高的方式——先调通DVP版本再在此基础上切换MIPI配置比从头摸MIPI寄存器省事得多。3.4 图像质量相关AWB、AE、GammaOV5640内置3AAE自动曝光、AWB自动白平衡、AF自动对焦这些的控制分散在多个寄存器里。0x3212是AWB控制bit0使能自动白平衡。0x3503是曝光控制bit3和bit2控制曝光参数更新方式。0x350A到0x350B是曝光值0x3500到0x3501是增益值。0x3400到0x3401是整体增益。这一组寄存器有一个非常实用的小技巧调试初期先关掉自动白平衡和自动曝光固定一个初始值先把图像的通路打通确认能够稳定输出后再打开AWB和AE。否则在图像还是花屏或者噪点很多的时候自动曝光会把画面拉到一团白或者一团黑很难判断是sensor配置问题还是采集端问题。4. 720p60Hz配置实战从帧率公式到完整寄存器表4.1 先算再配帧率、PCLK、HTS/VTS的关系要配置720p60Hz不能上来就抄寄存器的值你得先弄明白帧率是怎么算出来的。OV5640的帧率公式其实很简单帧率 PCLK / (HTS × VTS)这里PCLK是像素时钟HTS是水平总尺寸VTS是垂直总尺寸。注意HTS和VTS都包含消隐区域不是实际的宽和高。我来演示一下怎么反推参数。假设我们选用24MHz的XVCLK目标帧率60fps输出720p。为了避免PCLK过高导致信号完整性问题我希望PCLK在70到100MHz之间。先把HTS定为2200这个值是比较常见的行消隐配置。那么VTS PCLK / (HTS × fps)如果PCLK取99MHz那么VTS 99×10^6 / (2200 × 60) 750。这个数字很好正好是720加上30行垂直消隐符合常规。再验算一下实际帧率99×10^6 / (2200 × 750) 60Hz。完美。如果你手里的模组PCLK上限不高想把PCLK降下来可以相应调小HTS。比如PCLK84MHzHTS2000那么VTS 84×10^6 / (2000×60) 700也能跑到60fps。但记住不要为了凑帧率把消隐压得太小否则sensor内部ISP处理不过来会出现丢行或者图像撕裂。4.2 寄存器配置参考表基于上面的公式推导我实际在ESP32-S3 DVP和FPGA MIPI两个平台都用过一套可以稳定跑到720p60Hz的配置。这里给出关键寄存器注意0x3008的软复位要放在配置序列的最后也就是先配好PLL和输出时序再触发软复位让sensor正式启动输出。寄存器地址值说明0x31030x11系统时钟选择PLL0x30170x7FDVP输出PCLK/HSYNC/VSYNC极性配置0x30180xFCDVP数据线使能DVP模式MIPI模式时按需改为MIPI 2-lane配置0x30340x1APLL分频配置0x30350x21PLL倍频配置高位0x30360x42PLL倍频配置低位与0x3035配合得到目标PCLK0x30370x03PLL输出分频0x31060xF5内部时钟门控配置0x38080x05水平输出尺寸高8位12800x38090x00水平输出尺寸低8位0x380A0x02垂直输出尺寸高8位7200x380B0xD0垂直输出尺寸低8位0x380C0x08HTS高8位22000x380D0x98HTS低8位0x380E0x02VTS高8位7500x380F0xEEVTS低8位0x38200x47垂直翻转与裁剪配置0x38210x1F水平翻转与裁剪配置0x43000x22YUV422输出格式0x48000x04MIPI模式时配置MIPI时钟分频0x481D0x40MIPI模式时配置数据lane速率相关参数0x481F0x40MIPI模式时配置时钟lane速率相关参数0x30080x02软复位最后写入需要说明的是这套寄存器表是从我实际工程里整理出来的PLL相关数值已经针对24MHz XVCLK做过调整。如果你用的是27MHz晶体的模组0x3035/0x3036/0x3037这几个值需要按比例重新计算直接把24MHz的配置搬过去会导致帧率和颜色都不对。MIPI模式下的0x4800、0x481D、0x481F这几个寄存器不同驱动版本差异很大最好以你模组厂商提供的初始化序列为基准。我上面的值是参考值重点要理解的是它们控制的是“MIPI lane的串行数据率与PCLK之间的比例”。每lane速率估算公式可以按总数据率 分辨率 × 位宽 × 帧率如果是YUV422 16bit、1280×720、60fps总数据率约880Mbps2-lane分下来每lane约440Mbps配置0x481D和0x481F的目标值在这个量级附近就是合理的。4.3 完整初始化代码在实际工程中我不会把几百个寄存器全部手写而是构造一个“地址值”的结构体数组再用统一的SCCB写接口顺序写入。下面是我在项目里常用的一套DVP 720p60Hz初始化代码已经去掉与格式无关的调试寄存器保留核心部分。#include stdint.h #define OV5640_ADDR 0x3C // SCCB/I2C地址8bit寻址 typedef struct { uint16_t reg; uint8_t val; } ov5640_reg_t; // SCCB接口至少实现以下两个函数 extern int8_t sccb_write(uint16_t reg, uint8_t val); extern void delay_ms(uint32_t ms); static int8_t ov5640_write_regs(const ov5640_reg_t *regs, uint32_t len) { uint32_t i; for (i 0; i len; i) { if (sccb_write(regs[i].reg, regs[i].val) ! 0) { return -1; } } return 0; } static const ov5640_reg_t ov5640_720p_60fps_dvp[] { // 系统时钟与PLL {0x3103, 0x11}, {0x3034, 0x1A}, {0x3035, 0x21}, {0x3036, 0x42}, {0x3037, 0x03}, {0x3106, 0xF5}, // DVP接口方向与极性 {0x3017, 0x7F}, {0x3018, 0xFC}, // 输出尺寸1280x720 {0x3808, 0x05}, {0x3809, 0x00}, {0x380A, 0x02}, {0x380B, 0xD0}, // HTS2200, VTS750 {0x380C, 0x08}, {0x380D, 0x98}, {0x380E, 0x02}, {0x380F, 0xEE}, // 裁剪与翻转 {0x3818, 0xC3}, {0x3819, 0x01}, {0x3820, 0x47}, {0x3821, 0x1F}, // 输出格式YUV422 {0x4300, 0x22}, // 关闭自动曝光/自动白平衡先用固定参数调通路 {0x3503, 0x07}, {0x3212, 0x00}, }; int8_t ov5640_init_dvp_720p_60(void) { // 先软复位一次确保sensor处于初始状态 sccb_write(0x3008, 0x82); delay_ms(20); if (ov5640_write_regs(ov5640_720p_60fps_dvp, sizeof(ov5640_720p_60fps_dvp) / sizeof(ov5640_reg_t)) ! 0) { return -1; } // 最后再软复位让配置生效 sccb_write(0x3008, 0x02); delay_ms(50); // 确认PLL锁定 uint8_t pll_status 0; // 假设实现了sccb_read函数 // sccb_read(0x3028, pll_status); // if ((pll_status 0x40) 0) return -2; return 0; }这段代码里有一个容易被忽略的点0x3503先写入0x07意思是把自动曝光和增益都置于手动模式0x3212写入0x00是关闭AWB。这是调试通路的策略先把3A全部关掉这样图像亮度和颜色不会自动漂移。通路调通后再打开也就是把0x3503写0x00、0x3212写0x01。如果你接的是MIPI接口只需要把上面的寄存器表做三处改动一是把0x3017和0x3018改为MIPI模式对应的值二是加上MIPI时钟和lane速率相关寄存器三是改用基于MIPI PLL的时钟配置。其他分辨率、HTS/VTS、图像格式的寄存器可以完全共用。4.4 一套配置在DVP和MIPI之间切换的实例我在一个项目里做过这样的验证同一块OV5640模组先接在FPGA开发板上用DVP采集跑720p60Hz图像正常然后同一颗sensor接到Linux开发板的MIPI CSI接口上我只改了上面说的那几组寄存器其余配置原封不动最终也正常出图。这说明OV5640的寄存器设计确实把公共部分和接口部分解耦了你理解了这一点在不同平台间移植会非常快。MIPI模式下的寄存器改动大致是这样0x3017改为MIPI的PCLK/HSYNC/VSYNC不输出或按SoC要求输出0x3018开启MIPI lane并使能MIPI时钟输出配置2-lane0x3019配置MIPI时钟分频让lane速率落在目标范围0x4800到0x481F这组寄存器配置MIPI的时序与时钟lane的传输参数0x4837配置MIPI的HS传输准备时间等根据我调瑞芯微平台的经验SoC驱动里对MIPI sensor的lane速率和通道数有明确的dts配置这部分要和sensor端寄存器严格对应。比如dts里写lane数等于2sensor寄存器里就必须配成2-lane否则SoC的CSI控制器会报错或者收不到数据。5. DVP与MIPI硬件调试示波器才是最好的老师5.1 DVP模式的调试顺序DVP接口调试相对直观我每次都是按这个顺序来测第一步先用示波器测XVCLK输入确认sensor的时钟有进来频率在24MHz附近幅度正常。这一步能排除最基本的硬件问题。第二步测PCLK。PCLK没有输出说明sensor内部的PLL或者系统时钟配置有问题优先检查0x3103、0x3034到0x3037这些寄存器以及0x3028的PLL锁定状态。第三步测VSYNC和HSYNC。如果PCLK正常但VSYNC没有多半是输出分辨率配置里VTS超出了范围或者0x3820/0x3821的裁剪窗口设置导致有效行数为零。第四步测DATA线。数据线上的波形应该是稳定的、有规律的跳变。如果数据线电平始终为高或始终为低检查0x3017和0x3018的数据线使能是否正确以及sensor是否真的处于输出状态。我记着有一次调试自己的板子PCLK、VSYNC、HSYNC都有就是数据线所有位都恒为高。查了很多寄存器最后发现是数据线引脚虚焊有一根地线没接好。所以说硬件问题优先于软件问题排查先看波形再改代码不要一上来就怀疑寄存器表。5.2 MIPI模式的波形特征MIPI的调试比DVP要抽象一些因为差分信号不能用普通IO口直接测。示波器带宽至少要500MHz最好用差分探头。如果你只有一个普通无源探头可以分别测正端和负端观察两个波形是否互补。MIPI DPHY有两个工作状态LPLow Power状态是低速控制信号用于上下电和指令传输HSHigh Speed状态是高速数据传输信号幅度小、频率高。正常采集图像时时钟lane上应该能看到持续的HS时钟信号数据lane上则是突发性的HS数据脉冲。有一个很实用的小技巧先测时钟lane。MIPI时钟lane的HS频率应该和你配置的lane速率对应如果频率明显不对回查0x481D和0x481F的分频参数。时钟lane正常后再测数据lane如果数据lane没有HS脉冲说明sensor没有进入MIPI发送模式检查0x3018的MIPI使能位和0x4800的PLL配置。MIPI CRC错误也是常见问题。如果你在SoC端或者FPGA端收到CRC报错优先怀疑信号完整性常见原因包括PCB走线过长、差分对没有等长、串联电阻不匹配、电源纹波过大。CRC错误的排查思路和数字电路信号完整性测试一样先看眼图再查layout。5.3 电源和去耦初始化反复失败的隐形杀手OV5640对电源质量比较敏感内部有模拟电路、数字电路、IO电路和PLL电路不同电源域对噪声的要求不同。AVDD模拟电源通常2.8VDVDD数字电源1.5VDOVDDIO电源1.8V或2.8V这三个电源要分别去耦。我在做板子时吃过一次亏为了省事把AVDD和DOVDD用同一个LDO供电结果sensor初始化偶尔失败读ID正常但配置PLL后始终锁不定整体现象时好时坏。后来在靠近sensor引脚的地方分别加了10uF钽电容和100nF陶瓷电容问题立刻消失。另外PLL的供电滤波电容最好靠近模组的AVDD引脚走线尽量短粗。6. 常见问题与排查技巧实录6.1 读不到sensor ID读不到ID是第一步最常见的故障现象就是SCCB读0x300A和0x300B返回不到0x56和0x40。按照下面的顺序排查基本能解决先测XVCLK有没有。有的模组XVCLK是内部晶体有的需要外部输入看模组型号。然后用示波器确认I2C/SCCB的波形特别是ACK信号主控发出的地址是否正确0x3C是8bit写地址0x3D是读地址如果主控用的是7bit地址模式则是0x3D1。接着检查DOVDD的电压sensor的I2C电平就按照DOVDD来。如果DOVDD是1.8V而MCU的I2C上拉到3.3Vsensor引脚可能被钳位读不到正确ID。最后检查reset引脚OV5640的RESETB引脚是低电平复位有的模组需要外部拉高才能工作悬空或者被错误拉低会导致sensor始终在复位状态。6.2 图像花屏或者颜色错乱出图了但花屏一般不是sensor寄存器的问题而是采集端的数据解析和sensor输出格式对不上。我遇到过一位开发者sensor配置的是YUV422但主控端按RGB565解析结果图像颜色完全乱套看起来像是花屏。先确认0x4300配置的输出格式再看采集端是否按同一格式解析。DVP模式下还要确认数据位宽4:2:2的YUV是16bit需要两个PCLK周期传一个像素如果主控端按8bit逐字节收图像尺寸看起来就会是实际的两倍。花屏还有一种非常隐蔽的原因0x3818和0x3819的水平偏移寄存器配合0x3820/0x3821的翻转位会产生左右或上下镜像的同时改变裁剪起始位置导致输出图像错位。遇到画面错位时把0x3820设0x47、0x3821设0x1F这个常见组合确认一下这两个值在很多参考代码里都是一起出现的。6.3 帧率上不去或者一卡一卡帧率上不去的原因比较多我按优先级排序第一步算PCLK。用示波器测PCLK频率代入帧率公式看看是不是配置的HTS/VTS本身就跑不到60fps。如果PCLK太低检查PLL倍频配置。第二步看采集端是否有丢帧。MCU用DMA采集时如果DMA带宽不够或者PCLK太快而DMA响应不及时就会出现一卡一卡。这种问题在STM32F103这类平台尤其常见720p60Hz的YUV422数据量接近120MB/s很多MCU根本吃不消这时可以考虑降低帧率或者缩小分辨率。第三步检查sensor内部ISP是否有额外延时。OV5640在高分辨率下有些处理步骤会引入延迟可读0x3028确认PLL锁定后再观察HTS/VTS有没有被sensor自动调整。6.4 MIPI模式收不到数据但DVP正常这个现象我见得太多了同一个sensorDVP模式一切正常切到MIPI就死活没数据。原因集中在几个地方。sensor端MIPI PLL没有使能。0x3010是MIPI PLL的配置0x4800等寄存器是MIPI相关参数切换MIPI模式后必须确保MIPI PLL锁定否则不会有HS数据。SoC端的CSI控制器时序配置不匹配。有些SoC要求sensor的MIPI输出必须带连续时钟有些则允许非连续时钟两边不匹配会导致SoC端一直等待同步信号。dts或者FPGA逻辑里配置的lane数、lane速率和sensor端不一致这个也特别常见尤其从网上复制配置时sensor寄存器写的是1-lanedts写的是2-lane数据直接错乱。MIPI模式的调试技巧是先降速。把lane速率尽量降低比如先跑200Mbps左右确认通路正常后再逐步提高。高lane速率下波形劣化明显很多问题在低速时不出现高速才暴露。6.5 快速排查表现象优先检查项常见原因读不到IDXVCLK、I2C波形、DOVDD电平、RESET引脚供电或I2C上拉不对PCLK无输出0x3103、0x3034-0x3037、0x3028PLL未锁定有PCLK但无像素数据0x3017/0x3018、数据线使能DVP引脚配置错误图像花屏0x4300格式、采集端解析格式不匹配图像偏色0x3212 AWB、0x3503 AE3A未正确配置帧率不足PCLK实测、HTS/VTS计算、DMA带宽时钟或带宽瓶颈MIPI无数据0x3010 MIPI PLL、0x4800系列、dtsMIPI使能或lane不匹配MIPI CRC错误信号完整性、电源去耦走线/供电问题7. 我的一点经验之谈调OV5640这几年最大的感受是这个sensor的寄存器和配置看似很多但只要你把“时钟树”这条主线理清楚再复杂的配置都能拆解成几个模块的组合。先定PCLK和HTS/VTS再定分辨率和裁剪再定输出格式和接口剩下那些图像质量的寄存器都是锦上添花。对于刚开始接触的人我建议不要一开始就追求一步到位把寄存器表跑通。先做减法固定分辨率、固定格式、手动曝光、关闭AWB把原始数据流跑通能在示波器上看到干净的PCLK和VSYNC再用逻辑分析仪或者采集端确认数据内容最后才把3A打开做图像优化。整个过程有了清晰的验证节点就不会在一堆寄存器里迷失方向。另外一个细节是网上流传的OV5640初始化序列版本很多有的来自Linux内核驱动有的来自STM32例程有的来自FPGA demo它们的寄存器表在PLL参数和时序参数上存在差异。使用的时候一定要先确认XVCLK频率、目标分辨率、目标帧率这三点然后再挑选参考代码。盲抄一份配置经常会出现“别人能用你用不了”的情况而问题往往不在你的代码而是在于你的硬件模组和参考代码的假设条件不一致。理解原理比抄一百份配置更有用。
返回列表