简要讲解OV7725摄像头

本文主要包含以下几部分内容:

  1. 通过OV7725分析模块原理图。

  2. 讲解部分寄存器的含义、RGB565格式图像输出时序、帧率计算。

  3. 讲解SCCB协议与I2C协议的区别。

1、OV7725功能

  OV7725是一款1/4英寸单芯片图像传感器,其感光阵列达到640*480,能实现最快 60fps 分辨率的图像采集。传感器内部集成了图像处理功能,包括自动曝光控制(AEC)、自动增益控制(AGC)和自动白平衡(AWB)等。同时传感器具有较高的感光灵敏度,适合低照度的应用,下图为OV7725的功能框图。

在这里插入图片描述

图1 OV7725 功能框图

  感光阵列(image array)在XCLK时钟的驱动下进行图像采样,输出640*480阵列的模拟数据;接着模拟信号处理器在时序发生器(video timing generator)的控制下对模拟数据进行算法处理(analog processing)。

  模拟数据处理完成后分成 G(绿色)、 R(红色)、B(蓝色)三路通道经过AD转换器后转换成数字信号,并且通过DSP进行相关图像处理,最终输出所配置格式的10位视频数据流,如果需要使用RGB565格式输出,那么只有高8位的数据有效。

  其中测试模块(test pattern generator)是用来进行彩条测试之类的,可以通过配置寄存器来启用这个模式,测试数据通路。

  模拟信号处理以及DSP等都可以通过寄存器(registers)来配置,配置寄存器的接口就是SCCB接口,该接口协议是阉割版的I2C协议。

  下表是OV7725的管脚含义的介绍,没有列出电源和接地相关引脚。

表1 OV7725引脚含义
管脚I/O含义
PWDNI掉电模式,0:正常模式,1:掉电模式。
RSTBI系统复位,低电平有效。
VREFHI参考电压,通过0.1uF电容接地。
VREFNI参考电压,通过0.1uF电容接地。
FSINI帧同步输入。
VSYNCO场同步输出。
HREFO像素有效指示信号。
XCLKI系统时钟输入。
PCLKO像素时钟输出。
SCLISCCB接口时钟输入。
SDAI/OSCCB接口双向数据线。
D0~D9O十位像素数据输出,D[9:2]用于8位YUV或RGB 565/RGB 555格式。

  下图是OV7725模块的原理图,其中RESET引脚通过4.3K电阻上拉到VCC,并且通过一个0.1uF电容降低抖动。而PWDN引脚通过4.3K电阻下拉到地。也就是说该模块没有掉电模式和复位操作。

  其余的XCLK、PCLK、VSYNC、HREF、D9~D0均引出,XCLK是需要外部提供给OV7725的系统时钟,该时钟输入OV7725之后,可以经过内部锁相环和寄存器配置生成PCLK,然后像素数据D9~D0在PCLK的下降沿输出数据,FPGA就可以在PCLK上升沿采集D9~D0的数据。场同步VSYNC的高电平表示传输一帧数据,HREF位高电平时表示D9~D0的数据有效。

  而OV7725内部锁相环的倍频系数、输出像素的大小、自动曝光、自动增益等都可以通过SCCB接口进行配置。

在这里插入图片描述

图2 OV7725原理图

  最终多数模块引出的引脚如下所示,由于大多使用RGB565格式输出数据,因此像素信号只需要输出D9~D28位即可。CMOS_CTL这些保留信号暂时不考虑。

在这里插入图片描述

图3 OV7725引出引脚

2、寄存器

  OV7725内部包含171个寄存器,每个寄存器有8位数据,寄存器的数目还是比较多的。而且很多寄存器与图像有关,对于我们不是专业研究图像的人来说,并不能很好的理解这些参数。本文只简单分析几个会经常用到的寄存器,如果需要其余寄存器可以通过数据手册自己查看。

  地址为0x12寄存器,该寄存器的bit7为1时,复位所有寄存器,发出该命令后,需要至少延迟1ms才能配置其余寄存器。

在这里插入图片描述

图4 复位寄存器

  而bit1~0用于选择图像输出格式,为2’b00时输出YUV格式,为2’b01时输出Processed Bayer RAW格式,为2’b10时输出RGB格式,为2’b11时输出Bayer RAW格式。

  当输出RGB格式时,需要通过bit3~2确定具体的RGB格式,2’b00输出RGB422,2‘b01输出RGB565,2’b10输出RGB555,2’b11输出RGB444格式的图像数据。

  OV7725的XCLK生成PCLK的频率公式为:finternal clock = finput clock × PLL multiplier / [(CLKRC[5:0] + 1) × 2]。其中finternal clock为PCLK频率,finput clock为XCLK的频率。

在这里插入图片描述

