用虛擬I2C總線(xiàn)技術(shù)實(shí)現SAA7111的初始化
摘要:介紹了虛擬I2C總線(xiàn)技術(shù)的特點(diǎn),描述了用單片機(C51)的普通I/O口以及對DSP(TMS320VC5402)的McBSP口和HPI-8口模擬I2C總線(xiàn)接口的設計方案,最后給出了對SAA7111進(jìn)行初始化的方法。
關(guān)鍵詞:虛擬I2C總線(xiàn)技術(shù);SAA7111;DSP;I2C總線(xiàn)
SAA7111是Philips半導體公司生產(chǎn)的一種視頻輸入處理器(VIP),在視頻采集系統中,通常需要諸如SAA7111之類(lèi)的視頻解碼器作為模擬視頻前端,而視頻解碼器的初始化主要通過(guò)I2C總線(xiàn)接口來(lái)完成。然而,目前的單片機和DSP器件大多都不帶有I2C總線(xiàn)接口,為此,本文提出了用虛擬總線(xiàn)技術(shù)來(lái)模擬實(shí)現I2C總線(xiàn)功能,利用DSP的多功能I/O口和單片機的普通I/O口模擬I2C總線(xiàn)接口設計,從而實(shí)現DSP和單片機對SAA7111的初始化與控制的新方法。
1 虛擬I2C總線(xiàn)技術(shù)
1.1 多主方式下的I2C總線(xiàn)虛擬
I2C總線(xiàn)是Philips公司推出的一種連接IC器件的二線(xiàn)制總線(xiàn),它既可以用于構成多主系統,又可工作在單主方式下。因為多主方式下會(huì )出現多主競爭的復雜狀態(tài),此時(shí)如果系統中沒(méi)有帶I2C總線(xiàn)接口的主控制器,那么要構成多主系統的虛擬I2C總線(xiàn),就必須在虛擬I2C總線(xiàn)中解決多主競爭狀態(tài),而這幾乎是不可能的,鑒于此,多主I2C總線(xiàn)系統必須使用帶I2C總線(xiàn)接口的控制器。
1.2 單主方式下的I2C總線(xiàn)虛擬
當I2C總線(xiàn)中只有一個(gè)主器件時(shí),I2C總線(xiàn)系統的工作方式稱(chēng)為單主方式。在單主方式下,由于I2C總線(xiàn)上只有一個(gè)主器件成為主節點(diǎn),因此,該主器件會(huì )永遠占據總線(xiàn),而不會(huì )出現總線(xiàn)競爭,此時(shí)的主節點(diǎn)也不必有自己的節點(diǎn)地址。在這種情況下,主器件若沒(méi)有I2C總線(xiàn)接口,就可以用主控制器的I/O口來(lái)模擬I2C總線(xiàn)接口。
目前,許多視頻、音像電器中都采用了虛擬I2C總線(xiàn)技術(shù)。SAA7111的初始化控制操作就工作在單主方式下,因此可以用虛擬I2C總線(xiàn)技術(shù)來(lái)實(shí)現SAA7111的初始化控制。下面分別以單片機和DSP為例來(lái)說(shuō)明虛擬I2C總線(xiàn)技術(shù)的實(shí)現方法。
2 用單片機普通I/O模擬I2C總線(xiàn)接口
用單片機普通I/O口模擬I2C總線(xiàn)接口時(shí),其硬件配置非常簡(jiǎn)單,因為單片機的I/O口很多,并且大多I/O口都是雙向的,因此可以直接用兩個(gè)I/O口線(xiàn)作為I2C總線(xiàn)的串行時(shí)鐘線(xiàn)SCL和串行數據線(xiàn)SDA。圖1所示為C51 單片機與SAA7111的硬件連接圖。 當硬件配置完成后,根據I2C總線(xiàn)的時(shí)序特性可用軟件編程來(lái)模擬I2C總線(xiàn)接口。圖2為I2C總線(xiàn)的起始信號(S),它表示在SCL為高電平期間,數據線(xiàn)SDA由高電平向低電平變化將啟動(dòng)I2C總線(xiàn)。下面是相應的匯編程序。其它子程序可以參考I2C總線(xiàn)時(shí)序來(lái)實(shí)現,這里就不一一給出了。
啟動(dòng)I2C總線(xiàn):
SETB P1.0 ; SDA=1
SETB P1.1 ; SCL=1
CALL DELAY ;保持數據時(shí)間,DELAY
為延遲子程序
CLR P1.0 ; SDA=0
CALL DELAY
CLR P1.1 ;鉗定總線(xiàn),開(kāi)始發(fā)送數據
RET
3 用DSP外圍接口模擬I2C總線(xiàn)接口
由于TMS320VC5402只有兩個(gè)通用的I/O引腳,且都是單向的,而在I2C總線(xiàn)中,SDA必須是雙向的,因此必須借助于其它總線(xiàn)接口。
3.1 用McBSP口模擬I2C總線(xiàn)接口
首先,通過(guò)配置串口控制寄存器SPCR1和SPCR2以及引腳控制寄存器PCR的禁用McBSP功能,以將McBSP引腳(包括CLKX、CLKR、DX、DR、FSX、FSR、和CLKS)作為通用I/O口?,F以發(fā)送器為例,當SPCR2的XRST=0、PCR的XIOEN=1時(shí),串口發(fā)送器無(wú)效,FSX、CLKX用作通用I/O引腳。FSX和CLKX作為通用I/O端口的引腳設置情況如表1所列。以McBSP0為例,也可以從FSX0和CLKX0引出兩條線(xiàn)分別表示SDA線(xiàn)和SCL線(xiàn)。
表1 將FXS和CLKX作為通用I/O的設置方法
引腳 | FSX數據方向 | CLKX數據方向 | FSX輸出值 | CLKX輸出值 | ||||
FSXM | CLKXM | FSXP | CLKXP | |||||
0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | |
FSX | 輸入 | 輸出 | - | - | - | 1 | - | - |
CLKX | - | - | 輸入 | 輸出 | - | - | 0 | 1 |
注:“-”表示無(wú)影響
圖3為I2C總線(xiàn)的結束信號時(shí)序,下面是相應的程序:
#define SPSA0 0x0038 //SPSA0指向McBSP0子地址寄存器
#define SPSD0 0x0039 //SPSD0指向McBSP0
子區數據存儲器
#define PCR0 ‘0x000E //PCR0代表子地址
0x000E
結束I2C總線(xiàn):
void stop ? ? ?
*?short *?SPSA0=PCR0; //SPSA0指向子
地址PCR0
*?short *?SPSD0=0x2A02? //初始化PCR0,
令FSX0=0,CLKX=1。即SDA=0,SCL=1
delay? ?; //延時(shí)。Delay()為延時(shí)子程序
*?short *?SPSD0=0x2A0A; //令FSX0=1,
CLKX=1。即SDA=1,SCL=1
}
3.2 用HPI-8口模擬I2C總線(xiàn)接口
同樣,首先必須禁用HPI-8的功能,這可通過(guò)設置HPI-8控制寄存器(HPIC)的HPIENA為0來(lái)完成。當HPI-8工作在通用I/O端口(GPIO)方式時(shí),通過(guò)通用I/O控制寄存器(GPIOCR)和通用I/O狀態(tài)寄存器(GPIOSR)可以控制GPIO方式下的HPI-8數據引腳。GPIOCR的DIRx(x=0~7)位為低電平表明HDx引腳為輸入,高電平表明HDx為輸出。 GPIOSR的D/Ox位則反映了引腳HDx的邏輯值,D/Ox為低電平表明HDx輸入/輸出為0,D/Ox為高電平表明HDx輸入/輸出為1。因為在GPIO方式下,HDx為雙向I/O端口,因此可以任意選擇一個(gè)HDx(如HD0)作為SDA,再用另外一個(gè)HDx(HD1)作為SCL以實(shí)現I2C總線(xiàn)接口的模擬。
4 SAA7111的初始化
SAA7111內部有32個(gè)寄存器(Subaddress00~1FH),其中22個(gè)是可編程的。00H、1A~1CH、1FH是只讀寄存器,其中00H描述的是芯片版本信息;1A~1CH是文本信息檢測和解碼寄存器,一般很少用到;1FH用來(lái)描述芯片的狀態(tài)。02H~12H是可讀寫(xiě)寄存器,其中02H~05H是模擬輸入控制寄存器,02H用于設置模擬視頻信號輸入方式(共8種),03H~05H用于設置增益控制方式, 06H~12H主要用于設置解碼方式,通過(guò)配置這些寄存器可以設置行同步信號的開(kāi)始和結束位置,并可確定亮度、色度、飽和度的大小以及輸出圖像數據信號的格式。 01H、13H~19H、1DH~1EH寄存器保留使用。需要注意的是,在讀00H寄存器前,必須將它初始化為0。在對多個(gè)連續的寄存器進(jìn)行操作時(shí),寄存器地址有自動(dòng)加1功能。內部寄存器控制位的功能含義詳見(jiàn)參考文獻。
可以采用上面任何一種方法來(lái)模擬I2C總線(xiàn)接口,只是具體的編程方法應視不同的控制器而異。但軟件編程具有相同之處,首先必須根據I2C總線(xiàn)的原理寫(xiě)出啟動(dòng)、結束、發(fā)送應答信號及讀、寫(xiě)一個(gè)字節的程序,然后根據SAA7111的寄存器操作格式寫(xiě)出讀、寫(xiě)寄存器的程序,最后根據以上子程序寫(xiě)出初始化SAA7111的程序段。SAA7111的初始化流程如圖4所示。
以單片機為例,硬件連接見(jiàn)前文圖1所示,其中IICSA是SAA7111的讀寫(xiě)控制位,IICSA=0表示SAA7111的寫(xiě)地址為48H。這里把SAA7111初始化設定為:一路模擬視頻信號輸入(AI12)、自動(dòng)增益控制、625行50Hz PAL制式、YUV 422 16位數字視頻信號輸出、設置默認的圖象對比度、亮度及飽和度。相應的寄存器初始化值如表2所列。下面是向SAA7111的19個(gè)連續的子地址寄存器(00H~12H)寫(xiě)入一組數據的的程序。
表2 寄存器初始化值
SubAddress | Data | SubAddress | Data |
00H | 00H | 01H | 00H |
02H | C1H | 03H | 33H |
04H | 00H | 05H | 00H |
06H | EBH | 07H | E0H |
08H | 88H | 09H | 01H |
0AH | 80H | 0BH | 47H |
0CH | 40H | 0DH | 00H |
0EH | 01H | 0FH | 00H |
10H | 40H | 11H | 1CH |
12H | 03H |
入口參數:SAA7111寫(xiě)地址48H、子地址00H、發(fā)送數據緩沖區DBUF、發(fā)送字節數19。
WNBYTE:MOV R3,19 ;發(fā)送字節數19送入R3
LCALL START ;調用啟動(dòng)子程序
MOV A,#48H ;SAA7111寫(xiě)地址送入A
LCALL WBYTE ;調用寫(xiě)一個(gè)字節子程序
LCALL CHECK ;調用檢查應答位子程序
JB F0,NEXT0 ;有應答,轉到NEXT0,其
中F0為應答標志位,F0=1
表示有應答
AJMP WNBYTE ;無(wú)應答,重新發(fā)送
NEXT0:MOV A, 00H ;SAA7111子地址送入A
LCALL WBYTE
LCALL CHECK
JB F0,NEXT1
AJMP START
送入R2
NEXT1:MOV A, @R2 ;發(fā)送數據緩沖區數據送
入A
LCALL WBYTE
LCALL CHECK
JNB F0,WNBYTE ;未應答,重新發(fā)送
INC R2
DJNZ R3,NEXT1 ;發(fā)送完否?未完,繼續發(fā)送
EXIT: LCALL STOP ;發(fā)送完畢?調用結束子程序
RET
5 結束語(yǔ)
對一個(gè)典型的以DSP為核心處理器的視頻采集系統而言,用單片機普通I/O口模擬I2C總線(xiàn)接口的編程比較簡(jiǎn)單,操作也很方便,但是相應的會(huì )增加設計成本,因為系統要額外的增加一片單片機。而用DSP的McBSP口或者HPI-8口模擬I2C總線(xiàn)接口,雖然不必考慮成本問(wèn)題,但是必須要禁用McBSP或者HPI-8的功能,這對系統中DSP功能的擴展來(lái)說(shuō)是不利的。
評論