SCCB協議


SCCB(OmniVision serial camera control bus),即串行攝像機控制總線。OmniVision 公司已經定義和

采納的SCCB總線是一種三線結構的串行總線,用於完成對絕大多數OmniVision 系列圖像傳芯片功能的控制。

在簡化的引腳封裝中,SCCB總線可以工作在改進的兩線工作方式下。

兩線SCCB接口有兩條通迅連接線,即SIO_D(數據線)和 SIO_C(時鍾線),下面是雙總線功能原理圖:

在雙總線情況下,要求主控機有以下兩種功能之一來支持SCCB通迅:

1、主控器件支持並能保持數據在三態模式;

2、如果不支持三態,

 

二、管腳功能

主控器件管腳描述

從控器件管腳描述

SCCB——E 信號

低電平有效,一個高到低的轉換表明數據傳輸開始;一個低到高的轉換表明數據傳輸結束;數據傳輸過程保持為低

電平;高電平表明總線處於空閑狀態。在SCCB——E表明數據傳輸開始之前主機必須將數據線SIO——D置為1,這樣可以避免

總線數據傳輸開始之前的總線不確定狀態的出現。

SIO——C 信號

高電平有效,當處於空閑狀態時必須被拉高;當啟動傳輸后,SIO——C被拉低表明數據傳輸的開始,傳輸過程中高電平

表明一位數據正在傳輸,所以SIO——D的數據變化只能在SIO——C為低時發生,一位傳輸時間定義為tCYC,最小為10us

三總線數據傳輸

SIO——D信號

可以被主機和從機驅動,當總線處於空閑時保持懸浮或三態;

在傳輸Don‘t-Car()e或NA位時,總線浮動和爭用是允許的

SIO——C的一個高電平表明一位數據的傳輸,SIO——D只能在SIO——C的低電平期間發生變化,但在傳輸的開始和結束

也有例外,在SCCB——E斷言並且SIO——C拉低之前,SIO——D可以被拉低,在SIO——C拉高之前和去斷言之前,SIO——D

也可以被拉低。

數據傳輸的起始

SCCB——E由高到低的變化,表明數據傳輸的開始,在SCCB——E斷言之前,主機必須把SIO——D拉高,這樣可以避免

在數據傳輸之前傳輸一個不確定的總線狀態;在SCCB——E去斷言之后,主機必須把SIO——D拉高在一個定義的時間段

內,來再次避免一個不確定狀態的總線狀態傳輸。

在啟動傳輸過程中有兩個時間參數,TPRA和TPRC,TPRC被定義為SID——D預充電時間,這表明SIO——D必須先於

SCCB——E被拉高的時間,最小值為15ns,TPRA被是指在SIO——D拉低之前,SID——E必須被斷言的時間,最小為1.25us。

數據傳輸的終止

 

 TPSC是SCCB——E去斷言后,SIO——D保持邏輯高電平的時間,最小為15ns,TPSA

是SIO——D去斷言后,SCCB——E必須保持低電平的時間,最小為0ns。

 傳輸階段

SCCB讀數據的Verilog實現

   `START1 : begin
    //Rd_Data <= 8'h0;
    if( Shift_Start == 1 )
     I2C_Start( Start_Buf);
    else begin 
     if( Scl_r == 1'b1) begin
     Scl_Ctrl <= 1'b1;
     M_State <= `WR_ID1;
     Shift_Start <= 1'b1;
    // Scl_Ctrl <= 1'b0;
     end
     else M_State <= `START1;
    end
   end
  `WR_ID1 : begin
    if( Shift_Start == 1'b1 )
     Shift8_Out( WR_id );
    else begin
     Shift_Start <= 1'b1;
     M_State <= `WR_SB_AR1;
     end
    end
  `WR_SB_AR1 : begin
    if( Shift_Start == 1'b1 )
     Shift8_Out ( 8'h11 );
    else begin
     Shift_Start <= 1'b1;
     M_State <= `END2;
     end
    end
  `END2 : begin
    if( Scl_r == 1'b1 )
    
    Scl_Ctrl <= 1'b0;
    else if( Shift_Start == 1'b1)
     I2C_End( End_Buf);
    else begin
     M_State <= `IDLE2;
    // Shift_Start <= 1'b1;
    end
   end
  `IDLE2 : begin
    Scl_Ctrl <= 1'b0;//Scl 設置為高電平
    Sda_io_Flag <= 1'b0;//Sda 設置為高阻
    Sda_Reg <= 1'b1;
    M_State <= `START2;
    Shift_Start <= 1'b1;
    end
    
  `START2 : begin
   // Rd_Data <= 8'h0;
    if( Shift_Start == 1 )
     I2C_Start( Start_Buf);
    else begin 
     if( Scl_r == 1'b1) begin
     Scl_Ctrl <= 1'b1;
     M_State <= `RD_ID;
     Shift_Start <= 1'b1;
    // Scl_Ctrl <= 1'b0;
     end
     else M_State <= `START2;
    end
   end
  `RD_ID : begin
    if( Shift_Start == 1'b1)
     Shift8_Out ( RD_id );
    else begin
     Shift_Start <= 1'b1;
     M_State <= `RD_DATA;
    // Sda_io_Flag <= 1'b1;
      end
     end
  `RD_DATA : begin
    if( Shift_Start == 1'b1 ) begin
     Shift8_in( Rd_Data );
     Sda_io_Flag <= 1'b1;
     end
    else begin 
     Sda_io_Flag <= 1'b0;
     if( Scl_r ==  1'b1 ) begin
     M_State <= `END1;
     Shift_Start <= 1'b1;
      end
     end
    end

`END1 : begin
    if( Scl_r == 1'b1 )
    
    Scl_Ctrl <= 1'b0;
    else if( Shift_Start == 1'b1)
     I2C_End( End_Buf);
    else begin
     M_State <= `IDLE1;
    // Shift_Start <= 1'b1;
    end
   end
  `IDLE1 : begin
    Scl_Ctrl <= 1'b0;//Scl 設置為高電平
    Sda_io_Flag <= 1'b0;//Sda 設置為高阻
    Sda_Reg <= 1'b1;
    M_State <= `START1;
    Shift_Start <= 1'b1;
    end
    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM