串行總線和并行總線相比具有結構簡單、占用引腳少、成本低的優(yōu)點。常見的串行總線有USB、IEEE1394、I2C等,其中I2C總線具有使用簡單的特點,在單片機、串行E2PROM、LCD等器件中具有廣泛的應用。
I2C(Inter IC BUS)是Philips公司開發(fā)的用于芯片之間連接的總線。 I2C總線用兩根信號線進行數據傳輸,一根為串行數據線(SDA),另一根為串行時鐘線(SCL)。I2C總線允許若干兼容器件(如存儲器、A/D轉換器、D/A轉換器、LCD驅動器等)共享總線。I2C總線理論上可以允許的最大設備數,是以總線上所有器件的總電容(其中包括連線本身的電容和連接端的引出電容)不超過400pF為限,總線上所有器件依靠SDA線發(fā)送的地址信號尋址,不需要片選線。任何時刻總線只能由一個主器件控制,各從器件在總線空閑時啟動數據傳輸。I2C總線數據傳輸的標準模式速率為100kbps,快速模式速率為400kbps,高速模式速率為3.4Mbps。
用VHDL和CPLD設計數字系統(tǒng)具有傳統(tǒng)方法無可比擬的優(yōu)越性,它已經成為大規(guī)模集成電路設計最為有效的一種手段。為簡單起見,本文采用VHDL設計標準模式的I2C總線控制電路。
1 I2C總線上的數據傳輸
I2C總線包含時鐘線SCL和數據線SDA兩條連線,SCL由主機產生。I2C總線的數據傳輸流程如圖1所示。其傳輸過程為:首先主機產生起始位,然后傳送第一個字節(jié)。8位數據中首先傳送的是數據的最高位MSB,最低位LSB為讀寫指示位,1表示主機讀,0表示主機寫,高7位地址可使主機尋址128個從器件。
從機收到第一字節(jié)數據后發(fā)響應位,主機收到響應位后接著發(fā)送第二個字節(jié)的數據。數據發(fā)送完畢后產生結束位,數據傳送結束。數據傳送時,只有時鐘SCL為低電平時SDA才允許切換,SCL為高電平時SDA必須穩(wěn)定,此時SDA的電平就是總線轉送的數值。
在SCL為高電平時,SDA線由高到低切換表示起始位,SDA線由低到高切換表示停止位。起始位和停止位由主機產生,在起始位產生后總線處于忙狀態(tài),停止位出現(xiàn)并經過一定時間后總線進入空閑狀態(tài)。發(fā)送器每發(fā)送一個字節(jié)后,接收器必須產生一個響應位。響應位的驅動時鐘由主機產生則接收器將SDA線拉低產生響應位。如果主機是接收器,則接收最后一個字節(jié)時,響應位為1,通知從機結束發(fā)送,否則響應位為0。當從機不能響應從機地址(例如它正在執(zhí)行一些實時函數,不能接收或發(fā)送)時,或響應了從機地址但在傳輸一段時間后不能接收更多的數據字節(jié),此時從機可以通過響應位為1通知主機終止當前的傳輸,于是主機產生一個停止位終止傳輸,或者產生重復開始位開始新的傳輸。
SDA線上傳送的數據必須為8位,每次傳送可以發(fā)送的字節(jié)數量不受限制。如果從機要完成一些其他功能(例如執(zhí)行一個內部中斷服務程序)才能接收或發(fā)送下一個數據字節(jié),則從機可以使SCL維持低電位,迫使主機進入等待狀態(tài)。從機準備好接收或發(fā)送下一個數據字節(jié)時,釋放SCL,數據傳輸繼續(xù)。
SDA和SCL都是雙向線路,使用時通過上拉電阻連接到電源。總線空閑時這兩條線路都是高電平,連接到總線的器件的輸出級必須是漏極開路或集電極開路,這樣總線才能執(zhí)行“線與”的功能。
主機發(fā)完第一個字節(jié)后,數據傳輸方向的變化可能存在三種情況。(1)傳輸方向不變,如主機向從機寫;(2)傳輸方向改變,如主機從從機讀數據;(3)傳輸方向改變多次,如主機對從機進行多次讀寫。
2 時鐘同步與仲裁
I2C總線在任何時刻只能有一個主機,當I2C總線同時有兩個或更多的器件想成為主機時,就需要進行仲裁;時鐘同步的目的就是為仲裁提供一個確定的時鐘。時鐘SCL的同步和仲裁通過“線與”來執(zhí)行,SCL的低電平時間取決于低電平時間最長的主機,高電平時間取決于高電平時間最短的主機。
仲裁過程在數據線SDA線上進行,當SCL為高電平時,如果SDA線上有主機發(fā)送低電平,則發(fā)送高電平的主機將關閉輸出級。因為總線的狀態(tài)和自身內部不一樣,于是發(fā)送低電平的主機贏得仲裁。仲裁可以持續(xù)多個位,在實際通信過程中,仲裁的第一階段比較地址位,如果多個主機尋址同一個從機,則繼續(xù)比較數據位(主機是發(fā)送機)或響應位(主機是接收機)。由于I2C總線上的地址和數據由贏得總線的主機決定,因此仲裁過程中不會丟失信息。如果一個主機具有從機功能,則當它失去仲裁時,必須立即切換到從機狀態(tài),因為它可能正在被其他主機尋址。