SCCB协议介绍与应用和OV7670摄像头的寄存器配置
SCCB协议简介:
以OV7670的配置传输为例
OV770中,8‘h42是写操作ID,8’h43是读地址
从数据传输时序可以看出,其传输的顺序是: 开始位,数据[7:0] ,X位,其中X位为任意,手册中给出的解释是don’t care
开始传输时序:
SIO_D在SIO_C为高时由高到低表示开始传输。
即: SIO_C == 1 时,检测到SIO_D的下降沿就表示数据开始传输。
当SIO_C == 1时,检测到SIO_D的上升沿表示结束位,即停止传输。
**
SCCB的三相写数据传输:
**
其中第一相,包括了7位ID地址、R/W选择位和X位。 //8’h42 写操作地址(OV7670)
第二项:要写的寄存器地址+X位
第三项:要写的数据+X位
写操作:三个阶段构成传输的写,每个阶段都为9位
即写操作有: start + ID地址(地址位42)+ 寄存器地址 + 数据 + stop
SCCB的读操作:
根据数据手册可知,读操作分为两个阶段完成
此阶段的目的是识别特定从设备的子地址,主设备从该子地址读取数据。
ID地址(8位ID地址+1位读写控制+don’t care)+ FPGA要向从机写入即将要读的寄存器地址(8位寄存器地址+don’t care)
FPGA作为主机,在写入要读的寄存器地址后,从机(即OV7670)根据FPGA要读的地址将数据送给主机(FPGA).
ID地址(8位ID地址+1位读写控制+don’t care) +从机向FPGA发送被指定寄存器里面的数据的数据(8位数据+NA)
所以,写操作整体流程是:
起始位+ ID地址(42)+ 寄存器地址 +停止位+起始位+ID地址(43)+ 数据 + 结束位
SCCB协议有两线也有三线,两线为SIO_C与SIO_D,三线为SIO_E、SIO_C与SIO_D。
关于寄存器的调试步骤:
先读一个寄存器,确认读功能正确 -----> 写一个寄存器然后读出来,确认写功能正确-----> 所有寄存器写一个读一个,确保所有都正确--------> 全部致谢,快速进行配置。
首先,需要产生SCCB的时序,因为三相传输的数据一共有 1个起始位 +7ID+R/W+X + 8子地址+X+8写数据+X+结束位(0,1) = 30,故命名数组out_data作为三相和两相的拼接数组。
摄像头输入时钟为25MHz,而SCCB的SIO_C最高时钟频率是400KHz(注意:一般的器件,都是限制高速,而不会限制低速。速度越低,越容易满足时序参数要求。在调试时,尽量将速度放低,尽可能减少出错的可能。等数据调通后,再提高速度。)而本次使用的SIO_C频率为208KHz.
使用三个计数器分别计数一个SIO_C周期: (1s/208KHz) / (1s/25MHz) = 120
第二个计数 共有多少位SIO_D,根据读写的不同分别为30和21;
第三个计数器计数传输多少段,因为SCCB的读阶段是先由主机写子地址给从机,从机再去相应的地址将数据读出给主机,所以此处为2段。
计数器代码为:
parameter SIO_C = 120 ; always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginflag_add <= 1'b0;endelse if(ren || wen)begin //有读使能或者写使能到来flag_add <= 1'b1;endelse if(end_count_duan)begin //传输完一整个读操作或者写操作flag_add <= 1'b0;endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begincount_sck <= 0;endelse if(add_count_sck)beginif(end_count_sck)begincount_sck <= 0;endelse begincount_sck <= count_sck + 1;endendendassign add_count_sck = flag_add;assign end_count_sck = add_count_sck && count_sck == SIO_C-1;//位传输计数器,由于写和读位数不同,所以此处采用变量法//bit_num+2表示所要计数的总位数 always @(posedge clk or negedge rst_n)begin if(!rst_n)begincount_bit <= 0;endelse if(add_count_bit)beginif(end_count_bit)count_bit <= 0;elsecount_bit <= count_bit + 1;endendassign add_count_bit = end_count_sck;assign end_count_bit = add_count_bit && count_bit == bit_num + 2 -1 ;//由于写操作是三相零段,所以当 add_count_duan && count_duan == 1-1时结束计数
//写操作时:add_count_duan && count_duan == 1-1 为写操作
//写操作时:add_count_duan && count_duan == 2-1 为读操作
//使用变量来指示该计多少个数always @(posedge clk or negedge rst_n)beginif(!rst_n)begincount_duan <= 0;endelse if(add_count_duan)beginif(end_count_duan)count_duan <= 0;elsecount_duan <= count_duan + 1;endendassign add_count_duan = end_count_bit;assign end_count_duan = add_count_duan && count_duan== section_num-1;//由于需要区分是写还是读,此处使用一个选择信号flag_sel//flag_sel == 1,表示是读状态//flag_sel == 2,表示是写状态always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginflag_sel <= 0;endelse if(ren)beginflag_sel <= 1;endelse if(wen)beginflag_sel <= 2;endelse if(end_count_duan)beginflag_sel <= 0;endendalways @(*)beginif(flag_sel==1)beginbit_num = 21; //读操作,两段两相section_num = 2 ;endelse if(flag_sel==2)beginbit_num = 30; //写操作,一段三相 section_num= 1 ;endelse begin bit_num = 1;section_num = 1;endend
SCCB时序的产生:
上面计数器只是计数了周期数,对于SIO_C什么时候拉高拉低并无设计,占空比等也没有设计,此处对其进行约束。
always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginsio_c <= 1'b1;endelse if(sio_c_h2l)beginsio_c <= 1'b0;endelse if(sio_c_l2h)beginsio_c <= 1'b1;end
end
//复位后若无拉高条件则SIO_C一直为高
assign sio_c_h2l = count_bit >=0 && count_bit <(bit_num - 2) && add_count_sck && count_sck == SIO_C-1;//后面2bit不是数据传输过程,是结束位变化,此时SIO_C拉高,SIO_D在SIO_C为高期间由低变高表示结束位
assign sio_c_l2h = count_bit >=1 && count_bit < bit_num && add_count_sck && count_sck == SIO_C/2 -1; //占空比50%,数据传输时使能
SIO_D数据的传输及本模块空闲信号设计
always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginsio_d_w <= 1;endelse if(out_data_time)beginsio_d_w <= out_data[30-count_bit-1];end
end
//在SIO_C为低时且在其低位中部采样数据,以保证在SIO_C为高时数据稳定
assign out_data_time = count_bit >= 0 && count_bit < bit_num && add_count_sck && count_sck == ((SIO_C/4) -1) ;//有读或写使能以及数据在传输时,表示SCCB总线处理被占用
//rdy == 1表示SCCB空闲,可以处理新的数据
always @(*)beginif(ren || wen || flag_sel != 0)beginrdy = 0;endelse beginrdy = 1;end
end//另设信号en_sio_d_w表示写操作 即无论是读还是写,写的部分都为其表示
//只有在读操作中的第二段第二相,向主机发送数据才读,故此阶段该信号拉低
//当执行完一个完整的读或者写操作时将其清零,该信号并不是必须只是本人设计需要,读者可自行改动//en_sio_d_walways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginen_sio_d_w <= 1'b0;endelse if(wen || ren)beginen_sio_d_w <= 1'b1;endelse if(end_count_duan)beginen_sio_d_w <= 1'b0;endelse if(en_sio_d_w_h2l)beginen_sio_d_w <= 1'b0;endelse if(en_sio_d_w_l2h)beginen_sio_d_w <= 1'b1;endendassign en_sio_d_w_h2l = flag_sel == 1 && count_duan == 1 && count_bit==10 && add_count_sck && count_sck==1-1;
assign en_sio_d_w_l2h = flag_sel == 1 && count_duan == 1 && count_bit==18 && add_count_sck && count_sck==1-1;
数据传输,使用数组out_data[29:0]来寄存传输总线上的信号。
写数据期间: 起始位,8‘h42,1’h1(X位),子地址,X位,要写的数据,X位,1‘b0,1’b1(结束位)
故
out_data = {1'h0,8'h42,1'h1,sub_addr,1'h1,wdata,1'h1,1'h0,1'h1};//sub_addr是SCCB总线上传输的数据,wdata是要写的数据
读数据期间:
第一段 : out_data = {1’h0,8’h42,1’h1,sub_addr,1’h1,1’h0,1’h1,9’h0};//后面9位并不会输出,只是为了对齐数据
第二段: out_data = {1’h0,8’h43,1’h1,sub_addr,1’h1,1’h0,1’h1,9’h0};
对比发现,可以整合为
assign rd_com = (count_duan==0 && flag_sel==1) ? 8'h42:8'h43;out_data = {1'h0,rd_com,1'h1,sub_addr,1'h1,1'h0,1'h1,9'h0};
所以发送数据的代码为:
always @(*)beginif(flag_sel==1)beginout_data <= {1'h0,rd_com,1'h1,sub_addr,1'h1,1'h0,1'h1,9'h0};//start,8'h42 or 8'h43 ,x,sub_addr or rdata <= sio_d_r ,x,end(0,1) ,interval(2'b11)endelse if(flag_sel==2)beginout_data <= {1'h0,8'h42,1'h1,sub_addr,1'h1,wdata,1'h1,1'h0,1'h1};endelse beginout_data <= 0;endendassign rd_com = (count_duan==0 && flag_sel==1)? 8'h42 : 8'h43; //8'h42 is write enable | 8'h43 is read enable
OV7670寄存器配置
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 21:12:08 12/04/2018
// Design Name:
// Module Name: ov7670_config
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module ov7670_config(input clk , //25MHzinput rst_n ,input config_en , //开始配置使能input rdy , //上层模块空闲使能input [7:0] rdata , //SCCB输出的数据 本模块暂未使用,读者可以注释掉input rdata_vld , //输出数据有效信号 本模块暂未使用,读者可以注释掉output reg [7:0] wdata , output reg [7:0] addr ,output reg wr_en ,output reg rd_en ,output reg cmos_en , //output pwdn );parameter DATA_WIDTH = 8 ;parameter RW_NUM = 2 ;reg [DATA_WIDTH:0] reg_cnt ; reg [1:0] rw_cnt ;reg flag_add ;wire add_reg_cnt ;wire end_reg_cnt ;wire add_rw_cnt ;wire end_rw_cnt ;reg [17:0] add_wdata ;assign pwdn = 0;`include "ov7670_para.v" //载入配置 该程序中包含了对OV7670的配置,程序在下文always @(posedge clk or negedge rst_n)beginif(!rst_n)beginrw_cnt <= 0;endelse if(add_rw_cnt)beginif(end_rw_cnt)rw_cnt <= 0;elserw_cnt <= rw_cnt + 1;endendassign add_rw_cnt = flag_add && rdy ;assign end_rw_cnt = add_rw_cnt && rw_cnt==RW_NUM-1 ;always @(posedge clk or negedge rst_n)begin if(!rst_n)beginreg_cnt <= 0;endelse if(add_reg_cnt)beginif(end_reg_cnt)reg_cnt <= 0;elsereg_cnt <= reg_cnt + 1;endendassign add_reg_cnt = end_rw_cnt;assign end_reg_cnt = add_reg_cnt && reg_cnt== REG_NUM - 1;always @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginflag_add <= 1'b0;endelse if(config_en)beginflag_add <= 1'b1;endelse if(end_reg_cnt)beginflag_add <= 1'b0;endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginwdata <= 0;endelse beginwdata <= add_wdata[7:0];endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginaddr <= 0;endelse beginaddr <= add_wdata[15:8];endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginwr_en <= 1'b0;endelse if(add_rw_cnt && rw_cnt==1-1 && add_wdata[16])beginwr_en <= 1'b1;endelse beginwr_en <= 1'b0;endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)beginrd_en <= 1'b0;endelse if(add_rw_cnt && rw_cnt==2-1 && add_wdata[17])beginrd_en <= 1'b1;endelse beginrd_en <= 1'b0;endendalways @(posedge clk or negedge rst_n)beginif(rst_n==1'b0)begincmos_en <= 1'b0;end else if(end_reg_cnt)begincmos_en <= 1'b1;endendendmodule
配置程序
具体的配置问题请参考器件手册《OV7670 Software Application Note》
parameter REG_NUM = 165;
always@(*) begincase(reg_cnt)0 : add_wdata = {2'b11,16'h1204};//复位,VGA,RGB565 (00:YUV,04:RGB)(8x全局复位)1 : add_wdata = {2'b11,16'h40d0}; //RGB565, 00-FF(d0)(YUV下要攱-FE(80))2 : add_wdata = {2'b11,16'h3a04}; //TSLB(TSLB[3], COM13[0])00:YUYV, 01:YVYU, 10:UYVY(CbYCrY), 11:VYUY3 : add_wdata = {2'b11,16'h3dc8}; //COM13(TSLB[3], COM13[0])00:YUYV, 01:YVYU, 10:UYVY(CbYCrY), 11:VYUY4 : add_wdata = {2'b11,16'h1e31}; //默认01,Bit[5]水平镜像,Bit[4]竖直镜像5 : add_wdata = {2'b11,16'h6b00}; //旁路PLL倍频ク0A:关闭内部LDOク00:打开LDO6 : add_wdata = {2'b11,16'h32b6}; //HREF 控制(80)7 : add_wdata = {2'b11,16'h1713}; //HSTART 输出格式-行频开始高8位8 : add_wdata = {2'b11,16'h1801}; //HSTOP 输出格式-行频结束9 : add_wdata = {2'b11,16'h1902}; //VSTART 输出格式-场频开始高8位10 : add_wdata = {2'b11,16'h1a7a}; //VSTOP 输出格式-场频结束11 : add_wdata = {2'b11,16'h030a}; //VREF 帧竖直方向控到0)12 : add_wdata = {2'b11,16'h0c00}; //DCW使能 禁止(00)13 : add_wdata = {2'b11,16'h3e10}; //PCLK分频00 Normal 14 : add_wdata = {2'b11,16'h7000}; //00:Normal, 80:移位1, 00:彩条, 80:渐变彩条15 : add_wdata = {2'b11,16'h7100}; //00:Normal, 00:移位1, 80:彩条, 80:渐变彩杊 16 : add_wdata = {2'b11,16'h7211}; //默认 水平,垂直采样(11) 17 : add_wdata = {2'b11,16'h7300}; //DSP缩放时钟分频00 18 : add_wdata = {2'b11,16'ha202}; //默认 像素始终延迟 (02)19 : add_wdata = {2'b11,16'h1180}; //内部工作时钟设置,直接使用外部时钟源(80)20 : add_wdata = {2'b11,16'h7a20};21 : add_wdata = {2'b11,16'h7b1c};22 : add_wdata = {2'b11,16'h7c28};23 : add_wdata = {2'b11,16'h7d3c};24 : add_wdata = {2'b11,16'h7e55};25 : add_wdata = {2'b11,16'h7f68};26 : add_wdata = {2'b11,16'h8076};27 : add_wdata = {2'b11,16'h8180};28 : add_wdata = {2'b11,16'h8288};29 : add_wdata = {2'b11,16'h838f};30 : add_wdata = {2'b11,16'h8496};31 : add_wdata = {2'b11,16'h85a3};32 : add_wdata = {2'b11,16'h86af};33 : add_wdata = {2'b11,16'h87c4};34 : add_wdata = {2'b11,16'h88d7};35 : add_wdata = {2'b11,16'h89e8};36 : add_wdata = {2'b11,16'h13e0};37 : add_wdata = {2'b11,16'h0010};//38 : add_wdata = {2'b11,16'h1000};39 : add_wdata = {2'b11,16'h0d00};40 : add_wdata = {2'b11,16'h1428}; 41 : add_wdata = {2'b11,16'ha505};42 : add_wdata = {2'b11,16'hab07};43 : add_wdata = {2'b11,16'h2475};44 : add_wdata = {2'b11,16'h2563};45 : add_wdata = {2'b11,16'h26a5};46 : add_wdata = {2'b11,16'h9f78};47 : add_wdata = {2'b11,16'ha068};48 : add_wdata = {2'b11,16'ha103};49 : add_wdata = {2'b11,16'ha6df};50 : add_wdata = {2'b11,16'ha7df};51 : add_wdata = {2'b11,16'ha8f0};52 : add_wdata = {2'b11,16'ha990};53 : add_wdata = {2'b11,16'haa94};54 : add_wdata = {2'b11,16'h13ef}; 55 : add_wdata = {2'b11,16'h0e61};56 : add_wdata = {2'b11,16'h0f4b};57 : add_wdata = {2'b11,16'h1602};58 : add_wdata = {2'b11,16'h2102};59 : add_wdata = {2'b11,16'h2291};60 : add_wdata = {2'b11,16'h2907};61 : add_wdata = {2'b11,16'h330b};62 : add_wdata = {2'b11,16'h350b};63 : add_wdata = {2'b11,16'h371d};64 : add_wdata = {2'b11,16'h3871};65 : add_wdata = {2'b11,16'h392a};66 : add_wdata = {2'b11,16'h3c78};67 : add_wdata = {2'b11,16'h4d40};68 : add_wdata = {2'b11,16'h4e20};69 : add_wdata = {2'b11,16'h6900};70 : add_wdata = {2'b11,16'h7419};71 : add_wdata = {2'b11,16'h8d4f};72 : add_wdata = {2'b11,16'h8e00};73 : add_wdata = {2'b11,16'h8f00};74 : add_wdata = {2'b11,16'h9000};75 : add_wdata = {2'b11,16'h9100};76 : add_wdata = {2'b11,16'h9200};77 : add_wdata = {2'b11,16'h9600};78 : add_wdata = {2'b11,16'h9a80};79 : add_wdata = {2'b11,16'hb084};80 : add_wdata = {2'b11,16'hb10c};81 : add_wdata = {2'b11,16'hb20e};82 : add_wdata = {2'b11,16'hb382};83 : add_wdata = {2'b11,16'hb80a};84 : add_wdata = {2'b11,16'h4314};85 : add_wdata = {2'b11,16'h44f0};86 : add_wdata = {2'b11,16'h4534};87 : add_wdata = {2'b11,16'h4658};88 : add_wdata = {2'b11,16'h4728};89 : add_wdata = {2'b11,16'h483a};90 : add_wdata = {2'b11,16'h5988};91 : add_wdata = {2'b11,16'h5a88};92 : add_wdata = {2'b11,16'h5b44};93 : add_wdata = {2'b11,16'h5c67};94 : add_wdata = {2'b11,16'h5d49};95 : add_wdata = {2'b11,16'h5e0e};96 : add_wdata = {2'b11,16'h6404};97 : add_wdata = {2'b11,16'h6520};98 : add_wdata = {2'b11,16'h6605};99 : add_wdata = {2'b11,16'h9404};100 : add_wdata = {2'b11,16'h9508};101 : add_wdata = {2'b11,16'h6c0a};102 : add_wdata = {2'b11,16'h6d55};103 : add_wdata = {2'b11,16'h6e11};104 : add_wdata = {2'b11,16'h6f9f};105 : add_wdata = {2'b11,16'h6a40};106 : add_wdata = {2'b11,16'h0140};107 : add_wdata = {2'b11,16'h0240};108 : add_wdata = {2'b11,16'h13e7};109 : add_wdata = {2'b11,16'h1500};110 : add_wdata = {2'b11,16'h4f80};111 : add_wdata = {2'b11,16'h5080};112 : add_wdata = {2'b11,16'h5100};113 : add_wdata = {2'b11,16'h5222};114 : add_wdata = {2'b11,16'h535e};115 : add_wdata = {2'b11,16'h5480};116 : add_wdata = {2'b11,16'h589e};117 : add_wdata = {2'b11,16'h4108};118 : add_wdata = {2'b11,16'h3f00};119 : add_wdata = {2'b11,16'h7505};120 : add_wdata = {2'b11,16'h76e1};121 : add_wdata = {2'b11,16'h4c00};122 : add_wdata = {2'b11,16'h7701};123 : add_wdata = {2'b11,16'h4b09};124 : add_wdata = {2'b11,16'hc9F0};//16'hc960;125 : add_wdata = {2'b11,16'h4138};126 : add_wdata = {2'b11,16'h5640};127 : add_wdata = {2'b11,16'h3411};128 : add_wdata = {2'b11,16'h3b02};129 : add_wdata = {2'b11,16'ha489};130 : add_wdata = {2'b11,16'h9600};131 : add_wdata = {2'b11,16'h9730};132 : add_wdata = {2'b11,16'h9820};133 : add_wdata = {2'b11,16'h9930};134 : add_wdata = {2'b11,16'h9a84};135 : add_wdata = {2'b11,16'h9b29};136 : add_wdata = {2'b11,16'h9c03};137 : add_wdata = {2'b11,16'h9d4c};138 : add_wdata = {2'b11,16'h9e3f};139 : add_wdata = {2'b11,16'h7804};140 :add_wdata = {2'b11,16'h7901};141 :add_wdata = {2'b11,16'hc8f0};142 :add_wdata = {2'b11,16'h790f};143 :add_wdata = {2'b11,16'hc800};144 :add_wdata = {2'b11,16'h7910};145 :add_wdata = {2'b11,16'hc87e};146 :add_wdata = {2'b11,16'h790a};147 :add_wdata = {2'b11,16'hc880};148 :add_wdata = {2'b11,16'h790b};149 :add_wdata = {2'b11,16'hc801};150 :add_wdata = {2'b11,16'h790c};151 :add_wdata = {2'b11,16'hc80f};152 :add_wdata = {2'b11,16'h790d};153 :add_wdata = {2'b11,16'hc820};154 :add_wdata = {2'b11,16'h7909};155 :add_wdata = {2'b11,16'hc880};156 :add_wdata = {2'b11,16'h7902};157 :add_wdata = {2'b11,16'hc8c0};158 :add_wdata = {2'b11,16'h7903};159 :add_wdata = {2'b11,16'hc840};160 :add_wdata = {2'b11,16'h7905};161 :add_wdata = {2'b11,16'hc830}; 162 :add_wdata = {2'b11,16'h7926};163 : add_wdata = {2'b11,16'h0903};164 : add_wdata = {2'b11,16'h3b42};default : add_wdata = 0;endcaseend
//产生时序时,除了readdata外,都要打开三态门。而在空闲时刻,要注意将三态门关闭。
即写操作的全部阶段,读操作的第一阶段和第二阶段的第一相打开,在空闲和读操作的第二阶段关闭。
SCCB协议介绍与应用和OV7670摄像头的寄存器配置相关推荐
- FPGA学习日志——OV7670寄存器配置
FPGA学习日志 鼓励自己每天进行学习总结:2021.2.6 找到了ov7670寄存器的配置具体介绍 转载自: OV7670配置和调试总结--浩爹 SCCB协议介绍与应用和OV7670摄像头的寄存器配 ...
- 再议IIC协议与设计【3】 --SCCB总线介绍
SCCB (Serial Camera Control Bus) 是由OmniVision公司所定义的串行相机控制总线.用于控制OmniVision公司生产的Camera Sensor.本文通过对SC ...
- 软件SCCB协议学习笔记
一.SCCB协议简介 SCCB协议是OV公司公布的摄像头用的串行总线协议,相当于一个简易的I2C协议.本文写作意图在于记录使用软件SCCB驱动OV7670模块的配置方法. 二.SCCB协议时序简介(二 ...
- 总:基于FPGA的OV7670摄像头显示
目录 前言: 一.整体系统设计 二.各部分模块设计 1.时钟模块 2.OV7670初始化模块 3.DVP协议数据流模块 4.写FIFO模块 5.读FIFO模块 6.写FIFO控制模块 7.读FIFO控 ...
- 基于FPGA OV7670摄像头初始化配置
目录 一.OV7670摄像头简介 二.ov7670 SCCB协议简介 三.OV7670初始化寄存器配置 四.OV7670初始化代码编写 1.初始化过程 2.RTL设计 五.仿真测试 一.OV7670摄 ...
- FPGA利用SCCB协议配置OV5640摄像头
FPGA利用SCCB协议配置OV5640摄像头 为什么要配置摄像头 配置代码 测试代码 总结 为什么要配置摄像头 OV5640摄像头有许多工作模式,如可以工作在1080P,720P,480P分辨率的情 ...
- OV7670 FIFO 30W摄像头介绍(四) --- OV7670上位机验证驱动
在介绍OV7670之前先附上模块链接:点击购买OV7670摄像头模块 介绍代码前,首先来看之前写的文章: OV7670 FIFO 30W摄像头介绍(一) - 整体介绍/SCCB时序 OV7670 FI ...
- 【OV7670】基于FPGA的OV7670摄像头介绍和使用
1.软件版本 quartusii12.1 2.本算法理论知识 OV7670摄像头模块 带384Kb FIFO 数字摄像头 手动变焦 OV7670总共有656*488个像素,其中640*480个有效 ...
- OV7670 摄像头模块介绍
OV7670摄像头模块简介 OV7670是OV(OmniVision)公司生产的一颗1/6寸的CMOSVGA图像传感器.该传感器体积小.工作电压低,提供单片VGA摄像头和影像处理器的所有功能.通过SC ...
最新文章
- 去除源文件中的重复行的程序流程及其C代码实现
- 4 weekend110的hdfs下载数据源码跟踪铺垫 + hdfs下载数据源码分析-getFileSystem(值得反复推敲和打断点源码)...
- Javascript、Dom、JQuery
- STL源码剖析 序列式容器 deque双端队列
- Cesium专栏-卫星轨迹
- java的getshape(),Java RectangularShape.getMaxX方法代码示例
- 微软“杀”不死的数据库软件
- 程序员面试金典——5.6奇偶位交换
- AcWing 897. 最长公共子序列(LCS朴素版)
- FOSCommentBundle功能包:添加Symfony2内建的ACL安全
- vc 编译的那些事儿 - wowolook的专栏 - CSDN博客
- 微信推送早安教程(一)
- 在线latex 网址
- (论文笔记)NeRV: Neural Representations for Videos
- dnf剑魂buff等级上限_DNF:剑魂最强武器,比星之海伤害更高,无神话红10都能8000亿...
- 小米无线键盘的连接方式
- pytracking的kys报错spatial_correlation_sampler_backend.cpython-37m-x86_64-linux-gnu.so: undefined symbo
- vue后台管理知识点、难点总结01
- 重整网站。。。。。。。。。
- Java super语句
热门文章
- windows10服务器运行失败,win10遇到服务器启动失败 80端口被占用如何解决
- 【cdq分治】cdq分治与整体二分学习笔记Part2.cdq分治
- spark master web ui 端口8080被占用解决方法
- (数据库-MySQL)查看表的结构、表的创建过程、表
- Auto Control 001 自动控制原理 自动控制的一般概念
- 抱怨,是对自己无能的愤慨
- 二维点云拉普拉斯深度平滑算法-matlab
- 算法设计与分析基础知识点
- 关于影视剪辑中的pr软件你了解多少?
- java 年轻代算法_java内存模型 年轻代/年老代 持久区,jvm中的年轻代 老年代 持久代 gc...