STM32F429 >> 23. DCMI_OV5640 摄像头

摄像头按输出信号的类型来看可以分为数字摄像头和模拟摄像头,按照摄像头图像传感器材料构成来看可以分为 CCD 和 CMOS。现在智能手机的摄像头绝大部分都是 CMOS 类型的数字摄像头。

数字摄像头跟模拟摄像头的区别

输出信号类型

数字摄像头输出信号为数字信号,模拟摄像头输出信号为标准的模拟信号。

接口类型

数字摄像头有 USB 接口(比如常见的 PC 端免驱摄像头)、IEE1394 火线接口(由苹果公司领导的开发联盟开发的一种高速度传送接口,数据传输率高达 800Mbps)、千兆网接口(网络摄像头)。模拟摄像头多采用 AV 视频端子(信号线+地线)或 SVIDEO(即莲花头–SUPER VIDEO,是一种五芯的接口,由两路视频亮度信号、两路视频色度信号和一路公共屏蔽地线共五条芯线组成)。

分辨率

模拟摄像头的感光器件,其像素指标一般维持在 752(H)*582(V)左右的水平,像素数一般情况下维持在 41 万左右。现在的数字摄像头分辨率一般从数十万到数千万。但这并不能说明数字摄像头的成像分辨率就比模拟摄像头的高,原因在于模拟摄像头输出的是模拟视频信号,一般直接输入至电视或监视器,其感光器件的分辨率与电视信号的扫描数呈一定的换算关系,图像的显示介质已经确定,因此模拟摄像头的感光器件分辨率不是不能做高,而是依据于实际情况没必要做这么高。

CCD 与 CMOS 的区别

摄像头的图像传感器 CCD 与 CMOS 传感器主要区别如下:

成像材料

CCD 与 CMOS 的名称跟它们成像使用的材料有关,CCD 是―电荷耦合器件‖(Charge Coupled Device)的简称,而 CMOS 是―互补金属氧化物半导体‖(Complementary Metal Oxide Semiconductor)的简称。

功耗

由于 CCD 的像素由 MOS 电容构成,读取电荷信号时需使用电压相当大(至少 12V)的二相或三相或四相时序脉冲信号,才能有效地传输电荷。因此 CCD 的取像系统除了要有多个电源外,其外设电路也会消耗相当大的功率。有的 CCD 取像系统需消耗 2~5W 的功率。而 CMOS 光电传感器件只需使用一个单电源 5V 或 3V,耗电量非常小,仅为 CCD 的 1/8~1/10,有的 CMOS 取像系统只消耗 20~50mW 的功率。

成像质量

CCD 传感器件制作技术起步早,技术成熟,采用 PN 结或二氧化硅(sio2)隔离层隔离噪声,所以噪声低,成像质量好。与 CCD 相比,CMOS 的主要缺点是噪声高及灵敏度低,不过现在随着 CMOS 电路消噪技术的不断发展,为生产高密度优质的CMOS 传感器件提供了良好的条件,现在的 CMOS 传感器已经占领了大部分的市场,主流的单反相机、智能手机都已普遍采用 CMOS 传感器。

OV5640 摄像头

STM32F429 >> 23. DCMI_OV5640 摄像头
镜头部件包含一个镜头座和一个可旋转调节距离的凸透镜,通过旋转可以调节焦距,正常使用时,镜头座覆盖在电路板上遮光,光线只能经过镜头传输到正*的图像传感器,它采集光线信号,然后把采集得的数据通过下方的信号引脚输出数据到外部器件。

OV5640 传感器传感器简介

图像传感器是摄像头的核心部件,上述摄像头中的图像传感器是一款型号为 OV5640的 CMOS 类型数字图像传感器。
该传感器支持输出最大为 500 万像素的图像 (2592x1944 分辨率),支持使用 VGA 时序输出图像数据,输出图像的数据格式支持 YUV(422/420)、YCbCr422、RGB565 以及 JPEG 格式,若直接输出 JPEG 格式的图像时可大大减少数量,方便网络传输。
它还可以对采集得的图像进行补偿,支持伽玛曲线、白平衡、饱和度、色度等基础处理。根据不同的分辨率配置,传感器输出图像数据的帧率从 15-60 帧可调,工作时功率在 150mW-200mW 之间。

OV5640 引脚及功能框图

引脚定义:

