[其他ST产品] 使用DCMI(DVP)驱动OV2640

[复制链接]
3894|61
 楼主| 工程师犹饿死 发表于 2023-11-26 20:16 | 显示全部楼层
1.4 像素输出时序
单个像素大小取决于图像格式,如RGB565格式单个像素大小为2字节。

OV2640输出的每帧图像的数据默认从左到右,从上到下输出每个采集像素(可通过寄存器修改方向),如下图所示。与控制液晶屏输出图像数据类似。

354176563373333f58.png
 楼主| 工程师犹饿死 发表于 2023-11-26 20:17 | 显示全部楼层
OV2640输出图像时则使用UXGA1600×1200@15fps, SVGA@30fps, 或CIF@60fps时序,通过COM7寄存器切换模式。

8687765633741d3b9d.png

自定义窗口像素范围:

UXGA:2 x 4 to 1632 x 1220
SVGA:OV2640固定为800 x 600
CIF:固定为408 x 304
 楼主| 工程师犹饿死 发表于 2023-11-26 20:18 | 显示全部楼层
它们的像素输出格式如下图所示:

379286563379737062.png
 楼主| 工程师犹饿死 发表于 2023-11-26 20:18 | 显示全部楼层
下面以UXGA为例进行分析:

数据在PCLK上升沿阶段维持稳定,并在1个像素同步时钟PCLK的驱动下发送[9:0]位数据信号。

当行同步信号HREF为高电平时,像素数据依次传输,每传完一行数据时,HREF输出一个电平跳变信号间隔;当帧同步信号VSYNC为低电平时,各行的像素数据依次开始传输,每传完一帧图像时,VSYNC会输出一个电平跳变信号。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:19 | 显示全部楼层
 楼主| 工程师犹饿死 发表于 2023-11-26 20:19 | 显示全部楼层
UXGA模式下的Frame/Pixel Rates:

64146656337bf3ae52.png
 楼主| 工程师犹饿死 发表于 2023-11-26 20:19 | 显示全部楼层
STM32F4系列的控制器具有DCMI(Digital camera Interface)数字摄像头接口,它支持使用类似VGA时序获取图像数据流,支持原始的按行、帧格式来组织的图像数据,如YUV、RGB,也支持接收JPEG格式压缩的数据流。接收数据时,主要使用HSYNC及VSYNC信号来同步。
5008656337d0cd514.png
▲ DCMI接口顶层框图
 楼主| 工程师犹饿死 发表于 2023-11-26 20:20 | 显示全部楼层
2.1 外部接口及时序
DCMI向外部引出的信号线,方向均为输入:

38197656337e7220b9.png

其中DCMI_D数据线的数量可选8、10、12或14位(通过DCMI_CR的EDM[1:0]控制]),其中10/12/14需扩展到16位进行存储。

 楼主| 工程师犹饿死 发表于 2023-11-26 20:20 | 显示全部楼层
以10位数据为例,此时DCMI接口将捕获输入至D[0…9]的10位数据,将其存至16位字的低10位,其余最高有效位清零(位11~15)。因此,此情况下每两个像素时钟周期会生成1个32位的字。

21967656337fe30d0a.png

一般采用某端口的编号连续的引脚读取数据。如传输8位数据时,采用PB8~PB15引脚读取,直接读取GPIOB端口IDR寄存器的高8位即可。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:20 | 显示全部楼层
DCMI通讯时序示例:
432156563381317f43.png
图中DCMI_PIXCLK的捕获沿为下降沿,DCMI_HSYNC和DCMI_VSYNC的有效电平为1。(捕获沿、有效电平均可通过寄存器配置,HSYNC和VSYNC的有效电平指的是采集完一行/帧图像后的状态电平)
 楼主| 工程师犹饿死 发表于 2023-11-26 20:21 | 显示全部楼层
2.2 DCMI时钟
STM32内部使用HCLK(168M)为DCMI外设提供时钟源,从DCMI引出DCMI_IT信号至中断控制器,并可通过DMA_REQ信号发送DMA请求。

DCMI从外部接收数据时,在HCLK的上升沿时对PIXCLK同步的信号进行采样,PIXCLK的最大周期必须大于2.5 个 HCLK 周期,即最高频率为HCLK的1/4(42M)。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:21 | 显示全部楼层
2.3 DCMI功能概述

