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