基于 OV2640 的图像采集显示系统(camera_init 摄像头初始化模块)

此部分可参考IIC系列文章:
(1)I2C 接口控制器理论讲解
(2)I2C接口控制设计与实现
(3)I2C连续读写实现


前言

本节将在实验“基于 DDR3 的串口传图帧缓存系统设计”实现一个图像采集显示应用系统,来设计 OV2640 应用系统中所需的基本应用逻辑电路。

提示:以下是本篇文章正文内容,下面案例可供参考

一、OV2640 摄像头初始化模块设计思路

所谓的 OV2640 摄像头初始化模块,其工作就是完成对 OV2640 中众多模式设置寄存器的写入操作。本质上就是使用 I2C 控制器将一些预先定义好的数据值写入到 OV2640 对应的寄存器中。所以我们完全可以使用之前设计好的 I2C 控制器加上一个存储好所有 OV2640 所需设置的寄存器参数的查找表,配合一定的控制逻辑实现,该设计实际比较简单。下图为我们设计的一个比较通用的 OV2640 初始化逻辑电路。
1
图 中 例 化 了 设 计 好 的 通 用 I2C 控 制 器 ( i2c_control )【参考文章最上方的i2c_control 文章】 和 一 个 ROM 查 找 表( camera_init_table ), 在 camera_init 顶 层 逻 辑 中 , 通 过 简 单 的 状 态 机 循 环 读 取camera_init_table 中的数据值并通过 i2c_control 即可写入到 OV2640 的各个寄存器中。

二、OV2640 摄像头初始化模块用法介绍

使用时,仅需在整个系统顶层例化的时候加入如下代码即可

camera_init
 #(
 .IMAGE_TYPE ( 0 ),// 0: RGB; 1: JPEG
 .IMAGE_WIDTH ( IMAGE_WIDTH ),// 图片宽度
 .IMAGE_HEIGHT( IMAGE_HEIGHT ),// 图片高度
 .IMAGE_FLIP ( 0 ),// 0: 不翻转,1: 上下翻转
 .IMAGE_MIRROR( 0 ) // 0: 不镜像,1: 左右镜像
 )camera_init
 (
 .Clk (loc_clk50m ),
 .Rst_p (g_rst_p ),
 .Init_Done (camera_init_done ),
 .camera_rst_n(camera_rst_n ),
 .camera_pwdn ( ),
 .i2c_sclk (camera_sclk ),
 .i2c_sdat (camera_sdat )
 );

在代码中,加入了几个参数定义,每个参数对应了 OV5640 使用时的一个常用模式。现就这几个模式参数分别介绍如下。
1
使用时,关于控制图像的类型、分辨率、翻转、镜像,可以通过修改#后面括号里面的对应内容。根据这些设置,camera_init.v 中通过条件编译的方式选择性的编译代码,从而达到通过参数设置不同工种模式的目的。整个条件编译主要分为两个分支,一个是图像类型为 RGB 类型的分支,另外一个是 JPEG 类型的分支。每个分支里面又根据不同的参数设置来控制图片的翻转和镜像,所以有四种组合,为了匹配四种模式,这里使用了 generate-if语句来实现。以下是部分代码:

generate
  ov5640///
  if(CAMERA_TYPE == "ov2640")
		  begin
					assign device_id = 8'h60;
					assign addr_mode = 1'b0;
					assign addr = {
   8'd0, lut[15:8]};
					assign wrdata = lut[7:0];

					if(IMAGE_TYPE == RGB) //------RGB------
								begin
								  assign lut_size = 185;

								  ov2640_init_table_rgb #(
									.IMAGE_WIDTH     (IMAGE_WIDTH     ),
									.IMAGE_HEIGHT    (IMAGE_HEIGHT    ),
									.IMAGE_FLIP_EN   (IMAGE_FLIP_EN   ),
									.IMAGE_MIRROR_EN (IMAGE_MIRROR_EN )
								  )ov2640_init_table_rgb_inst
								  (
									.addr (cnt ),
									.clk  (Clk ),
									.q    (lut )
								  );
								end
					else  //------JPEG------
								begin
								  assign lut_size = 250;

								  ov5640_init_table_jpeg #(
									.IMAGE_WIDTH     (IMAGE_WIDTH     ),
									.IMAGE_HEIGHT    (IMAGE_HEIGHT    ),
									.IMAGE_FLIP_EN   (IMAGE_FLIP_EN   ),
									.IMAGE_MIRROR_EN (IMAGE_MIRROR_EN )
								  )ov5640_init_table_jpeg_inst
								  (
									.addr (cnt ),
									.clk  (Clk ),
									.q    (lut )
								  );
								end
		   end
  ov7725
		  else if(CAMERA_TYPE == "ov7725")
				  begin
							assign device_id = 8'h42;
							assign addr_mode = 1'b0;
							assign addr = lut[15:8];
							assign wrdata = lut[7:0];

							if(IMAGE_TYPE == RGB) //------RGB------
									begin
									  assign lut_size  = 68;

									  ov7725_init_table_rgb #(
										.IMAGE_WIDTH     (IMAGE_WIDTH     ),
										.IMAGE_HEIGHT    (IMAGE_HEIGHT    ),
										.IMAGE_FLIP_EN   (IMAGE_FLIP_EN   ),
										.IMAGE_MIRROR_EN (IMAGE_MIRROR_EN )
									  )ov7725_init_table_rgb_inst
									  (
										.addr (cnt ),
										.clk  (Clk ),
										.q    (lut )
									  );
									end
				  end
  endgenerate