图5 锁相环倍频设置

  PLL multiplier由地址为0x0D寄存器的bit7和bit6决定。如果为2’b00则PLL multiplier为1,如果为2’b01则PLL multiplier为4,如果为2’b10则PLL multiplier为6,如果为2’b11则PLL multiplier为8。

  CLKRC[5:0]是地址为0x11寄存器的低6位数据,如果输入XCLK为12MHz,PLL 倍频设为4倍,CLKRC[5:0]设置为0,则可以得到PCLK为24MHz。

在这里插入图片描述

图6 分频系数设置

  如何设置输出图像尺寸呢?

  首先可以通过地址为0x18的bit7~0和0x32的bit1~0设置输出图像数据的水平像素个数。由于OV7725水平像素最大支持640,所以需要10位二进制数据才能表示,一个寄存器只有8位数据,需要两个寄存器才能存储10位数据。

在这里插入图片描述

图7 输出图像分辨率设置

  地址为0x1A的bit7~0和0x32的bit2设置输出图像数据的垂直像素点个数,OV7725垂直像素最大支持480,需要9位二进制数据才能表示,因此需要两个寄存器进行存储。

  其余寄存器还有很多,这里就简要介绍这几个重要的,其余的可以通过官方通过的初始化参数进行设置。

3、RGB565格式

  OV7725输出RGB565格式的图像数据时序如下图所示,由于数据线只有8位,而每个像素点包含16位数据,因此需要两个PCLK时钟才能输出1个像素数据。

  第一PCLK时钟下降沿输出5位红色像素和3位绿色像素数据,第二个PCLK时钟下降沿输出3位绿色像素和5位蓝色像素数据,两个时钟传输的数据拼接为一个像素点的数据。

  由于OV7725在PCLK下降沿输出数据,那么FPGA就可以在PCLK的上升沿采集数据线D[9:2]上的数据。

在这里插入图片描述

图8 RGB565时序

  下图是VGA输出640*480像素的时序图,本次使用的是HREF信号,没有使用HSYNC信号。注意下图中tp表示传输1个像素数据的时钟,经过上述分析可知,在传输RGB565格式的数据时tp=2*PCLK。

在这里插入图片描述

图9 VGA格式

  HREF信号为高电平表示D[9:2]传输的数据是有效的,每次连续输出1行像素数据,因此上图中HREF信号每次拉高时间为640tp。由于显示前沿、后沿等东西的存在,每次传输完一行图像数据之后,需要拉低144tp才能在次传输下一行图像数据。因此传输一行数据的时间为640tp+144tp=784tp,将传输一行数据消耗的时间称为tLINE,因此tLINE=784tp。

  场同步信号VSYNC拉高表示一帧数据传输的开始,因为显示前沿、后沿这些东西的存在,需要等一段时间HREF才会拉高输出有效像素数据。传输一帧图像数据需要510tLINE。

因此可以计算出传输一帧图像数据所需要的时钟个数为510tLINE=510*784tp=510*784*2*tpclk=799680*tpclk。

  当PCLK时钟频率为24MHz时,则帧率为24M/799680≈30.012Hz,所以说当PCLK为24MHz时,每秒可以输出30张图片。PCLK为48MHz时,可以输出60帧的图像数据。

  下图是时钟和复位的一些说明,PCLK最小为10MHz,最大为48MHz,即最大支持60帧640*480的图像输出。当复位后,需要等待1ms,配置寄存器之后,需要等待10帧数据输出的时间,输出的图像数据才会稳定。

在这里插入图片描述

图10 频率限制

  一般最常用的就是RGB565格式,关于RGB565格式本文就介绍这么多,该接口常被称为DVP接口,后文直接使用FPGA实现数据采集。

4、SCCB时序

  最后在讲解一下SCCB(Serial Camera Control Bus)协议的相关内容,该协议是OmniVision公司参考I2C协议为自家的图像传感器提出的接口协议。可以通过百度直接获取手册,据说厂家这么做是为了规避 I2C 总线的版权,手册里关于协议的描述采用三相写、两相写来对读写时序进行描述,搞得反而不好理解。

  一般有三线和两线的两种连接方式,一般的传感器为了节省引脚,都将SCCB_E直接拉高处理了,只引出了SIO_C和SIO_D两个引脚。

在这里插入图片描述

图11 三线制应用模式

在这里插入图片描述

图12 两线制应用模式

  下面是SCCB的写时序,与I2C的写时序基本一致,首先发送器件地址,然后发送寄存器地址,最后发送写入数据,OV7725的器件地址为7’h21

  需要注意SCCB的应答位为X,表示不应答,含义就是从机可能不会对主机的指令做出应答,但是这段时间主机依旧要释放总线。即主机不需要检测从机是否应答,只需要传输对应的数据即可。

在这里插入图片描述

