江蘇自動化研究所 張艷春
基于PCF8584實現串行I2C總線接口的擴展
江蘇自動化研究所 張艷春
I2C總線大量的應用在視頻和音像電路中。在沒有自帶I2C接口的MCU處理器若要使用I2C總線進行擴展或者控制的時候,必須要通過專用的器件進行信號轉換,此時PCF8584就可以作為一個接口器件,實現高速并行總線和I2C串行總線間的數據轉換。
I2C串行總線;接口器件
新一代單片機技術顯著特點之一就是串行擴展總線的推出。I2C串行總線的優點:1)規范非常嚴格,如接口的信號時序、信號傳輸的定義、電氣特征、總線管理規則、總線狀態設置以及總線狀態處理等。2)元器件在總線上節點具有獨立性,且各節點上的模塊、器件都會對應相對獨立的地址編號。
I2C (Inter-Integrated Circuit)總線是一種由PHILIPS公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。最初在80年代為音頻和視頻設備開發,目前主要用于服務器管理。
I2C總線是由數據線SDA和時鐘SCL構成可發送和接收數據的串行總線。用于IC與IC之間、CPU與被控IC之間進行雙向傳送,最高傳送速率可達100kbps。各種被控制電路均并聯在總線上,每個電路和模塊都有唯一的地址,就像電話機一樣只有撥通各自的號碼才能工作。在信息的傳輸過程中,I2C總線上并接的每一模塊電路取決于它所要完成的功能,既可以定義為主控器(或被控器),又是發送器(或接收器)。總線在傳送數據過程中共有三種類型信號:開始信號、應答信號和結束信號。
開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
應答信號:接收數據的IC在接收到數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據。
結束信號:SCL為低電平時,SDA由低電平向高電平跳變,結束傳送數據。
I2C規程運用主/從雙向通訊。如果定義為發送器,則器件發送數據到總線上,器件接收數據則定義為接收器。主器件和從器件都可以工作于發送或接收狀態。 總線必須由主器件(通常為微控制器)控制,主器件產生起始和停止條件,并產生串行時鐘(SCL)控制總線的傳輸方向。在SCL為低電平的期間SDA總線的數據狀態僅才能改變,SDA狀態的改變用來表示起始和停止條件時SCL為高電平。
PCF8584內部結構主要由三部分組成,即I2C總線接口控制、并行總線控制邏輯和寄存器組。
內部寄存器有比較器、讀緩沖器/移位寄存器S0、控制/狀態寄存器S1、時鐘寄存器S2、中斷向量寄存器S3和自地址寄存器S0′。與并行總線相連的移位寄存器與讀緩沖器共用一個單元,執行雙向傳送數據方式。各部分簡要功能介紹:a)比較器將自地址寄存器S0′數據加載至自己的從地址數據。b)控制/狀態寄存器S1寫入時為控制寄存器,用以寄存器選擇和I2C總線的運行控制;讀出時為狀態寄存器,用以了解I2C總線的狀態信息。c)時鐘寄存器S2用來選擇內部時鐘頻率和I2C總線時鐘頻率。d)中斷適量寄存器S3為矢量中斷提供一個用戶可編程的8為矢量值。e)并行總線控制邏輯用于自動識別外部總線類型,以提供相應的控制信號,如80XX系列單片機的讀/寫信號;6800系列的/IACK、/DTACK、R/W;等。f)I2C總線接口控制部分包括時鐘控制邏輯、數據控制邏輯、總線的標準接口、數字濾波器以及遠程接口。
下表所示是PCF8584的引腳安排。共有20個引腳,各引腳功能如下:

