FPGA 20个例程篇:19.OV7725摄像头实时采集送HDMI显示(二)

article/2025/9/13 21:15:15

第七章 实战项目提升,完善简历

19.OV7725摄像头实时采集送HDMI显示(二)

       在正式介绍OV7725 CMOS Sensor视频采集前,首先需要去详细说明OV7725的寄存器配置接口,这里有OmniVision公司推出的官方手册 “OV7725_software_application_note”可供大家参考。

       根据手册我们了解到OV7725上电时默认是输出YUV422格式的视频流,但用户希望其根据不同需求又可以工作在不同模式下,那么这里显然需要去配置分辨率、内部时钟、亮度色彩等等参数,于是乎就引入了SCCB接口即Serial Camera Control Bus,串行相机控制总线。

      实际上OV7725的SCCB接口就是嵌入式开发中常用的IIC接口,只不过OmniVision公司针对CMOS Sensor提供了一个专门术语,其中OV7725的SCCB接口有两个信号即时钟信号SCL和数据信号SDA,OV7725通过这两个信号完成内部寄存器的配置,达到输出预期视频流的目的。

       尽管SCCB总线和IIC总线协议很相似,但OmniVision公司还是专门给出了SCCB接口的介绍手册“OmniVision Serial Camera Control Bus (SCCB) Functional Specification”,手册详细介绍了SCCB总线接口配置细节,也给出了其读写的时序逻辑,OmniVision公司旗下的所有系列CMOS Sensor均可以参照该手册的SCCB时序进行初始化寄存器配置。

        SCCB总线通过串行方式发送8位数据,默认高位先发低位后发,发送完8位数据后,并通过器件的响应信号完成一次数据的传输,如图1所示官方手册在这里也给出了SCCB总线8位数据串行发送的时序图,其中SCCB_E作为IIC的使能信号类似于SPI总线的CS片选信号,在这里FPGA对OV7725进行一对一控制无需关注。

图1 SCCB总线8位数据串行发送的时序图

       如图2所示是SCCB总线寄存器传输的时序图,首先写入设备地址,再写入寄存器地址或者读取寄存器的值,最后写入寄存器的值,每次传输数据都为8位,即ID Address + Sub Address/Read Data + Write Data的流程,手册上也对Phase1、Phase2、Phase3给出了官方说明:

Phase1:CMOS Sensor的唯一ID地址,OmniVision相机的设备地址是0x42,其中最后一位用来区分读取或者写入操作的,即写入时ID地址是0x42,读取时ID地址是0x43;

Phase2:对于SCCB总线的写入操作来说,Sub Address地址即为传感器需要配置的寄存器物理地址;对于SCCB总线的读取操作来说,Read Data即为传感器读取到指定寄存器物理地址的数据;

Phase3:针对Phase2所指定的寄存器物理地址,传输需要设定的寄存器数据;

图2 SCCB总线寄存器传输的时序图

      对应的手册里也对读写流程进行了细分,如图3所示是SCCB总线寄存器的写入流程图,FPGA端先发送ID Address(0x42),再发送Sub Address,最后发送Write Data即完成写入指定寄存器数据的操作。

      相对于写入操作,读取操作更为复杂一些,如图4所示是SCCB总线寄存器的读取流程图,FPGA端先发送ID Address(0x42)和发送Sub Address,再发送ID Address(0x43),最后读取到Read Data即完成读取指定寄存器数据的操作。

       在OV7725正常工作前,必须先对传感器进行初始化,即通过配置寄存器使其工作在预期的工作模式以得到更好画质的图像。

