OV5640摄像头驱动学习

news/2025/3/4 21:47:36/文章来源:https://www.cnblogs.com/yjxmike/p/18751562

简介:

OV5640的功能框架如图:

增益放大器(AMP)以及ISP等可以通过寄存器(registers)来配置,配置寄存器的接口就是SCCB接口,该接口协议兼容IIC协议。
SCCB (Serial Camera Control Bus)串行摄像头控制总线。该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以及图像处理参数等。
输出图像参数设置
ISP (Image Signal Process)输入窗口设置、预缩放窗口设置、输出大小窗口设置
输出像素格式
YUV(亮度参量与色彩参量分开表示的像素格式)、RGB(包括RGB888、RGB565、RGB555)以及RAW(原始图像数据)
输出帧率
QSXGA:25921944@15fps
QVGA:320
240@120fps
图像输出时序

(1)PCLK:像素时钟,一个PCLK时钟输出一个或者半个像素(像素数据的高8位或低8位);
(2)HREF/HSYNC:行同步信号,由摄像头输出,用于标志一行数据的开始与结束。当HREF为高电平时,图像输出有效。(HREF上升沿马上输出数据,HSYNC等待一段时间再输出图像数据)
(3)VSYNC:场同步信号,由摄像头输出,标志着一帧数据的开始与结束。
(4)D[9:0]:像素数据,由摄像头输出,在RGB565格式中只有高8位D[9:2]是有效的。
(5)tp:一个像素点的周期,在RGB565和YUV422中,tp=2*tPCLK;在RAW中,tp=tPCLK。OV5640一个时钟周期只能传输8bit数据,而RGB565采用16bit数据表示一个像素点。因此需要两个时钟周期才能输出一个RGB565像素数据,第一次输出的数据为RGB565的高8位,第二次输出的数据为RGB565的低8位。

帧时序


VSYNC的上升沿作为一帧的开始,HREF拉高开始输出有效数据。

OV5640采集的Verilog代码

module  ov5640_capture_data(input                 rst_n           ,  //复位信号//摄像头接口input                 cam_pclk        ,  //cam 数据像素时钟input                 cam_vsync       ,  //cam 场同步信号input                 cam_href        ,  //cam 行同步信号input        [7:0]    cam_data        ,  //cam 数据output                cam_rst_n       ,  //cmos 复位信号,低电平有效output                cam_pwdn        ,  //电源休眠模式选择//RGB888接口output                cmos_frame_clk,    //时钟信号output                cmos_frame_ce,     //时钟使能信号output                cmos_frame_vsync,  //帧有效信号output                cmos_active_video ,//数据有效output       [23:0]   cmos_frame_data    //有效数据
);//parameter define//寄存器全部配置完成后,先等待10帧数据
//待寄存器配置生效后再开始采集图像
localparam  WAIT_FRAME = 4'd10  ;            //寄存器数据稳定等待的帧个数//reg define
reg          rst_n_d0 =1;
reg          rst_n_syn =1;
reg          cam_vsync_d0 ;
reg          cam_vsync_d1 ;
reg          cam_href_d0 ;
reg          cam_href_d1 ;
reg   [3:0]  cmos_ps_cnt ;                  //等待帧数稳定计数器
reg          wait_done ;
reg          byte_flag ;
reg   [7:0]  cam_data_d0 ;
reg  [15:0]  cmos_data_16b ;                //用于8位转16位的临时寄存器
reg          byte_flag_d0 ;//wire define
wire  pos_vsync ;//*****************************************************
//**                    main code
//*****************************************************//采输入场同步信号的上升沿
assign  pos_vsync  = (~cam_vsync_d1) & cam_vsync_d0 ;//不对摄像头硬件复位,固定高电平
assign  cam_rst_n = 1'b1;//电源休眠模式选择 0:正常模式 1:电源休眠模式
assign  cam_pwdn  = 1'b0;assign  cmos_frame_clk   = cam_pclk;
//由于摄像头输入接口的两个时钟周期对应于RGB888输出接口的一个有效时钟周期
//所以要给出数据有效标志即RGB888输出接口的时钟使能信号
assign  cmos_frame_ce     = wait_done  ?  (byte_flag_d0 & cmos_active_video) || (!cmos_active_video) : 1'b0;
assign  cmos_frame_vsync  = wait_done  ?  cam_vsync_d1  :  1'b0; //输出帧有效信号
assign  cmos_active_video = wait_done  ?  cam_href_d1   :  1'b0; //输出行有效信号
assign  cmos_frame_data   = wait_done  ?{ cmos_data_16b[15:11],3'd0 , cmos_data_16b[10:5],2'd0 , cmos_data_16b[4:0],3'd0 }:  24'd0; //输出数据//复位信号的异步复位、同步释放处理
always @(posedge cam_pclk or negedge rst_n) beginif(!rst_n) beginrst_n_d0 <= 1'b0;rst_n_syn <= 1'b0;endelse beginrst_n_d0  <= 1'b1;rst_n_syn <= rst_n_d0;end
end//对行、场同步信号的延迟打拍
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn) begincam_vsync_d0 <= 1'b0;cam_vsync_d1 <= 1'b0;cam_href_d0 <= 1'b0;cam_href_d1 <= 1'b0;endelse begincam_vsync_d0 <= cam_vsync;cam_vsync_d1 <= cam_vsync_d0;cam_href_d0 <= cam_href;cam_href_d1 <= cam_href_d0;end
end//寄存器全部配置完成后,先等待10帧数据
//待寄存器配置生效后再开始采集图像
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)cmos_ps_cnt <= 4'd0;else if(pos_vsync && (cmos_ps_cnt < WAIT_FRAME))cmos_ps_cnt <= cmos_ps_cnt + 4'd1;  //对帧数进行计数
end//等待完成后 给出 等待完成信号
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)wait_done <= 1'b0;else if((cmos_ps_cnt == WAIT_FRAME) && pos_vsync)wait_done <= 1'b1;
end//8位数据转16位RGB565数据
always @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn) begincmos_data_16b <= 16'd0;cam_data_d0 <= 8'd0;byte_flag <= 1'b0;endelse if( cam_href ) begin  //cam 行同步信号byte_flag   <= ~byte_flag;cam_data_d0 <= cam_data;if(byte_flag)cmos_data_16b <= {cam_data_d0,cam_data};endelse beginbyte_flag <= 1'b0;cam_data_d0 <= 8'b0;end
endalways @(posedge cam_pclk or negedge rst_n_syn) beginif(!rst_n_syn)byte_flag_d0 <= 1'b0;elsebyte_flag_d0 <= byte_flag;
endendmodule

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于PID控制器的双容控制系统matlab仿真