OV5640 模组带有自动对焦功能
STM32F429 >> 23. DCMI_OV5640 摄像头

信号引脚功能介绍:

STM32F429 >> 23. DCMI_OV5640 摄像头

OV5640 功能框图:

STM32F429 >> 23. DCMI_OV5640 摄像头

1. 控制寄存器

标号①处的是 OV5640 的控制寄存器,它根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过 SIO_C 和 SIO_D 引脚写入的,SIO_C 与 SIO_D 使用的通讯协议跟 I2C 十分类似,在 STM32 中我们完全可以直接用 I2C 硬件外设来控制。

2. 通信、控制信号及时钟

标号②处包含了 OV5640 的通信、控制信号及外部时钟,其中 PCLK、HREF 及VSYNC 分别是像素同步时钟、行同步信号以及帧同步信号,这与液晶屏控制中的信号是很类似的。RESETB 引脚为低电平时,用于复位整个传感器芯片PWDN 用于控制芯片进入低功耗模式
注意最后的一个 XVCLK 引脚,它跟 PCLK 是完全不同的,XVCLK 是用于驱动整个传感器芯片的时钟信号,是外部输入到OV5640 的信号;而 PCLK 是 OV5640 输出数据时的同步信号,它是由 OV5640 输出的信号。XCLK 可以外接晶振或由外部控制器提供,若要类比 XCLK 之于OV5640 就相当于 HSE 时钟输入引脚与 STM32 芯片的关系,PCLK 引脚可类比STM32 的 I2C 外设的 SCL 引脚。

3. 感光矩阵

标号③处的是感光矩阵,光信号在这里转化成电信号,经过各种处理,这些信号存储成由一个个像素点表示的数字图像。

4. 数据输出信号

标号④处包含了 DSP 处理单元,它会根据控制寄存器的配置做一些基本的图像处理运算。这部分还包含了图像格式转换单元及压缩单元,转换出的数据最终通过Y0-Y9 引脚输出,一般来说我们使用 8 根数据线来传输,这时仅使用 Y2-Y9 引脚,OV5640 与外部器件的连接方式见下图。
STM32F429 >> 23. DCMI_OV5640 摄像头

5. 数据输出信号

标号⑤处为 VCM 处理单元,他会通过图像分析来实现图像的自动对焦功能。

要实现自动对焦还需要下载自动对焦固件到模组。

SCCB 时序

外部控制器对 OV5640 寄存器的配置参数是通过 SCCB 总线传输过去的,而 SCCB 总线跟 I2C 十分类似,所以在 STM32 驱动中我们直接使用片上 I2C 外设与它通讯。

SCCB 与标准的 I2C 协议的区别是它每次传输只能写入或读取一个字节的数据,而 I2C 协议是支持突发读写的,即在一次传输中可以写入多个字节的数据(EEPROM 中的页写入时序即突发写)。

关于 SCCB 协议的完整内容可查看《SCCB 协议》文档,下面我们简单介绍下。

SCCB 的起始、停止信号及数据有效性

SCCB 的起始信号、停止信号及数据有效性与 I2C 完全一样,见下图:

  1. 起始信号:在 SIO_C 为高电平时,SIO_D 出现一个下降沿,则 SCCB 开始传输。
  2. 停止信号:在 SIO_C 为高电平时,SIO_D 出现一个上升沿,则 SCCB 停止传输。
  3. 数据有效性:除了开始和停止状态,在数据传输过程中,当 SIO_C 为高电平时,必须保证 SIO_D 上的数据稳定,也就是说,SIO_D 上的电平变换只能发生在 SIO_C 为低电平的时候,SIO_D 的信号在 SIO_C 为高电平时被采集。
    STM32F429 >> 23. DCMI_OV5640 摄像头
    STM32F429 >> 23. DCMI_OV5640 摄像头

SCCB 数据读写过程

在 SCCB 协议中定义的读写操作与 I2C 也是一样的,只是换了一种说法。它定义了两种写操作,即三步写操作和两步写操作:

三步写操作

三步写操作可向从设备的一个目的寄存器中写入数据,见下图:
STM32F429 >> 23. DCMI_OV5640 摄像头

  1. 在三步写操作中,第一阶段发送从设备的 ID 地址+W 标志(等于 I2C 的设备地址:7 位设备地址+读写方向标志);
  2. 第二阶段发送从设备目标寄存器的 16 位地址;
  3. 第三阶段发送要写入寄存器的 8 位数据。