图3 SCCB总线寄存器的写入流程图

  图4 SCCB总线寄存器的读取流程图

      虽然说SCCB是一种与IIC非常相近的通信协议,但是实际上还有些细微差别,在程序设计当中有些地方需要大家去注意,所以笔者在这里简单地做了总结:

  1. SCCB传输协议中第9位是不必关心位即不用关注该位的数据,而IIC写传输协议中则此位是应答位需要去判断从机是否发送低电平响应主机的传输;
  2. SCCB每次传输不超过3个阶段(Phase), 也就是说不能像IIC一样连续地去进行读写操作;
  3. SCCB读取传输协议中,没有重复开始的概念,即在写完寄存器地址后,发送停止信号;

       在整理完“OmniVision Serial Camera Control Bus (SCCB) Functional Specification“即SCCB的接口功能手册上的有效信息后,明白了SCCB的读写时序逻辑后,显然我们需要去更进一步地了解在程序设计当中,需要初始化哪些寄存器,而这些寄存器对应的写入数据又是多少。

     根据“OV7725_software_application_note“即OV7725软件应用手册介绍,我们能了解到OV7725实际上一共包含了172个读写寄存器,以用于CMOS Sensor的工作模式的配置,在这里有的寄存器只支持读取或者写入,有的既支持读取又支持写入,在传感器正常工作前,需要用户人为地进行初始化配置才能工作在预取模式下,在这里虽然对这172个寄存器都可以通过SCCB总线进行配置,但是也并非所有的寄存器都需要配置,有些寄存器直接保持默认值即可。

       在OV7725初始化寄存器配置中,笔者依然延续之前例程如“初始化WM8731芯片“的设计方法,把需要配置的寄存器单独列出来分成一个模块,再在另一个模块中完成对SCCB的读写协议时序逻辑设计,这样更容易实现自顶向下模块化的编程。

      如表1所示是config_ov7725_rgb565模块的信号列表,这个模块存储了70个寄存器物理地址和对应读写寄存器的参数值,在这里笔者把读取制造商ID号作为第零号和第一号寄存器也添加了进来。通常在驱动一款IC时,除了上板示波器观察视频流输出波形,ILA在线调试抓取波形等外,通过软件的方法读取制造商ID号也是最为行之有效的方法,以确认CMOS Sensor是否工作在正常模式下,整个SCCB的时序逻辑是否正确,这个技巧在“FLASH读写“例程中笔者也曾强调过。

信号列表

信号名

I/O

位宽

lut_index

I

8

lut_data

O

16

lut_size

O

8

表1 config_ov7725_rgb565模块信号列表

       如图7-32 所示是OV7725初始化寄存器值模块的代码设计,在这里把OV7725初始化配置成大家所熟知的RGB565视频流格式输出,对于这个模块中的70个读写寄存器在这里也做进一步的说明:

  1. 寄存器编号0和1是读取寄存器,寄存器物理地址0xh1c和0x1d分别是16位制造商ID号的高8位和低8位;
  2. 寄存器编号2到15是对CMOS Sensor分辨率、图像输出格式、像素时钟的配置。这些寄存器主要完成OV7725输出图像的分辨率、输出格式、内部时钟、行/场信号的电平配置等,这里配置视频输出模式为RGB565的640像素*480像素,笔者在这里对寄存器物理地址0x15配置参数值为0x02,即保持VSYNC信号和VGA驱动时序一致(OV7725默认输出场信号VSYNC为低电平时有效);
  3. 寄存器编号16到22是DSP图像处理器的初始化,这几个寄存器主要配置了CMOS Sensor内部DSP进行图像处理的参数包括色彩等;
  4. 寄存器编号23到33是对CMOS Sensor自动增益、自动曝光、自动白平衡参数的配置,在这里笔者配置称自动切换模式;
  5. 寄存器编号34到52是对CMOS Sensor边缘锐度、亮度、噪声抑制等参数的配置,这里使用了统一的OV7725寄存器配置方案;
  6. 寄存器编号53到69是对CMOS Sensor校准参数和其他参数的配置;

       如图5所示是OV7725初始化寄存器值模块的代码设计,整个模块包含了70个寄存器,其中编号0、1为读寄存器、编号2-69为写寄存器,所以当lut_index为0或者1时,SCCB的驱动模块使用读取寄存器的时序逻辑,当lut_index不为0或者1时,SCCB的驱动模块则使用写入寄存器的时序逻辑。