1.课题概述 基于PID控制器的双容控制系统matlab仿真,仿真输出PID控制下的水位和流量两个指标。2.系统仿真结果 (完整程序运行后无水印) 3.核心程序与模型 版本:MATLAB2022a% 绘制结果图形 t1 = 0:1:times; t2 = 0:1:(times-1); hmax = 23*ones(1,times); % 硬约…

【APP逆向37】hook失败之ptrace占坑

现象使用attach方式hook,frida -UF -l hook.js原因unable to access process with pid 17124 due to system restrictions; try `sudo sysctl kernel.yama.ptrace_scope=0`, or run Frida as root这是ptrace占坑的标志。ptrace可以让一个进程监视和控制另一个进程的执行,并且…

AI训练进行web前后端开发协助

周五我们进行了针对web开发辅助的ai训练,以下是训练过程: 首先我搭建好了环境 然后我根据编程习惯将web前后端分成了这几点:之后我就将其丢给了deepseek,它直接帮我生成了上到mysql表格建立,下到前端jsp页面的所有文件, 哎,这之前怎么没觉得ai这么好用啊,要是用上这种开…

JavaWeb学习(六)

JavaWeb学习(六):Web前端开发 —— 其余内容 目录JavaWeb学习(六):Web前端开发 —— 其余内容Ajax前端工程化Vue 组件库 ElementVue 路由打包部署 本文为个人学习记录,内容学习自 黑马程序员Ajax概念:Asynchronous JavaScript And XML,异步的 JavaScript 和 XML作用:…

leetcode hot 19

解题思路:这题思路主要是用某个容器(数组等)来存储链表,然后再用双指针或者同时遍历的方法就可以判断。我使用栈进行存储,出栈的元素相当于链表倒序,如果和链表正序的结果相同就证明是回文。如果想用O(1)的空间,就把前一半或后一半的链表倒转,然后遍历就可以了。 /*** D…

code.c WriteUp

题目链接: https://pan.baidu.com/s/1u8bGbKcUF6_gLaw63L3jyA?pwd=h8r5 提取码: h8r5 WriteUp 题目名称:code.c 分类:Reverse 描述:得到源码的输出结果 解题思路 首先用Vscode查看code.c文件,发现该文件对argv[]进行判断处理,其中很容易联想到这和输出结果紧密联系。依次…

6. Calcite添加自定义函数

1. 简介 在上篇博文中介绍了如何使用calcite进行sql验证, 但是真正在实际生产环境中我们可能需要使用到用户自定义函数(UDF): 通过代码实现对应的函数逻辑并注册给calcitesql验证: 将UDF信息注册给calcite, SqlValidator.validator验证阶段即可通过验证 sql执行: calcite通过调…

P10945 Place the Robots 紫 题解

Part 1. 题意 在 \(N \times M\) 的矩阵中的空地放人机,任一人机上下左右走到边界或墙之前遇不到另一人机。 我已经尽力写得简短了。。Part 2. 思路 我们先思考无墙的情况。 若无墙,则同車的放置,把草方块当作禁止放車的方块即可,。 贴一下车的放置的代码: #include <b…

如何实现和调试REST API中的摘要认证(Digest Authentication)

如何实现和调试REST API中的摘要认证(Digest Authentication) 在保护REST API时,开发者通常会在多种认证机制之间进行选择,其中摘要认证(Digest Authentication)是一种常见的选择。本文探讨了使用摘要认证的原因,解释了其原理,提供了Java和Go语言的实现示例,并提供了测…

CF2068H. Statues

CF2068H. Statues 构造题. 思路 我们设 \(d_0 = a + b\) 是第 1 座雕像到第 \(n\) 座雕像的距离. 那么首先可以注意到两个必要条件:\(\displaystyle \sum_{i = 0}^{n - 1} d_i\) 为偶数. 对于 \(\forall i \in [0, n - 1]\), 都有 \(d_i \le d_0 + \dots + d_{i - 1} + d_{i + …

WEB攻防-机制验证篇重定向发送响应状态码跳过步骤验证码回传枚举

笔记: 验证码突破:回传的时候泄露了发送的验证码导致不需要知道目标的验证码是多少直接使用数据包里面的队列 规律爆破:就是常见的数字四位或者六位 10000 种可能在规定时间内爆破或者多次验证后网站不会出现新的验证码没有次数限制可以尝试爆破或者是汉字进行 重定向用户:通过…

Docker 安装 Redis 容器

1、下载Redis镜像下载指定版本的Redis镜像 (xxx指具体版本号) docker pull redis:xxx docker pull redis 下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis:latest ),我用5.0.5版本。docker pull redis:5.0.52、 检查当前所有Docker下载的镜像docker images