引腳號 名稱 輸入/輸出 功 能1 CLK I 來自MCU/CPU時鐘發生器的輸入端(內部上拉)2 SDA/SDAOUT I/O SDA:總線的數據端(漏極開路)SDAOUT:長線方式的數據輸出端3 SCL/SCLIN I/O SCL:總線的時鐘端(漏極開路)SCLIN:長線方式的串行時鐘輸入端4 /IACK/SDAIN I/IACK:中斷響應輸入(內部上拉)。當該信號有效ENI標志置位,寄存器S2中的中斷向量將出現在總線端口上。SDAIN:長線方式的串行數據輸入5 /INT/SCLOUT O/INT:中斷請求輸出(漏極開路)。該信號由S1寄存器中的ENI表示使能。當PIN表示復位時,該信號有效(PIN在I2C總線上發送和接收一個字節后復位)SCLOUT:長線方式的時鐘輸出端6 A0 I寄存器選擇輸入(內部上拉)。用以選擇控制/狀態寄存器或其它寄存器,A0=1選擇S1;A0=0則根據S1中的ES0、ES1、ES2選擇其它的寄存器7~15 DB1~DB7 I/O 雙向8位總線口16 /RD(/DTACK) I(O) 8049、8051等系列MCU、CPU的讀控制輸入;/DTACK為6800系列CPU的數據傳送控制輸出(漏極開路)17 /CS I 片選輸入(內部上拉)18 /WR(R//W) I 8049、8051等系列MCU、CPU的寫控制輸入;R//W為6800系列CPU的R//W控制輸入19 /RESET/STROBE I/O復位輸入(漏極開路)。該輸入信號迫使總線控制器進入預訂狀態,出PIN外所有標志復位;該引腳也可作選通輸出。20 VDD 電源正端
PCF8584的初始化主要是對寄存器S0′、S2和S3的配置方式。
1)自地址寄存器S0′。狀態寄存器S1中的AAS位置位當接收到自己的從地址時。(S0中的地址數據與S0′中的地址數據相比較)。提醒S0和S0′寄存器須錯移一位,自地址編程為55H時,被認作PCF8584的從地址值為AAH。
當引腳A0為低電平是,S1中的有關位組合設置可實現對S0′的編程。復位后,S0′為無效地址00H。
2)時鐘寄存器S2。用來選擇總線的時鐘頻率SCL和時鐘頻率。S2中的S20、S21位用來選擇4種SCL時鐘頻率。
3)中斷矢量寄存器S3。矢量中斷微處理器通過中斷矢量寄存器提供了一個8位可編程矢量。當ENI(中斷使能)標志置位時,并且一個中斷響應信號出現,總線端口(DB7~DB0)就會出現出現中斷矢量。
當PCF8584 A0引腳為低電平時,寄存器S0′、S2和S3的初始化編程寫入對控制寄存器S1中的ES1、ES2置位、復位不同狀態實現。
4)總線R/W操作與移位寄存器/讀緩沖器S0。在接收方式中,禁止從I2C總線進一步接收數據直到S0緩沖器讀出為止,此時在應答的時序上,數據從移位寄存器復制到讀緩沖器中。在發送方式中,如果串行口被使能(ES0=1),當數據寫到S0移位寄存器后立即發送到I2C總線上。
控制/狀態寄存器S1用于I2C總線的操作控制,并提供總線狀態信息。S1尋址方式的實現是通過寄存器選擇輸入A0為高電平。讀操作時S1為狀態寄存器,寫操作時為控制寄存器。
控制寄存器S1主要作用是對總線的操作控制以及對S0、S0′、S1、S2、S3進行尋址選擇。其格式如下:

D7:PIN ES0 ES1 ES2 EN1 STA ST0 D7:ACK PIN:中斷無關。當PIN=1時,表示執行的操作與中斷無關。ES0:串行輸出使能。ES0用于總線串行接口的使能控制。ES1、ES2:寄存器的讀、寫選擇位。用于I2C總線初始化及正常操作控制時的寄存器讀、寫操作選擇。ENI:外部中斷輸出允許。ENI=0表示 /INT輸出使能。STA、STO:起始、停止位。STA、STO位用于控制總線產生起始條件和傳送從地址及讀/寫位;產生一個重起始條件以及產生一個停止條件。ACK:應答位。通常情況下,由于總線控制器在接收到每個字節后都要自動地發送一個應答位,該位必須置1。通常情況(串行口工作時)下,對S1進行寫操作時,S1為狀態寄存器,提供總線的狀態信息。其格式如下:D7:PIN 0 STS BER AD0/LRB AAS LAB D7:/BB

