SCCB的總線時序與I2C基本相同,它的響應信號ACK被稱為一個傳輸單元的第9位,分為Don’t care和NA。Don’t care位由從機產生;NA位由主機產生,由于SCCB不支持多字節的讀寫,NA位必須為高電平。另外,SCCB沒有重復起始的概念,因此在SCCB的讀周期中,當主機發送完片內寄存器地址后,必須發送總線停止條件。不然在發送讀命令時,從機將不能產生Don’t care響應信號。
由于I2C和SCCB的一些細微差別,所以采用GPIO模擬SCCB總線的方式。SCL所連接的引腳始終設為輸出方式,而SDA所連接的引腳在數據傳輸過程中,通過設置IODIR的值,動態改變引腳的輸入/輸出方式。SCCB的寫周期直接使用I2C總線協議的寫周期時序;而SC-CB的讀周期,則增加一個總線停止條件 
//--------------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------
2.2 SCCB通信規范
SCCB(Serial Camera Control Bus)是OminiVision公司定義的主從模式串行通信協議,用于控制該公司圖像傳感器系列芯片的內部寄存器。該協議有通信使能信號SIO_E、時鐘信號SIO_C和數據信號SIO_D,在簡化引腳的封裝中不再提供SIO_E引腳,協議也變成了兩線串行通信。協議支持的最高串行通信速率是400 Kb/s,規定圖像傳感器在通信中只能作為SLAVE工作。一SCCBMASTER可以控制1~8個SLAVE工作,由不同的ID來識別,在只有一個SLAVE時固定SLAVE的ID為42H(寫)和43H(讀)。該協議符合網絡攝像機CPU的I2C口時序子集,設計中OV529作為SCCB的MASTER,并且只帶1個SLAVE OV7720。協議要求數據線必須在時鐘信號高電平期間穩定,在低電平時更新。協議支持3字節寫、2字節寫和2字節讀三種傳輸模式。傳輸數據時每個字節包括9位串行數據位,除了8位數據,還有第9位不相關位或NA位,用在有多個SLAVE的系統來標識通信是否完成。SLAVE可以用兩種方式應答該位,一種是正在被寫的SLAVE在收到數據后驅動該位為0表示成功;另一種是SLAVE不應答該位,這種情況下所有SLAVE的第9位保持懸空。在3字節寫周期MASTER必須提供子地址,即芯片中寄存器的地址,第3字節為所寫數據。讀周期不提供子地址,但必須由MASTER把數據后的NA位(第9位)驅動為高電平。所以在每個讀周期前必須有3字節或2字節寫操作,使SLAVE獲得寄存器地址,其中的2字節寫周期并沒有寫數據,它的用途是在讀操作前提供給SLAVE子地址。 3 硬件系統實現 3.1 微控制器模塊 微控制器模塊是該系統的核心部件,采用Atmel公司的ARM7芯片AT91SAM7X256作為系統的主控芯片。它是一款Atmel 32位ARM RISC處理器小引腳數FLASH微處理器,主頻為55 MHz,處理速度快,功能強,性價比高,能很好地滿足嵌入式Linux系統的需求。它在系統中的主要作用是在系統上電時配置其他芯片的功能寄存器,在正常工作狀態下調度整個系統工作,通過片內以太網控制器控制物理層芯片發送碼流,并通過片內的SPI總線實現對外圍DATAFLASH和SDRAM的控制。 3.2 網絡模塊 AT91SAM7X256的在片以太網卡端口與網絡物理層芯片DM9161E的MII接口通信。發送數據時首先置發送使能信號ETXEN有效。數據發送端ETX0~ETX1與DM9161E的ETX0~ETX1引腳對應連接,作為數據發送通道,以DM9161E的時鐘信號REF_CLK發送數據。數據接收端ERX0~ERX1與DM9161E的RXD0~RXD1引腳對應連接,作為數據接收通道。管理時鐘信號EMDC和管理數據輸入/輸出信號EMDIO用于芯片控制參數的寫入和讀取。DM9161E的MDINTR端用來產生中斷信號。片內以太網卡通過DMA通道進行數據發送,不影響AT91SAM7X256的正常運行。首先正確設置傳送控制寄存器和傳送地址寄存器的傳送數據塊字節數、數據塊存儲首地址等參數,隨后依次從指定數據存儲區地址讀取數據,送入內部發送緩沖器中,由MAC對數據進行封裝發送,同時記錄已傳送字節數,直到數據塊發送完畢。當發送完一組數據后,發出DMA中斷請求,由AT91SAM-7X256進行相應的處理。整個網絡子系統電路由AT91SAM7X256控制和調度。 3.3 相機控制模塊 相機控制模塊包括圖像采集傳感器OV7720和相機控制芯片OV529。OV7720內含A/D轉換和DSP,能夠直接將圖像信號數字化,并通過相機接口向OV529直接輸出并行的數字化圖像信號。 OV529自帶的MCU進行各種控制,它通過串行相機控制總線(SCCB)與OV7720交互控制信息實現對圖像傳感器的控制和數據采集。OV529包含一個壓縮引擎,對從OV7720采集的圖像信息幀進行壓縮,壓縮后的信號經OV529的串行通信傳給主控芯片AT91SAM7X512,再經AT91SAM7X512上的MAC層處理,通過網絡接口將視頻流發送到網絡上。 4 軟件設計 嵌入式Linux系統由4個部分組成:引導內核啟動的文件bootloader,Linux內核文件kernel,虛擬磁盤文件ramdisk和用戶空間文件use-r。它們分別被放在DATAFLASH內的4個分區模塊中。根據不同模塊的具體功能采用不同的文件系統:bootloader,kernel,ramdisk。移植完成后不需要動態改變,使用較節省空間的ROMFS只讀文件系統。user模塊內放置一些可以動態更新的配置文件等。需要進行較多次的讀/寫操作,所以使用支持動態擦寫保存的JFFS2文件系統。 4.1 CGI控制程序設計 應用程序接口(Common Gateway Interface,CGI),提供Web Server執行外部程序的通道,CGI程序編譯成可執行文件,放在服務器端運行,服務器根據用戶的請求調用相應的CGI程序,并將CGI程序得到的動態信息封裝到頁面中,發送到用戶瀏覽器上。該系統CGI的工作過程是在PC機端的IE瀏覽器中輸入網絡攝像機IP地址,嵌入式網絡服務器根據要求,將相應的控制頁面反饋給IE瀏覽器,用戶填寫表單,然后提交,CGI程序提取信息,并根據得到的信息作相應的處理,如調節相機的轉向、焦距等。CGI模塊的設計主要包括三部分:嵌入式Web服務器的配置、HTML頁面的編寫、CGI程序的設計。嵌入式Web服務器采用的是Apache,其配置是以配置文件的形式提供,放在Ramdisk中,其配置主要涉及配置根文件路徑、配置CGI外部程序所放的路徑和配置環境變量三個方面。網頁編寫采用HTML與SHTML相結合的方式。HTML的解析速度較快,SHTML可以在普通網頁中嵌入外部CGI程序,通過這種方式將系統的默認配置反饋給客服端。CGI程序采用的是C語言和Shell腳本相結合的方式,具體編寫過程與Linux下編程相同。 4.2 解碼程序 該部分已成功做成Toolbox插件,該插件只要在PC機上注冊安裝后,就可方便地被網頁調用,從而實現在PC機上實時觀看視頻。安裝后的實圖如圖2所示。

5 結語 本文利用CMOS圖像傳感器設計了一款嵌入式網絡攝像機。經測試,系統穩定、可靠、實時性好,圖像清晰度明顯好于同價位的產品,完全可滿足目前網絡攝像頭市場對中、低端產品的要求,具有良好的市場前景。 //--------------------------------------------------------------------------------------------------------------------
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
|