江蘇自動化研究所 張艷春
基于PCF8584實現(xiàn)串行I2C總線接口的擴(kuò)展
江蘇自動化研究所 張艷春
I2C總線大量的應(yīng)用在視頻和音像電路中。在沒有自帶I2C接口的MCU處理器若要使用I2C總線進(jìn)行擴(kuò)展或者控制的時候,必須要通過專用的器件進(jìn)行信號轉(zhuǎn)換,此時PCF8584就可以作為一個接口器件,實現(xiàn)高速并行總線和I2C串行總線間的數(shù)據(jù)轉(zhuǎn)換。
I2C串行總線;接口器件
新一代單片機(jī)技術(shù)顯著特點之一就是串行擴(kuò)展總線的推出。I2C串行總線的優(yōu)點:1)規(guī)范非常嚴(yán)格,如接口的信號時序、信號傳輸?shù)亩x、電氣特征、總線管理規(guī)則、總線狀態(tài)設(shè)置以及總線狀態(tài)處理等。2)元器件在總線上節(jié)點具有獨立性,且各節(jié)點上的模塊、器件都會對應(yīng)相對獨立的地址編號。
I2C (Inter-Integrated Circuit)總線是一種由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備。最初在80年代為音頻和視頻設(shè)備開發(fā),目前主要用于服務(wù)器管理。
I2C總線是由數(shù)據(jù)線SDA和時鐘SCL構(gòu)成可發(fā)送和接收數(shù)據(jù)的串行總線。用于IC與IC之間、CPU與被控IC之間進(jìn)行雙向傳送,最高傳送速率可達(dá)100kbps。各種被控制電路均并聯(lián)在總線上,每個電路和模塊都有唯一的地址,就像電話機(jī)一樣只有撥通各自的號碼才能工作。在信息的傳輸過程中,I2C總線上并接的每一模塊電路取決于它所要完成的功能,既可以定義為主控器(或被控器),又是發(fā)送器(或接收器)。總線在傳送數(shù)據(jù)過程中共有三種類型信號:開始信號、應(yīng)答信號和結(jié)束信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數(shù)據(jù)。
應(yīng)答信號:接收數(shù)據(jù)的IC在接收到數(shù)據(jù)后,向發(fā)送數(shù)據(jù)的IC發(fā)出特定的低電平脈沖,表示已收到數(shù)據(jù)。
結(jié)束信號:SCL為低電平時,SDA由低電平向高電平跳變,結(jié)束傳送數(shù)據(jù)。
I2C規(guī)程運用主/從雙向通訊。如果定義為發(fā)送器,則器件發(fā)送數(shù)據(jù)到總線上,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于發(fā)送或接收狀態(tài)。 總線必須由主器件(通常為微控制器)控制,主器件產(chǎn)生起始和停止條件,并產(chǎn)生串行時鐘(SCL)控制總線的傳輸方向。在SCL為低電平的期間SDA總線的數(shù)據(jù)狀態(tài)僅才能改變,SDA狀態(tài)的改變用來表示起始和停止條件時SCL為高電平。
PCF8584內(nèi)部結(jié)構(gòu)主要由三部分組成,即I2C總線接口控制、并行總線控制邏輯和寄存器組。
內(nèi)部寄存器有比較器、讀緩沖器/移位寄存器S0、控制/狀態(tài)寄存器S1、時鐘寄存器S2、中斷向量寄存器S3和自地址寄存器S0′。與并行總線相連的移位寄存器與讀緩沖器共用一個單元,執(zhí)行雙向傳送數(shù)據(jù)方式。各部分簡要功能介紹:a)比較器將自地址寄存器S0′數(shù)據(jù)加載至自己的從地址數(shù)據(jù)。b)控制/狀態(tài)寄存器S1寫入時為控制寄存器,用以寄存器選擇和I2C總線的運行控制;讀出時為狀態(tài)寄存器,用以了解I2C總線的狀態(tài)信息。c)時鐘寄存器S2用來選擇內(nèi)部時鐘頻率和I2C總線時鐘頻率。d)中斷適量寄存器S3為矢量中斷提供一個用戶可編程的8為矢量值。e)并行總線控制邏輯用于自動識別外部總線類型,以提供相應(yīng)的控制信號,如80XX系列單片機(jī)的讀/寫信號;6800系列的/IACK、/DTACK、R/W;等。f)I2C總線接口控制部分包括時鐘控制邏輯、數(shù)據(jù)控制邏輯、總線的標(biāo)準(zhǔn)接口、數(shù)字濾波器以及遠(yuǎn)程接口。
下表所示是PCF8584的引腳安排。共有20個引腳,各引腳功能如下:
引腳號 名稱 輸入/輸出 功 能1 CLK I 來自MCU/CPU時鐘發(fā)生器的輸入端(內(nèi)部上拉)2 SDA/SDAOUT I/O SDA:總線的數(shù)據(jù)端(漏極開路)SDAOUT:長線方式的數(shù)據(jù)輸出端3 SCL/SCLIN I/O SCL:總線的時鐘端(漏極開路)SCLIN:長線方式的串行時鐘輸入端4 /IACK/SDAIN I/IACK:中斷響應(yīng)輸入(內(nèi)部上拉)。當(dāng)該信號有效ENI標(biāo)志置位,寄存器S2中的中斷向量將出現(xiàn)在總線端口上。SDAIN:長線方式的串行數(shù)據(jù)輸入5 /INT/SCLOUT O/INT:中斷請求輸出(漏極開路)。該信號由S1寄存器中的ENI表示使能。當(dāng)PIN表示復(fù)位時,該信號有效(PIN在I2C總線上發(fā)送和接收一個字節(jié)后復(fù)位)SCLOUT:長線方式的時鐘輸出端6 A0 I寄存器選擇輸入(內(nèi)部上拉)。用以選擇控制/狀態(tài)寄存器或其它寄存器,A0=1選擇S1;A0=0則根據(jù)S1中的ES0、ES1、ES2選擇其它的寄存器7~15 DB1~DB7 I/O 雙向8位總線口16 /RD(/DTACK) I(O) 8049、8051等系列MCU、CPU的讀控制輸入;/DTACK為6800系列CPU的數(shù)據(jù)傳送控制輸出(漏極開路)17 /CS I 片選輸入(內(nèi)部上拉)18 /WR(R//W) I 8049、8051等系列MCU、CPU的寫控制輸入;R//W為6800系列CPU的R//W控制輸入19 /RESET/STROBE I/O復(fù)位輸入(漏極開路)。該輸入信號迫使總線控制器進(jìn)入預(yù)訂狀態(tài),出PIN外所有標(biāo)志復(fù)位;該引腳也可作選通輸出。20 VDD 電源正端
PCF8584的初始化主要是對寄存器S0′、S2和S3的配置方式。
1)自地址寄存器S0′。狀態(tài)寄存器S1中的AAS位置位當(dāng)接收到自己的從地址時。(S0中的地址數(shù)據(jù)與S0′中的地址數(shù)據(jù)相比較)。提醒S0和S0′寄存器須錯移一位,自地址編程為55H時,被認(rèn)作PCF8584的從地址值為AAH。
當(dāng)引腳A0為低電平是,S1中的有關(guān)位組合設(shè)置可實現(xiàn)對S0′的編程。復(fù)位后,S0′為無效地址00H。
2)時鐘寄存器S2。用來選擇總線的時鐘頻率SCL和時鐘頻率。S2中的S20、S21位用來選擇4種SCL時鐘頻率。
3)中斷矢量寄存器S3。矢量中斷微處理器通過中斷矢量寄存器提供了一個8位可編程矢量。當(dāng)ENI(中斷使能)標(biāo)志置位時,并且一個中斷響應(yīng)信號出現(xiàn),總線端口(DB7~DB0)就會出現(xiàn)出現(xiàn)中斷矢量。
當(dāng)PCF8584 A0引腳為低電平時,寄存器S0′、S2和S3的初始化編程寫入對控制寄存器S1中的ES1、ES2置位、復(fù)位不同狀態(tài)實現(xiàn)。
4)總線R/W操作與移位寄存器/讀緩沖器S0。在接收方式中,禁止從I2C總線進(jìn)一步接收數(shù)據(jù)直到S0緩沖器讀出為止,此時在應(yīng)答的時序上,數(shù)據(jù)從移位寄存器復(fù)制到讀緩沖器中。在發(fā)送方式中,如果串行口被使能(ES0=1),當(dāng)數(shù)據(jù)寫到S0移位寄存器后立即發(fā)送到I2C總線上。
控制/狀態(tài)寄存器S1用于I2C總線的操作控制,并提供總線狀態(tài)信息。S1尋址方式的實現(xiàn)是通過寄存器選擇輸入A0為高電平。讀操作時S1為狀態(tài)寄存器,寫操作時為控制寄存器。
控制寄存器S1主要作用是對總線的操作控制以及對S0、S0′、S1、S2、S3進(jìn)行尋址選擇。其格式如下:
D7:PIN ES0 ES1 ES2 EN1 STA ST0 D7:ACK PIN:中斷無關(guān)。當(dāng)PIN=1時,表示執(zhí)行的操作與中斷無關(guān)。ES0:串行輸出使能。ES0用于總線串行接口的使能控制。ES1、ES2:寄存器的讀、寫選擇位。用于I2C總線初始化及正常操作控制時的寄存器讀、寫操作選擇。ENI:外部中斷輸出允許。ENI=0表示 /INT輸出使能。STA、STO:起始、停止位。STA、STO位用于控制總線產(chǎn)生起始條件和傳送從地址及讀/寫位;產(chǎn)生一個重起始條件以及產(chǎn)生一個停止條件。ACK:應(yīng)答位。通常情況下,由于總線控制器在接收到每個字節(jié)后都要自動地發(fā)送一個應(yīng)答位,該位必須置1。通常情況(串行口工作時)下,對S1進(jìn)行寫操作時,S1為狀態(tài)寄存器,提供總線的狀態(tài)信息。其格式如下:D7:PIN 0 STS BER AD0/LRB AAS LAB D7:/BB
圖1 80C31單片機(jī)通過PCF8584擴(kuò)展I2C接口硬件電路
PIN:中斷無關(guān)。當(dāng)收到PCF8584請求信號,該位置0。作為從發(fā)送或從接收器時,當(dāng)PIN=0,PCF8584通過保持SCL為低電平來停止I2C總線傳送操作,直到PIN=1為止??偩€busy將拒絕數(shù)據(jù)發(fā)送或接收,直到從S0中讀取正確的數(shù)據(jù)(從接收)或下個數(shù)據(jù)寫入S0中(從發(fā)送)。
STS:在從接收方式中,標(biāo)志著收到到一個外部的STOP條件。
BER:I2C總線錯誤??偩€錯誤表明START或STOP出現(xiàn)錯誤。
LRB/AD0:最后接收位/零地址位。
LRB:當(dāng)AAS=0是,保持總線最新的接收位,通常為從器件的應(yīng)答位。因此LRB的有效測試方式即從器件應(yīng)答位的檢查。
AD0:當(dāng)AAS=1,總線控制器作為從器件被尋址,此時如果接收到的地址為總線控制器的自地址則置0,如果接收到的從地址為廣播呼叫地址(00H)時,AD0位置1。
AAS:從器件尋址位。當(dāng)作為從接收器時,接收到自己的從地址或廣播地址時該位置位。
LAB:仲裁失敗位。在多主系統(tǒng)中,當(dāng)仲裁失敗另一主器件占用總線時該位置位。
/BB:總線忙。該標(biāo)志位表示總線在使用中,低電平有效,表示總線忙。該位通過STOP/START條件置位/復(fù)位(/1)。
在常規(guī)的音像、視頻的控制電路中的總線實現(xiàn)方式大部分是通過擴(kuò)展I2C接口的MCU,在本文我們設(shè)計實現(xiàn)了I2C的擴(kuò)展實例,通過80C31單片機(jī)進(jìn)行擴(kuò)展,實現(xiàn)了I2C接口的擴(kuò)展應(yīng)用。實現(xiàn)多片PCF8584擴(kuò)展使用的情況,可以通過單片機(jī)片選譯碼器實現(xiàn)尋址控制I2C接口,同時實現(xiàn)多路I2C數(shù)據(jù)通信的控制,可用于服務(wù)器管理。圖1為典型的單端I2C電路實現(xiàn)原理圖。
電路圖中8584的地址通過A1和A0尋址獲得,S0’寄存器的地址為#FF00;S1寄存器的地址為#FF01;
初始化程序清單如下:
MOV DPTR, #FFO1H MOV A, #80 ;發(fā)送字節(jié)80→S1
MOVX @DPTR,A NOP
MOV DPTR,#FF00H ;發(fā)送字節(jié)55→S0' MOV A,#55H
MOVX @DPTR,A NOP
MOV DPTR,#FF01H ;發(fā)送字節(jié)A0→S1 MOV A, #0A0H
MOVX @DPTR, A NOP
MOV DPTR #FF00H MOV A,#01DH ; 系統(tǒng)時鐘=12MHz,SCL=45KHz
MOVX @DPTR,A NOP
MOV DPTR,#FF01H MOV A, #0C1H ;發(fā)送字節(jié)C1→S1
MOV A, #0C1H ;發(fā)送字節(jié)C1→S1 MOVX @DPTR,A
NOP RET
本文分析闡述了I2C串行總線的工作原理,提出了通過常用MCU實現(xiàn)I2C接口的一種方法:通過I2C總線規(guī)范的應(yīng)用,使PCF8584進(jìn)行總線接口的擴(kuò)展。但管理服務(wù)器等眾多設(shè)備時,硬件需求眾多的I2C總線接口的時,這種擴(kuò)展方式顯的電路復(fù)雜,因此我們又可以采用本身帶有I2C接口的器件。
[1]PCF8584 I2C-bus controller.DATA SHEET,1997.
[2]相征.基于VxWorks嵌入式系統(tǒng)的數(shù)據(jù)通信[M].西安電子科技大學(xué)出版社:2011,4.
[3]謝四連,董輝,許岳兵.微機(jī)原理與接口技術(shù)[M].中南大學(xué)出版社:2015,8.
[4]何立民.I2C總線應(yīng)用系統(tǒng)設(shè)計[M].北京航天航空大學(xué)出版社:2002,9.