图5 OV7725初始化寄存器值模块的代码设计

      如表2所示是i2c_ov7725模块信号列表,也延续了前面的IIC总线协议的时序设计,但是在SCCB总线协议中主机FPGA无需再对从机ACK的应答位进行判断,并且协议不支持重复开始的操作即在读取寄存器时发送完寄存器物理地址后,要先结束总线通信再发起总线通信,其次这里设定2ms的等待时间用以等待OV7725上电后进入稳定工作状态。

      最后注意到在OmniVision的官方手册中也规定了SCCB的时钟scl最大频率是400Khz,这里我们依旧选用IIC总线的250Khz时钟作为驱动时钟,如图6和7所示是OV7725寄存器读取和写入流程图,在i2c_ov7725模块只需要将流程图对应的时序逻辑进行代码还原即可。为了和config_ov7725_rgb565模块相对应,设置wrl_rdh_mode为读写寄存器模式选择信号,当i2c_config_index为0或者1时,wrl_rdh_mode指示读取,反之指示为写入,如图8是OV7725初始化寄存器设置模块的代码设计。

信号列表

信号名

I/O

位宽

clk

I

1

rst_n

I

1

i2c_config_size

I

8

i2c_config_data

I

16

i2c_sda

I/O

1

i2c_scl

O

1

i2c_config_index

O

8

i2c_config_done

O

1

表2 i2c_ov7725模块信号列表

图6 OV7725寄存器读取流程图

图7 OV7725寄存器写入流程图

图8 OV7725初始化寄存器设置模块的代码设计

         如图9所示是OV7725初始化读取制造商ID的ILA波形图,大家可以清楚地看到初始化结束后rd_id_data值为16'h7fa2和手册给出的一致,也充分地证明了整个初始化模块时序逻辑设计正确。

图9 OV7725初始化读取制造商ID的ILA波形图


http://chatgpt.dhexx.cn/article/FlQNaRrq.shtml

相关文章

OV7725寄存器配置

OV7725寄存器配置(为了替换NT99141研究了很长一段时间) 部分参考链接: OV7725 电器特性和时序图:https://www.cnblogs.com/raymon-tec/p/5087088.html OV7725摄像头的彩色图像采集原理与液晶显示(有必要了解框图):htt…

基于STM32的OV7725摄像头拍照实验

平台:STM32ZET6(核心板)ST-LINK/V2SD卡USB串口线鹰眼OV7725摄像头(注意,为了减少摄像头连线的麻烦,建议初学者选取单片机时选用带有摄像头接口的板子) 工程介绍:需要移植FatFs文件系…

OV7725鹰眼摄像头

OV7725鹰眼摄像头如何使用? 目前的ov7725鹰眼摄像头,基本上用的都是山外的库,所以今天我们主要根据山外的库,基于k60芯片,给大家具体的讲解。 1.摄像头初始化 首先是摄像头的第一步就是初始化,这个我们直…

OV7725摄像头图像采集基础知识

目前FPGA用于图像采集 传输 处理 显示应用越来越多,主要原因是图像处理领域的火热以及FPGA强大的并行处理能力。本文以OV7725为例,对摄像头使用方面的基础知识做个小的总结,为后续做个铺垫。 XCLK:工作时钟输入,由主控器产生&…

FPGA--OV7725摄像头采集与VGA显示实验--1--OV7725使用与驱动协议

目录 前言 OV7725引脚及功能框图 参数指标 引脚 功能框图 SCCB时序及读写操作 SCCB时序特点 读写实现 OV7725寄存器常用配置参数 前言 摄像头采集是图像处理的第一步,本章节分为多部分,旨在让大家学会如何使用OV7725采集图像,并且…

【FPGA的基础快速入门22-------OV7725摄像头模块】

OV7725摄像头模块 OV7725是Omni Vision(豪威科技)公司生产的CMOS图像传感器,该传感器功耗低、可靠性高以及采集速率快,主要应用在玩具、安防监控、电脑多媒体等领域。 OV7725感光阵列达到640*480,能实现最快60fps VGA…

STM32 OV7725 传感器