图中的“X”数据位可写入 1 或 0,对通讯无影响。

两步写操作

而两步写操作没有第三阶段,即只向从器件传输了设备 ID+W 标志和目的寄存器的地址,见下图。
STM32F429 >> 23. DCMI_OV5640 摄像头
两步写操作是用来配合后面的读寄存器数据操作的,它与读操作一起使用,实现 I2C 的复合过程。

两步读操作

两步读操作用于读取从设备目的寄存器中的数据,见下图。
STM32F429 >> 23. DCMI_OV5640 摄像头

  1. 第一阶段中发送从设备的设备 ID+R 标志(设备地址+读方向标志)和*位;
  2. 第二阶段中读取寄存器中的8 位数据和写 NA 位(非应答信号)。

由于两步读操作没有确定目的寄存器的地址,
所以在读操作前,必需有一个两步写操作,以提供读操作中的寄存器地址

以上介绍的 SCCB 特性都与 I2C 无区别,而 I2C 比 SCCB 还多出了突发读写的功能,所以 SCCB 可以看作是 I2C 的子集,我们完全可以使用 STM32 的 I2C 外设来与OV5640 进行 SCCB 通讯。

OV5640 的寄存器

控制 OV5640 涉及到它很多的寄存器,可直接查询《ov5640datasheet》了解,通过这些寄存器的配置,可以控制它输出图像的分辨率大小、图像格式及图像方向等。要注意的是 OV5640 寄存器地址为 16 位。

像素数据输出时序

对 OV5640 采用 SCCB 协议进行控制,而它输出图像时则使用 VGA 时序(还可用SVGA、UXGA,这些时序都差不多),这跟控制液晶屏输入图像时很类似。

OV5640 输出图像时,一帧帧地输出,在帧内的数据一般从左到右,从上到下,一个像素一个像素地输出(也可通过寄存器修改方向)。

例如下图中,若我们使用 Y2-Y9 数据线,图像格式设置为 RGB565,进行数据输出时,Y2-Y9 数据线会在 1 个像素同步时钟 PCLK 的驱动下发送 1 字节的数据信号,所以2 个 PCLK 时钟可发送 1 个 RGB565 格式的像素数据。像素数据依次传输,每传输完一行数据时,行同步信号 HREF 会输出一个电平跳变信号,每传输完一帧图像时,VSYNC 会输出一个电平跳变信号。
STM32F429 >> 23. DCMI_OV5640 摄像头

STM32 的DCMI 接口简介

STM32F4 系列的控制器包含了 DCMI 数字摄像头接口(Digital camera Interface),它支持使用上述类似 VGA 的时序获取图像数据流,支持原始的按行、帧格式来组织的图像数据,如 YUV、RGB,也支持接收 JPEG 格式压缩的数据流。接收数据时,主要使用HSYNC 及 VSYNC 信号来同步。

DCMI 整体框图

STM32F429 >> 23. DCMI_OV5640 摄像头

1. 外部接口及时序

上图标号①处的是 DCMI 向外部引出的信号线。DCMI 提供的外部接口的方向都是输入的,接口的各个信号线说明见下表:
STM32F429 >> 23. DCMI_OV5640 摄像头
其中 DCMI_D 数据线的数量可选 8、10、12 或 14 位,各个同步信号的有效极性都可编程控制。
它使用的通讯时序与 OV5640 的图像数据输出接口时序一致,见下图:
STM32F429 >> 23. DCMI_OV5640 摄像头

2. 内部信号及 PIXCLK 的时钟频率

整体框图中标号②处表示 DCMI 与内部的信号线。在 STM32 的内部,使用 HCLK 作为时钟源提供给 DCMI 外设。从 DCMI 引出有 DCMI_IT 信号至中断控制器,并可通过DMA_REQ 信号发送 DMA 请求。

DCMI 从外部接收数据时,在 HCLK 的上升沿时对 PIXCLK 同步的信号进行采样,它限制了 PIXCLK 的最小时钟周期要大于 2.5 个 HCLK 时钟周期,即最高频率为 HCLK 的1/4。

DCMI 接口内部结构

STM32F429 >> 23. DCMI_OV5640 摄像头

1. 同步器

同步器主要用于管理 DCMI 接收数据的时序,它根据外部的信号提取输入的数据。

2. FIFO/数据格式化器