931316563383895e38.png

▲ DCMI接口的内部结构
 楼主| 工程师犹饿死 发表于 2023-11-26 20:21 | 显示全部楼层
2.3.1 同步器
2.3.1.1 硬件同步模式
使用HSYNC和VSYNC作为同步信号的方式(OV2640即采用此同步方式),VSYNC用于指示一帧图像的起始, HSYNC被用作数据有效信号。其时序图如下图所示:

HSYNC与VSYNC的有效极性通过DCMI_CR的HSPOL位和VSPOL位配置。

9319365633854da498.png
 楼主| 工程师犹饿死 发表于 2023-11-26 20:21 | 显示全部楼层
根据摄像头模块/模式的不同,可能在水平/垂直同步期间内发送数据,但此时由于系统会忽略HSYNC/VSYNC信号有效电平期间内接收的所有数据,HSYNC/VSYNC信号相当于消隐信号。

选择硬件同步模式并启用捕获(DCMI_CR中的CAPTURE位置1)时,数据传输将与VSYNC信号的无效电平(从有效电平切换到无效电平,即开始下一帧时)同步,每一帧结束时都将激活VSIF(垂直同步中断标志)。

注意:对于压缩数据(如JPEG格式),DCMI仅支持硬件同步模式。

 楼主| 工程师犹饿死 发表于 2023-11-26 20:22 | 显示全部楼层
2.3.1.2 内嵌码同步模式
该同步模式一般在特定场合下使用。

使用数据流中嵌入的特定的32 位码来表示同步信息,并且需用0x00和0xFF来表示编码,所以要确保 0x00 和 0xFF 值仅用于同步(不用于数据中)。共有 4 种同步码类型,均采用 0xFF0000XY 格式(XY值可编程)。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:23 | 显示全部楼层
摄像头2种模式下的同步码如下表所示:

448606563389eea20e.png

若FS=0xff意味着所有除此之外的同步码均视为有效的帧结束同步码。在此模式下,一旦使能DCMI,将在首次出现帧结束 (FE) 同步码并且后接帧开始(FS) 同步码之后开始捕获帧。

此外,还针对FS/E和LS/E同步码实现了非屏蔽位功能(通过DCMI_ESUR寄存器配置),这样可仅用同步码中未被屏蔽的位进行比较。因此,可以选择一个位用于同步码的比较,来检测FS/E和LS/E,同时可用多个同步码表示FS/E和LS/E,它们仅在未被屏蔽的位相同即可。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:23 | 显示全部楼层
「示例」

FS = 0x2e,FSU(FS的非屏蔽码) = 0x30。则只需比较位4和位5即可。

8725656338c21a41a.png


注意:只有8位并行数据接口宽度支持内嵌码同步码。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:23 | 显示全部楼层
2.3.2 数据FIFO
为了对AHB上数据传输加以管理,在DCMI接口上实现了 4 个字(32bit x4)深度的 FIFO,用以缓冲接收到的数据。

DMCI向AHB总线读取数据时读指针自动递增,向FIFO写入数据时写指针自动递增。

注意:此FIFO没有溢出保护,如果数据传输率超过了AHB接口能够承受的速率,FIFO中的数据就会被覆盖。当如同步信号出错或FIFO溢出时,FIFO将复位,DCMI接口将等待新的数据帧开始。

DCMI接口挂载在AHB总线上,在AHB总线中有一个DCMI接口的数据寄存器,当我们读取该寄存器时,它会从FIFO中获取数据,并且FIFO中的数据指针会自动进行偏移。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:23 | 显示全部楼层
2.3.3 DMA接口
当DCMI_CR寄存器中的CAPTURE位置1时,激活DMA接口。摄像头接口每次在其寄存器中收到一个完整的32位数据块时,都将触发一个DMA请求。
 楼主| 工程师犹饿死 发表于 2023-11-26 20:24 | 显示全部楼层
2.3.4 捕获模式
快照模式(单帧)

DCMI_CR 寄存器中的 CM =1。当DCMI_CR的CAPTURE位置 1 后,DCMI等待帧起始信号,然后对数据采样。采样完一帧数据后自动清除CAPTURE位,禁止再次采样。
3030656338e828f50.png
注意:若数据溢出,则此帧丢失且依然会清除CAPTURE位。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部