/













三、复位时序设计

设计合理的复位时序,有助于正确的让 OV2640 进入正常工作状态。复位时序在大家设计时经常不被关注,但是却经常直接导致了设计的不成功,所以这里介绍下 OV2640 的复位时序设计。
一般的器件都会在其 datasheet 中提供其上电和复位时序要求,OV2640 也不例外,下图为 OV2640 器件手册中提供的 OV5640 的上电复位时序图。

1

根据手册描述:
 PWDN 信号为掉电控制信号,当该引脚为高电平时整个图像传感器的模拟和数字部分都处于掉电不工作状态,为低电平时整个器件才可以开始工作;
 如果不希望控制 PWDN 信号,则该信号可以直接接到低电平;
 如果需要控制 PWDN 信号,则需要在上电至少 5ms 之后再拉低 PWDN。
 RESET 信号为复位信号,低电平复位。
 RESET 引脚必须在上电稳定后保持 t3(1ms)时间后才能变为高电平让整个系统开始工作。
 SCCB 接口工作需要在复位信号拉高 t4(20ms)时间之后才能开始工作
 XCLK 信号必须在 SCCB 接口正常工作之前 1ms 就就绪,换句话说,如果 XCLK 没有正常提供,OV5640 的 SCCB 接口也将无法正常的读写寄存器。

据此可以总结出对于 OV5640 的从上电到开始读写寄存器的一个基本的控制顺序:
1、 PWDN 和 RESET 都为低电平。
2、 等待 PWDN
3、 等待至少 1ms 的时间,此期间 RESET 一直为低电平,然后拉高 RESET 信号
4、 RESET 拉高之后,再等待至少 20ms 的时间
5、 开始通过 SCCB 读写 OV5640 的寄存器
6、 XVCLK 提前操作 SCCB 的 1ms 时间一般都能满足,所以一般情况下可以不用关心。

在实际设计时,只需要使用一个计数器即可实现。以下为 camera_init 代码中设计的复位时序的相关代码。

//-------------------------------------------------------------------------------------------------------------------
  //上电并复位完成 20ms 后再配置摄像头,这里为了优化逻辑,直接使延迟比较值为 21'h1007ff,大约21.012460ms
  //上电到摄像头复位时间为1ms ,这里为简便设置为20'h00C400,为1.003520ms
  wire Go;   //initial enable
	reg [20:0] delay_cnt;
	always @ (posedge Clk or negedge Rst_n)
	if (!Rst_n)
		delay_cnt <= 20'd0;
	else if (delay_cnt == 21'h100800)
		delay_cnt <= delay_cnt;
	else
		delay_cnt <= delay_cnt + 1'd1;
	
	assign Go = (delay_cnt == 21'h1007ff) ? 1'b1 : 1'b0;
	assign camera_rst_n = (delay_cnt > 21'h00C400);
//-------------------------------------------------------------------------------------------------------------------

四、数据写入操作

/-------------------------------------------------------------------------------------------------------------------
//状态机产生wrreg_req、与延时i2c_dly_cnt_max信号

  reg [1:0]state;

  always@(posedge Clk or negedge Rst_n)
  if(~Rst_n)begin
    state <= 0;
    wrreg_req <= 1'b0;
    i2c_dly_cnt_max <= 32'd0;
  end
  else if(cnt < lut_size)begin
    case(state)
      0:
        if(Go)
          state <= 1;
        else
          state <= 0;
      1:
    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
题目中提到了iic控制和TM1650,可以看出是要回答关于TM1650的I2C控制方法。 TM1650是一种常见的数字管驱动芯片,广泛应用于数码管显示等设备中。它通过I2C总线进行控制,即通过I2C协议来发送命令和数据来操作TM1650。 I2C(Inter-Integrated Circuit)是一种串行总线标准,可以实现多个设备之间的数据传输和通信。在使用I2C控制TM1650之前,我们首先需要确保系统中有I2C控制器与TM1650相连。 I2C通信主要涉及两根线:SCL(时钟线)和SDA(数据线)。首先,主控制器通过SCL线发送一串脉冲信号来确定通信时钟频率,而SDA线上的信号则用于传输数据和命令。 具体控制TM1650的步骤如下: 1. 启动信号:主控制器向SDA线发送一个低电平(0)的信号,同时保持SCL线为高电平(1)。这个低电平的信号表示启动一个通信过程的开始。 2. 设备地址:主控制器在SCL线保持高电平(1)的同时,按照I2C协议要求,向SDA线发送TM1650的设备地址。设备地址一般由芯片厂商预设,可以在TM1650的数据手册中找到。 3. 方向指令:主控制器会发送一个位,用以指示接下来的操作是写入数据(0)还是读取数据(1)。 4. 数据传输:根据方向指令,主控制器通过SCL和SDA线传输相应的命令和数据。具体的命令和数据可以根据TM1650的数据手册来确定。 5. 停止信号:主控制器向SDA线发送一个高电平(1)的信号,同时保持SCL线为高电平(1)。这个高电平的信号表示通信过程结束。 通过以上步骤,就可以通过I2C控制TM1650进行各种操作,例如显示数字、调节亮度等。 需要注意的是,具体的I2C控制细节还需参考TM1650的数据手册来进行调试和实现。此外,I2C控制TM1650还需要在相关的开发环境中编写相应的代码来完成控制操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C.V-Pupil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值