SCCB(Serial Camera Control Bus,串行摄像头控制总线)是由OV(OmniVision的简称)公司定义和发展的三线式串行总线,该总线控制着摄像头大部分的功能,包括图像数据格式、分辨率以及图像处理参数等。结构框图如下所示:
OV公司为了减少传感器引脚的封装,现在SCCB总线大多采用两线式接口总线。OV7725使用的是两线式接口总线,该接口总线包括SIO_C串行时钟输入线和SIO_D串行双向数据线,分别相当于IIC协议的SCL信号线和SDA信号线。SIO_C的最小时间为10us,即最大频率为100K。一般来说,100K-400K之间都可以。
由此可见,SCCB就是改编版的IIC,完全可以按照IIC来理解,下面仔细讲解SCCB的时序以及和IIC的不同之处。
一、SCCB起始和结束(与IIC完全一致)
起始:SIO_C为高时,SIO_D由高拉低。
停止:SIO_C为高时,SIO_D由低拉高。
二、SCCB写(与IIC完全一致)
ID Address(W)里面就已经包括进了IIC中的“读写控制位”,所以没有额外写出。
即:start + phase_1 + phase_2 + phase_3 + stop
“X”的意思是“don't care”,该位是由从机发出应答信号来响应主机表示当前ID Address、Sub-address和Write Data是否传输完成,但是从机有可能不发出应答信号,因此主机(此处指FPGA)可不用判断此处是否有应答,直接默认当前传输完成即可。“X”即IIC中的ACK应答位。
三、SCCB读
数据手册中的SCCB读只写了上图的Phase3和Phase4,实际上它是和Phase1和Phase2联系在一起的。SCCB不支持连续读,Phase4的主机应答位必须为NA(no ack),即为1,所以SCCB读其实就专指单次读,和IIC单次读几乎一样。
区别就一点:在IIC读传输协议中,写完寄存器地址后会有restart即重复开始的操作;而SCCB读传输协议中没有重复开始的概念,在写完寄存器地址后,需发起总线停止信号。
即:start_1 + phase_1 + phase_2 + stop_1 + start_2 + phase_3 + phase_4 + stop_2
四、SCCB和IIC的区别
1.SCCB的应答位称为X,表示“don't care”,而IIC应答位称为ACK。
2.SCCB只能单次读,而IIC除了单次读还支持连续读。
3.SCCB读操作中间有stop,而IIC读操作中间可以有stop也可以不需要stop,具体表现如下
SCCB读:start_1 + phase_1 + phase_2 + stop_1 + start_2 + phase_3 + phase_4 + stop_2 IIC读:start_1 + phase_1 + phase_2 + + start_2 + phase_3 + phase_4 + stop_2
除去上面三点,SCCB和IIC再无区别,因此如果只需要配置寄存器(只用到写),可以直接拿IIC的时序来当做SCCB用,如果需要读,读操作中间必须有一个stop。
五、SCCB控制器Verilog代码
1 //************************************************************************** 2 // *** 名称 : sccb.v 3 // *** 作者 : xianyu_FPGA 4 // *** 博客 : https://www.cnblogs.com/xianyufpga/ 5 // *** 日期 : 2019-08-10 6 // *** 描述 : SCCB控制器,只支持写 7 //************************************************************************** 8 9 module sccb 10 //========================< 参数 >========================================== 11 #( 12 parameter DEVICE_ID = 8'b01010000 , //器件ID 13 parameter CLK = 26'd50_000_000 , //本模块的时钟频率 14 parameter SCL = 18'd250_000 //输出的SCL时钟频率 15 ) 16 //========================< 端口 >========================================== 17 ( 18 input clk , //时钟 19 input rst_n , //复位,低电平有效 20 //SCCB control -------------------------------------- 21 input sccb_en , //SCCB触发信号 22 input addr16_en , //16位地址使能 23 input addr8_en , //8位地址使能 24 //SCCB input ---------------------------------------- 25 input [15:0] sccb_addr , //SCCB器件内地址 26 input [ 7:0] sccb_data , //SCCB要写的数据 27 //SCCB output --------------------------------------- 28 output reg sccb_done , //SCCB一次操作完成 29 output reg sccb_scl , //SCCB的SCL时钟信号 30 inout sccb_sda , //SCCB的SDA数据信号 31 //dri_clk ------------------------------------------- 32 output reg sccb_dri_clk //驱动SCCB操作的驱动时钟,1Mhz 33 ); 34 //========================< 状态机参数 >==================================== 35 localparam IDLE = 6'b00_0001 ; //空闲状态 36 localparam DEVICE = 6'b00_0010 ; //写器件地址 37 localparam ADDR_16 = 6'b00_0100 ; //写字地址高8位 38 localparam ADDR_8 = 6'b00_1000 ; //写字地址低8位 39 localparam DATA = 6'b01_0000 ; //写数据 40 localparam STOP = 6'b10_0000 ; //结束 41 //========================< 信号 >========================================== 42 reg sda_dir ; //SCCB数据(SDA)方向控制 43 reg sda_out ; //SDA输出信号 44 reg state_done ; //状态结束 45 reg [ 6:0] cnt ; //计数 46 reg [ 7:0] state_c ; //状态机当前状态 47 reg [ 7:0] state_n ; //状态机下一状态 48 reg [15:0] sccb_addr_t ; //地址寄存 49 reg [ 7:0] sccb_data_t ; //数据寄存 50 reg [ 9:0] clk_cnt ; //分频时钟计数 51 wire [ 8:0] clk_divide ; //模块驱动时钟的分频系数 52 53 //========================================================================== 54 //== sda控制 55 //========================================================================== 56 assign sccb_sda = sda_dir ? sda_out : 1'bz; //SDA数据输出或高阻 57 58 //========================================================================== 59 //== 生成SCL的4倍时钟来驱动后面SCCB的操作,生成1Mhz的sccb_dri_clk 60 //========================================================================== 61 assign clk_divide = (CLK/SCL) >> 3; // >>3即除以8 62 63 always @(posedge clk or negedge rst_n) begin 64 if(!rst_n) begin 65 sccb_dri_clk关注打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?