图13 SCCB写时序

  因此SCCB的写时序可以直接使用I2C的写时序,不用关心输出的应答信号即可。

  下图是SCCB的读时序,区别在于虚写完成时,由于SCCB没有重复起始位的功能,必须先发送停止位,之后才能发送起始位进行读操作。

在这里插入图片描述

图14 SCCB读时序

  因此I2C和SCCB协议有两个区别,第一SCCB的从机可能不会应答主机,主机也不需要去检测从机的应答位。第二就是SCCB在读操作时,发送完虚写之后,需要发送停止位,才能发送起始位读出数据。第三SCCB不支持连续地址读、写操作。

  对于OV7725来说,一般只会通过写操作来配置其寄存器,不会使用读操作。因此在初始化OV7725寄存器时,完全可以使用I2C协议代替SCCB协议,因为不会使用读操作,所以不需要修改I2C读时序。

  其余起始位、停止位均与I2C时序一致,可以查看前文I2C协议的详解。

  最后注意有的原理图上SDA数据线上可能会串接电阻,这是为了在主机和从机争夺总线时,减小总线电流。

  如下图所示,当主机输出高电平,从机输出低电平时,电流会从主机的VCC通过电阻直接到从机的GND,如果没有电阻,由于MOS管导通电阻一般很小,可能导致电流很大,烧毁器件吧。

在这里插入图片描述

图15 串接电阻

  下图是SCCB接口时序,为了了解相关时序参数,需要查看该图。

在这里插入图片描述

图16 SCCB时序

  上图配合下表即可得知OV7725对SCCB协议相关要求,首先得知SCL最大频率为400KHz,没有最低频率的要求。

  由于SCL频率较低,且数据均在SCL低电平的时候传输,所以数据相关的建立时间和保持时间一般是不会出现问题的。

  由于使用FPGA,两次读、写操作的间隔时间可以达到系统时钟周期的(10ns)级别,所以需要关注一些OV7725对于两次SCCB操作的间隔时间要求。tBUF在上图可以看出是停止位和起始位之间的间隔,下表规定该时间必须大于1.3us。

在这里插入图片描述

图17 SCCB时序参数

  前文写I2C时序代码时,起始位和停止位间隔时间大致是半个SCL周期,如果SCL为200KHz,那么半个SCL周期时间为2.5us,大于1.3us,不需要额外增加延时,当模块空闲即可开始下一次读写操作。

  如果SCL频率为400KHz,半个SCL周期时间为1.25us,小于1.3us,可能需要增加额外延时。此处是针对我前文写的I2C模块进行分析的,如果不使用该模块可以忽略。

  本文相关内容到此结束了,需要SCCB手册或者OV7725手册的在后台恢复“OV7725手册“(不包括引号)即可。建议看I2C手册,描述比SCCB简单多了,SCCB手册绕了一大圈,还是讲的相同问题。


  如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!

  如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/429048.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python教师/学生信息管理系统 [简易版] (源码)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…

抓 https 报文新方案 -Magisk+LSPosed,来试试吧

【面试突击班】1. 性能测试主要关注哪些指标? 关于如何抓取Android端https报文,在之前一篇文章中有介绍可以通过VitualXposedJustTrustMe模块禁用SSL验证,这样可以抓取到https,还是有一些同学反馈以下的一些问题: App…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程三级真题解析

本文收录于专栏《Scratch等级认证CCF-GESP真题解析》,专栏总目录・点这里 一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程…

React-子传父

1.概念 说明&#xff1a;React中子组件向父组件传递数据通常涉及回调函数和状态提升等方法。 2.代码实现 2.1绑定事件 说明&#xff1a;父组件绑定自定义事件 <Son onGetSonMsg{getMsg}></Son> 2.2接受事件 说明&#xff1a;子组件接受父组件的自定义事件名称…

day46_Servlet

今日内容 0 复习昨日 1 Servlet基础 1.1 Servlet介绍 1.2 第一个Servlet 1.3 流程分析 1.4 使用细节 1.5 映射细节 1.6 生命周期 2 HttpServlet 2.1 HTTP请求、响应、状态码 2.2 GET和POST的区别 2.3 HttpServlet 0 复习昨日 1 maven创建-java项目结构 2 maven创建-javaweb项目…

自测-5 Shuffling Machine(python版本)

文章预览&#xff1a; 题目翻译算法python代码oj反馈结果 题目 翻译 shuffle是用于随机化一副扑克牌的过程。由于标准的洗牌技术被认为是薄弱的&#xff0c;并且为了避免员工通过不适当的洗牌与赌徒合作的“内部工作”&#xff0c;许多赌场使用了自动洗牌机。你的任务是模拟一…

GIN与Echo:选择正确Go框架的指南

您是否在Go中构建Web应用&#xff1f;选择正确的框架至关重要&#xff01;GIN和Echo是两个热门选择&#xff0c;每个都有其优势和特点。本指南将详细介绍每个框架的特性、速度、社区热度以及它们各自擅长的项目类型。最后&#xff0c;您将能够为您的下一个Web项目选择完美的框架…