目录 OV7725 传感器1、选择输出格式2、选择输出分辨率3、帧率调整4、夜间模式5、消除光带6、白平衡7、缺陷像素矫正8、黑电平矫正9、视频模式10、数字缩减 OV7725 函数1、光模式2、颜色饱和度3、亮度4、对比度5、特效 OV7725 设置参考 OV7725 传感器 OV7725摄像机™ 图像传感器…

OV7725摄像头之OV7725芯片

近日入手了一块正点原子家的OV7725摄像头模块,秉着小白尽可能学得透彻些的想法,选择了野火家的相同摄像头教学视频。链接如下:【单片机】野火STM32F103教学视频 (配套霸道/指南者/MINI)【全】(刘火良老师出品) (无字幕)_哔哩哔哩_bilibili 现…

二进制加法运算

两个二进制整数相加时,是位对位处理的,从最低的一对位(右边)开始,依序将每一对位进行加法运算。两个二进制数字相加,有四种结果,如下所示: 0 0 00 1 11 0 1 1 1 10 1 与 1 …

二进制加减法编程

1、二进制加法基本指令 (1)ADD指令 格式:ADD DST,SRC 该指令把源操作数(SRC)指向的数据与目的操作数(DST)相加后,将结果放到目的操作数(DST)中…

二进制乘除法运算原理

二进制乘除法原理 计算机所能完成的最基本操作是加减法和左右移。 虽然ISA中一般都有MUL类指令,但是这些经过译码之后最终的元操作还是加法和移位指令。 二进制乘法 假设不能使用乘除运算求ab的结果,当ab123时,最直接的方法是通过88个88相…

二进制加法计算

读计算机原理这本书的的时候涉及到二进制数的加法,个人做个直观的记录,防止遗忘。 计算时,先把两个二进制数对齐(如同十进制一样, 从右向左)11为10,此时向上一位进1,0写在本位(如同十…

二进制加减乘除

最重要的,理解十进制的借位和进位.十进制中,由于一个循环是10,所以借1位,就相当于从高位借过来10,也就是常说的借1当10,同时,高位需要减去10(外在体现上是减去1,因为高位已经在高位了).反过来,进1,就等于高位加上10,但因为高位已经在高位了,所以去掉位数考虑,高位实际是加1,也就…

二进制加法

计算机中二进制相关运算 有符号二进制与无符号二进制数之间的区别有符号二进制加法运算讨论关于有符号二进制数算术的溢出问题(重点)无符号二进制运算 有符号二进制与无符号二进制数之间的区别 对于一个有符号二进制数来讲,最高位是该数的符…

二进制加减法计算

二进制加减法:原码、反码、补码 1.十进制下的计算1.模数2.补数 2.二进制数的存储1.计算机计数2.原码3.反码4.补码 3.二进制计算1.中位对称2.循环进位3.二进制减法推算4.结论 1.十进制下的计算 1.模数 假设下文【模】定义如下:某个可度量系统的度量范围…

二进制数的运算方法

1.二进制数的算术运算 二进制数的算术运算包括:加、减、乘、除四则运算,下面分别予以介绍。 (1)二进制数的加法 根据“逢二进一”规则,二进制数加法的法则为:0+0=00&…

简单计算二进制的加减法

二进制就是计算机技术中广泛采用的一种数制,由(0,1)组成。你可以广泛的认为,每一个 0,1 都(存储在)对应着一个比特位(bit),而由这些由例如:010010…

二进制的加减乘除法全了看一下叭

看这里~ 前言一、二进制加法二、二进制减法三、二进制乘法四、二进制除法总结 前言 最近在学习通信网络中的CRC算法,所以积累一下二进制的各种算法,如果对您有用,记得点个赞喔!谢谢啦。 一、二进制加法 对于二进制加法和十进制的…

二进制加,减法,23个位运算技巧

二进制加,减法 二进制最高位为1时表示负数,为0时表示正数。 **原码:**一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。 举例说明:       int类型的 …

二进制的加减法_二进制加减法

二进制的加减法 1)二进制加法 (1) Binary Addition) Since binary numbers consist of only two digits 0 and 1, so their addition is different from decimal addition. Addition of binary numbers can be done following certain rules: 由于二进制数仅由两位数字0和1组成…