您当前的位置: 首页 > 
  • 1浏览

    0关注

    483博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

协议——SCCB与IIC的区别

高精度计算机视觉 发布时间:2021-03-16 18:17:31 ,浏览量:1

  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             
关注
打赏
1661664439
查看更多评论
立即登录/注册

微信扫码登录

5.6478s