CodeFlying 和 aixcoder两大免费软开平台,孰强孰弱?

今天为大家带来码上飞CodeFlying和aixcoder两款免费的软件开发平台效果的测评 一、产品介绍 首先简单介绍一下这两个平台 码上飞CodeFlying&#xff1a;码上飞 CodeFlying | AI 智能软件开发平台&#xff01; 是一款革命性的软件开发平台&#xff0c;它通过将软件工程和大模…

【LangChain学习之旅】—(11) 记忆:通过Memory记住用户上次的对话细节

【LangChain学习之旅】—&#xff08;11&#xff09; 记忆&#xff1a;通过Memory记住客户上次买花时的对话细节 使用 ConversationChain使用 ConversationBufferMemory使用 ConversationBufferWindowMemory使用 ConversationSummaryMemory使用 ConversationSummaryBufferMemor…

一文讲明白Java中线程与进程、并发与与并行、同步与异步

写在开头 ok&#xff0c;everybody&#xff0c;在过去的两周内&#xff0c;我们大体上讲完了Java的集合&#xff0c;在最后我们探讨了关于HashMap线程不安全的原因&#xff0c;又提出了ConcurrentHashMap这个线程安全的集合解决方案&#xff0c;那么在接下来的2-3周内&#xf…

苹果电脑清理qq的缓存 苹果电脑删除qq聊天记录 qq垃圾怎么清理最干净 卸载器 CleanMyMac x值不值得买 电脑缓存怎么清理干净

苹果电脑是很多人的首选&#xff0c;它的性能优异&#xff0c;设计精美&#xff0c;操作简洁。但是&#xff0c;如果你经常使用qq这款软件&#xff0c;你可能会发现你的苹果电脑越来越卡顿&#xff0c;存储空间越来越少&#xff0c;甚至出现一些奇怪的问题。这是因为qq会产生大…

webstorm 创建运行纯Typescript项目

创建一个空项目&#xff0c;在项目根目录创建一个tsconfig.json文件自动配置&#xff1a; 打开终端输入tsc --init&#xff0c;即可自动生成tsconfig.json文件手动配置&#xff1a; 在项目根目录下新建一个tsconfig.json文件,并配置如下内容 具体配置可以直接使用下面的配置&am…

MyBatisPlus入门教程

MyBatisPlus MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window) 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 官网地址&#xff1a;https://baomidou.com/ 一、入门案…

【C++】类与对象(static、explicit、友元、隐式类型转换、内部类、匿名对象)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 再谈构造函数 初始化列表 隐式类型转换 explicit关键字 static成员 概念 计算程序中创建出了多少个类…

Vscode连接外部虚拟环境

如果vscode工程目录里面有一个超级大的虚拟环境文件夹&#xff0c;怎么说都不是一件优雅的事&#xff0c;因此我们希望这个虚拟环境在工程目录外部&#xff0c;我们开始&#xff1a; 1. 复制虚拟环境目录路径&#xff1a;E:\envs\test 2. 在vscode中打开文件夹&#xff0c;CT…

扩散模型入门

主要参考资料 B站视频《Sora 夜谈之 Video Diffusion 综述》 目录 图像Diffusion模型发展脉络视频Diffusion模型发展脉络视频模型评价标准 图像Diffusion模型发展脉络 相较于直接在图像层Pixel space加噪和降噪&#xff0c;Latent Diffusion则通过编码增加了一层Latent层&…

蓝牙耳机UI设计方法之表格法

是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加他微信hezkz17, 本群提供音频技术答疑服务,+群赠送蓝牙音频,DSP音频项目核心开发资料, 1 表格设计方法 2 附录内容 序号需求原生音频文件english EN

基于springboot+vue的图书电子商务网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Qt+FFmpeg+opengl从零制作视频播放器-2.环境搭建

1.环境介绍 Qt5.9.0VS2017ffmpeg4.4.3&#xff0c;这里版本均使用64位版本。 Qt的版本大于我这个版本都行。 opengl3.3&#xff0c;Qt已经封装好了QOpenGLWidget&#xff0c;直接使用Qt的就行。 Qt版本下载&#xff1a;Index of /archive/qt 2.ffmpeg下载 Releases BtbN…

鸿蒙即将抛弃Android,你还不来学习一下?

前言 最近移动开发圈子里&#xff0c;鸿蒙可谓出尽了风头&#xff0c;先是宣布即将正式发布的 Harmony OS Next 将完全剥离 Android 代码&#xff0c;也就是不再兼容 Android&#xff0c;化身为纯血的鸿蒙&#xff0c;紧接着又启动了鸿蒙生态千帆启航&#xff0c;伴随着的是众…