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