圖1 80C31單片機通過PCF8584擴展I2C接口硬件電路
PIN:中斷無關。當收到PCF8584請求信號,該位置0。作為從發送或從接收器時,當PIN=0,PCF8584通過保持SCL為低電平來停止I2C總線傳送操作,直到PIN=1為止。總線busy將拒絕數據發送或接收,直到從S0中讀取正確的數據(從接收)或下個數據寫入S0中(從發送)。
STS:在從接收方式中,標志著收到到一個外部的STOP條件。
BER:I2C總線錯誤。總線錯誤表明START或STOP出現錯誤。
LRB/AD0:最后接收位/零地址位。
LRB:當AAS=0是,保持總線最新的接收位,通常為從器件的應答位。因此LRB的有效測試方式即從器件應答位的檢查。
AD0:當AAS=1,總線控制器作為從器件被尋址,此時如果接收到的地址為總線控制器的自地址則置0,如果接收到的從地址為廣播呼叫地址(00H)時,AD0位置1。
AAS:從器件尋址位。當作為從接收器時,接收到自己的從地址或廣播地址時該位置位。
LAB:仲裁失敗位。在多主系統中,當仲裁失敗另一主器件占用總線時該位置位。
/BB:總線忙。該標志位表示總線在使用中,低電平有效,表示總線忙。該位通過STOP/START條件置位/復位(/1)。
在常規的音像、視頻的控制電路中的總線實現方式大部分是通過擴展I2C接口的MCU,在本文我們設計實現了I2C的擴展實例,通過80C31單片機進行擴展,實現了I2C接口的擴展應用。實現多片PCF8584擴展使用的情況,可以通過單片機片選譯碼器實現尋址控制I2C接口,同時實現多路I2C數據通信的控制,可用于服務器管理。圖1為典型的單端I2C電路實現原理圖。
電路圖中8584的地址通過A1和A0尋址獲得,S0’寄存器的地址為#FF00;S1寄存器的地址為#FF01;
初始化程序清單如下:
MOV DPTR, #FFO1H MOV A, #80 ;發送字節80→S1
MOVX @DPTR,A NOP
MOV DPTR,#FF00H ;發送字節55→S0' MOV A,#55H
MOVX @DPTR,A NOP
MOV DPTR,#FF01H ;發送字節A0→S1 MOV A, #0A0H
MOVX @DPTR, A NOP
MOV DPTR #FF00H MOV A,#01DH ; 系統時鐘=12MHz,SCL=45KHz
MOVX @DPTR,A NOP
MOV DPTR,#FF01H MOV A, #0C1H ;發送字節C1→S1
MOV A, #0C1H ;發送字節C1→S1 MOVX @DPTR,A
NOP RET
本文分析闡述了I2C串行總線的工作原理,提出了通過常用MCU實現I2C接口的一種方法:通過I2C總線規范的應用,使PCF8584進行總線接口的擴展。但管理服務器等眾多設備時,硬件需求眾多的I2C總線接口的時,這種擴展方式顯的電路復雜,因此我們又可以采用本身帶有I2C接口的器件。
[1]PCF8584 I2C-bus controller.DATA SHEET,1997.
[2]相征.基于VxWorks嵌入式系統的數據通信[M].西安電子科技大學出版社:2011,4.
[3]謝四連,董輝,許岳兵.微機原理與接口技術[M].中南大學出版社:2015,8.
[4]何立民.I2C總線應用系統設計[M].北京航天航空大學出版社:2002,9.