为了对数据传输加以管理,STM32 在 DCMI 接口上实现了 4 个字(32bit x4)深度的FIFO,用以缓冲接收到的数据。

3. AHB 接口

DCMI 接口挂载在 AHB 总线上,在 AHB 总线中有一个 DCMI 接口的数据寄存器,当我们读取该寄存器时,它会从 FIFO 中获取数据,并且 FIFO 中的数据指针会自动进行偏移,使得我们每次读取该寄存器都可获得一个新的数据。

4. 控制/状态寄存器

DCMI 的控制寄存器协调图中的各个结构运行,程序中可通过检测状态寄存器来获 DCMI 的当前运行状态。

5. DMA 接口

由于 DCMI 采集的数据量很大,我们一般使用 DMA 来把采集得的数据搬运至内存。

同步方式

DCMI 接口支持硬件同步或内嵌码同步方式,硬件同步方式即使用 HSYNC 和 VSYNC作为同步信号的方式,OV5640 就是使用这种同步时序

而内嵌码同步的方式是使用数据信号线传输中的特定编码来表示同步信息,由于需要用 0x00 和 0xFF 来表示编码,所以表示图像的数据中不能包含有这两个值。利用这两个值,它扩展到 4 个字节,定义出了 2 种模式的同步码,每种模式包含 4 个编码,编码格式为0xFF0000XY,其中 XY 的值可通过寄存器设置。当 DCMI 接收到这样的编码时,它不会把这些当成图像数据,而是按照下表中的编码来解释,作为同步信号。
STM32F429 >> 23. DCMI_OV5640 摄像头

捕获模式及捕获率

DCMI 还支持两种数据捕获模式,分别为快照模式和连续采集模式。快照模式时只采集一帧的图像数据,连续采集模式会一直采集多个帧的数据,并且可以通过配置捕获率来控制采集多少数据,如可配置为采集所有数据或隔 1 帧采集一次数据或隔 3 帧采集一次数据。

DCMI 初始化结构体

STM32F429 >> 23. DCMI_OV5640 摄像头

1. DCMI_CaptureMode

本成员设置 DCMI 的捕获模式,可以选择为连续摄像(DCMI_CaptureMode_Continuous)或单张拍照 DCMI_CaptureMode_SnapShot;

2. DCMI_SynchroMode

本成员设置 DCMI 数据的同步模式,可以选择为硬件同步方式(DCMI_SynchroMode_Hardware)或内嵌码方式(DCMI_SynchroMode_Embedded);

3. DCMI_PCKPolarity

本成员用于配置 DCMI 接口像素时钟的有效边沿,即在该时钟边沿时,DCMI 会对数据线上的信号进行采样,它可以被设置为上升沿有效(DCMI_PCKPolarity_Rising)或下降沿有效(DCMI_PCKPolarity_Falling);

4. DCMI_VSPolarity

本成员用于设置 VSYNC 的有效电平,当 VSYNC 信号线表示为有效电平时,表示新的一帧数据传输完成,它可以被设置为高电平有效(DCMI_VSPolarity_High)或低电平有效(DCMI_VSPolarity_Low);

5. DCMI_HSPolarity

类似地,本成员用于设置 HSYNC 的有效电平,当 HSYNC 信号线表示为有效电平时,表示新的一行数据传输完成,它可以被设置为高电平有效(DCMI_HSPolarity_High)或低电平有效(DCMI_HSPolarity_Low);

6. DCMI_CaptureRate

本成员可以用于设置 DCMI 捕获数据的频率,可以设置为全采集、半采集或 1/4 采集(DCMI_CaptureRate_All_Frame/ 1of2_Frame/ 1of4_Frame),在间隔采集的情况下,STM32 的 DCMI 外设会直接按间隔丢弃数据;

7. DCMI_ExtendedDataMode

本成员用于设置 DCMI 的数据线宽度,可配置为 8/10/12 及 14 位数据线宽(DCMI_ExtendedDataMode_8b/10b/12b/14b)。


编程要点:

  1. 初始化 DCMI 时钟,I2C 时钟;
  2. 使用 I2C 接口向 OV5640 写入寄存器配置;
  3. 初始化 DCMI 工作模式;
  4. 初始化 DMA,用于搬运 DCMI 的数据到显存空间进行显示;
  5. 编写测试程序,控制采集图像数据并显示到液晶屏。