掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

隨著國內積體電路產業的高速發展,目前晶片業已經從原來的LDO,DC-DC,音訊功放等低端市場轉向混合訊號類晶片,如ADC、EEPROM等中高階市場,而混合訊號類晶片絕大多數都包含SPI或者I2C匯流排,所以,能夠正確的理解並熟悉其匯流排協議,將會對我們的測試除錯帶來很大的方便,下面將簡單介紹這兩種匯流排協議,以幫助測試工程師理解並掌握。

1、SPI匯流排簡介

同步外設介面(SPI)是由摩托羅拉公司開發的全雙工同步序列匯流排,該匯流排大量用在與EEPROM、ADC、FRAM和顯示驅動器之類的慢速外設器件通訊。

SPI(Serial Peripheral Interface 序列外設介面)是一種串行同步通訊協議,由一個主裝置和一個或多個從裝置組成,主裝置啟動一個與從裝置的同步通訊,從而完成資料的交換。SPI 介面由SDI(序列資料輸入),SDO(序列資料輸出),SCK(序列移位時鐘),CS(從使能訊號)四種訊號構成。 傳輸的速率由時鐘訊號SCK決定,通訊時,SI為資料輸入、SO為資料輸出,資料在時鐘的上升或下降沿由SDO 輸出,在緊接著的下降或上升沿由SDI 讀入,這樣經過8/16 次時鐘的改變,完成8/16 位資料的傳輸。

採用SPI匯流排的系統下圖所示,它包含了一個主片和多個從片,主片透過發出片選訊號-CS來控制對哪個從片進行通訊,當某個從片的CS訊號有效時,能透過SI接收指令、資料,並透過SO發回資料。而未被選中的從片的SO端處於高阻狀態。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

SPI匯流排的系統

在SPI傳輸中,資料是同步進行傳送和接收的。資料傳輸的時鐘基於來自主處理器的時鐘脈衝,摩托羅拉沒有定義任何通用SPI的時鐘規範。然而,最常用的時鐘設定基於時鐘極性(CPOL)和時鐘相位(CPHA)兩個引數,CPOL定義SPI序列時鐘的活動狀態,而CPHA定義相對於SO-資料位的時鐘相位。CPOL和CPHA的設定決定了資料取樣的時鐘沿。

2、資料方向和通訊速度。

SPI傳輸序列資料時首先傳輸最高位。波特率可以高達5Mbps,具體速度大小取決於SPI硬體。例如,Xicor公司的SPI序列器件傳輸速度能達到5MHz。

3、

SPI匯流排介面及時序

SPI匯流排包括1根串行同步時鐘訊號線以及2根資料線。SPI模組為了和外設進行資料交換,根據外設工作要求,其輸出串行同步時鐘極性和相位可以進行配置,時鐘極性(CPOL)對傳輸協議沒有重大的影響。

如果CPOL=0,串行同步時鐘的空閒狀態為低電平;如果CPOL=1,串行同步時鐘的空閒狀態為高電平。時鐘相位(CPHA)能夠配置用於選擇兩種不同的傳輸協議之一進行資料傳輸。如果CPHA=0,在串行同步時鐘的第一個跳變沿(上升或下降)資料被取樣;如果CPHA=1,在串行同步時鐘的第二個跳變沿(上升或下降)資料被取樣。

SPI主模組和與之通訊的外裝置時鐘相位和極性應該一致。SPI主模組和與之通訊的外裝置時鐘相位和極性應該一致。個人理解這句話有2層意思:

其一,主裝置SPI時鐘和極性的配置應該由外設來決定;其二,二者的配置應該保持一致,即主裝置的SDO同從裝置的SDO配置一致,主裝置的SDI同從裝置的SDI配置一致。因為主從裝置是在SCLK的控制下,同時傳送和接收資料,並透過2個雙向移位暫存器來交換資料。SPI介面時序如圖3、圖4所示。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

4、SPI協議心得

4。1、

SPI介面時鐘配置心得:

在主裝置這邊配置SPI介面時鐘的時候一定要弄清楚從裝置的時鐘要求,因為主裝置這邊的時鐘極性和相位都是以從裝置為基準的。因此在時鐘極性的配置上一定要搞清楚從裝置是在時鐘的上升沿還是下降沿接收資料,是在時鐘的下降沿還是上升沿輸出資料。但要注意的是,由於主裝置的SDO連線從裝置的SDI,從裝置的SDO連線主裝置的SDI,從裝置SDI接收的資料是主裝置的SDO傳送過來的,主裝置SDI接收的資料是從裝置SDO傳送過來的,所以主裝置這邊 SPI時鐘極性的配置(即SDO的配置)跟從裝置的SDI接收資料的

極性是相反

的,跟從裝置SDO傳送資料的極性是相同的。下面這段話是Sychip Wlan8100 Module Spec上說的,充分說明了時鐘極性是如何配置的:

The 81xx module will always input data bits at the rising edge of the clock, and the host will always output data bits on the falling edge of the clock。

意思是:主裝置在時鐘的下降沿傳送資料,從裝置在時鐘的上升沿接收資料。因此主裝置這邊SPI時鐘極性應該配置為下降沿有效。

又如,下面這段話是摘自LCD Driver IC SSD1289:

SDI is shifted into 8-bit shift register on every rising edge of SCK in the order of data bit 7, data bit 6 …… data bit 0。

意思是:從裝置SSD1289在時鐘的上升沿接收資料,而且是按照從高位到地位的順序接收資料的。因此主裝置的SPI時鐘極性同樣應該配置為下降沿有效。

時鐘極性和相位配置正確後,資料才能夠被準確的傳送和接收。因此應該對照從裝置的SPI介面時序或者Spec文件說明來正確配置主裝置的時鐘。

5、

I2C(Inter-Integrated Circuit)匯流排

I2C匯流排是一種由PHILIPS公司開發的兩線式序列匯流排,用於連線微控制器及其外圍裝置。I2C匯流排產生於在80年代,最初為音訊和影片裝置開發,如今主要在伺服器管理中使用,其中包括單個元件狀態的通訊。例如管理員可對各個元件進行查詢,以管理系統的配置或掌握元件的功能狀態,如電源和系統風扇。可隨時監控記憶體、硬碟、網路、系統溫度等多個引數,增加了系統的安全性,方便了管理。I2C匯流排系統如下圖所示:

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

I2C匯流排系統

5、I2C匯流排特點

I2C匯流排最主要的優點是其簡單性和有效性。由於介面直接在元件之上,因此I2C匯流排佔用的空間非常小,減少了電路板的空間和晶片管腳的數量,降低了互聯成本。

匯流排的長度可高達25英尺,並且能夠以10Kbps的最大傳輸速率支援40個元件。

I2C匯流排的另一個優點是,它支援多主控(multimastering), 其中任何能夠進行傳送和接收的裝置都可以成為主匯流排。

一個主控能夠控制訊號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。

7、I2C匯流排工作原理

7.1 匯流排的構成及訊號型別

I2C匯流排是由資料線SDA和時鐘SCL構成的序列匯流排,可傳送和接收資料。在CPU與被控IC之間、IC與IC之間進行雙向傳送,最高傳送速率100kbps。各種被控制電路均並聯在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模組都有唯一的地址,在資訊的傳輸過程中,I2C總線上並接的每一模組電路既是主控器(或被控器),又是傳送器(或接收器),這取決於它所要完成的功能。

CPU發出的控制訊號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定該調整的類別(如對比度、亮度等)及需要調整的量。這樣,各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。I2C匯流排電路如下圖所示:

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

I2C匯流排電路

I2C匯流排在傳送資料過程中共有三種類型訊號, 它們分別是:開始訊號、結束訊號和應答訊號。

開始訊號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送資料。

結束訊號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送資料。

應答訊號:接收資料的IC在接收到8bit資料後,向傳送資料的IC發出特定的低電平脈衝,表示已收到資料。CPU向受控單元發出一個訊號後,等待受控單元發出一個應答訊號,CPU接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未收到應答訊號,由判斷為受控單元出現故障。

8、I2C匯流排的時鐘訊號

在I2C總線上傳送資訊時的時鐘同步訊號是由掛接在SCL時鐘線上的所有器件的邏輯“與”完成的。SCL線上由高電平到低電平的跳變將影響到這些器件,一旦某個器件的時鐘訊號變為低電平,將使SCL線上所有器件開始並保護低電平期。此時,低電平週期短的器件的時鐘由低至高的跳變並不影響SCL線的狀態,這些器件將進入高電平等待的狀態。

當所有器件的時鐘訊號都變為高電平時,低電平期結束,SCL線被釋放返回高電平,即所有的器件都同時開始它們的高電平期。其後,第一個結束高電平期的器件又將SCL線拉成低電平。這樣就在SCL線上產生一個同步時鐘。可見,時鐘低電平時間由時鐘低電平期最長的器件決定,而時鐘高電平時間由時鐘高電平期最短的器件決定。

9、I2C匯流排的傳輸協議與資料傳送

9.1、起始和停止條件

在資料傳送過程中,必須確認資料傳送的開始和結束。在I2C匯流排技術規範中,開始和結束訊號(也稱啟動和停止訊號)的定義如圖3所示。

開始訊號:當時鍾匯流排SCL為高電平時,資料線SDA由高電平向低電平跳變,開始傳送資料。

結束訊號:當SCL線為高電平時,SDA線從低電平向高電平跳變,結束傳送資料。

開始和結束訊號都是由主器件產生。在開始訊號以後,匯流排即被認為處於忙狀態,其它器件不能再產生開始訊號。主器件在結束訊號以後退出主器件角色,經過一段時間過,匯流排被認為是空閒的。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

超始和停止訊號圖

9.2、位元組格式

I2C匯流排資料傳送採用時鐘脈衝逐位序列傳送方式,在SCL的低電平期間,SDA線上高、低電平能變化,在高電平期間,SDA上資料必須保護穩定,以便接收器取樣接收,時序如下圖所示。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

資料傳送時序圖

I2C匯流排傳送器送到SDA線上的每個位元組必須為8位長,傳送時高位在前,低位在後。與之對應,主器件在SCL線上產生8個脈衝;第9個脈衝低電平期間,傳送器釋放SDA線,接收器把SDA線拉低,以給出一個接收確認位;第9個脈衝高電平期間,傳送器收到這個確認位然後開始下一位元組的傳送,下一個位元組的第一個脈衝低電平期間接收器釋放SDA。每個位元組需要9個脈衝,每次傳送的位元組數是不受限制的。

每個位元組後必須跟著一個ACK應答位,資料從最高有效位(MSB)開始傳輸。如果從機要執行一些功能後才能接收或者傳送新的完整資料,比如說服務一個內部中斷,那麼它可以將時鐘線SCL拉低來強制使主機進入wait狀態,當從機準備好新的位元組資料傳輸時,釋放時鐘線SC,資料傳輸便繼續進行。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

每個位元組後都有ACK發生,ACK應答位允許接收器通知傳送器位元組成功接收了下一個位元組可以傳送了。主機產生所有的時鐘脈衝,包括應答位的第9個時鐘脈衝。

ACK應答訊號是如下定義的:在ACK的第9個時鐘脈衝中傳送器釋放SDA線,所以接收器可以將SDA拉低,使得在這個時鐘脈衝的高電平期間保證SDA是低電平。建立和保持時間也應該計算在內。當在第9個時鐘脈衝期間SDA仍然是高,這時定義為NACK訊號,這時主機可以產生一個終止條件來終止傳輸,或者一個重複的開始條件來開始一個新的傳輸,這裡有5種情況導致NACK的產生:

1、匯流排當前的傳輸地址上沒有接收器,所以沒有裝置用ACK來響應;

2、因為接收者正在處理一些實時的功能,尚未準備與主機的通訊,所以接收者不能收發;

3、在傳輸期間,接收者收到不能識別的資料或者命令;

4、在傳輸期間,接收者無法接收更多的資料位元組;

5、主-接收器要通知從-傳送器傳輸的結束。

9.3、響應

資料傳輸必須帶響應。相關的響應時鐘脈衝由主機產生,當主器件傳送完一位元組的資料後,接著發出對應於SCL線上的一個時鐘(ACK)認可位,此時鐘內主器件釋放SDA線,一位元組傳送結束,而從器件的響應訊號將SDA線拉成低電平,使SDA在該時鐘的高電平期間為穩定的低電平。從器件的響應訊號結束後,SDA線返回高電平,進入下一個傳送週期。

通常被定址的接收器在接收到的每個位元組後必須產生一個響應。當從機不能響應從機地址時,從機必須使資料線保持高電平,主機然後產生一個停止條件終止傳輸或者產生重複起始條件開始新的傳輸。如果從機接收器響應了從機地址但是在傳輸了一段時間後不能接收更多資料位元組,主機必須再一次終止傳輸。這個情況用從機在第一個位元組後沒有產生響應來表示。從機使資料線保持高電平主機產生一個停止或重複起始條件。完整的資料傳送過程下圖圖所示。

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

完整的資料傳送過程

I2C匯流排還具有廣播呼叫地址用於定址總線上所有器件的功能。若一個器件不需要廣播呼叫定址中所提供的任何資料,則可以忽咯該地址不作響應。如果該器件需要廣播呼叫定址中按需提供的資料,則應對地址作出響應,其表現為一個接收器。

10、匯流排基本操作

I2C規程運用主/從雙向通訊。器件傳送資料到總線上,則定義為傳送器,器件接收資料則定義為接收器。主器件和從器件都可以工作於接收和傳送狀態。匯流排必須由主器件(通常為微控制器)控制,主器件產生序列時鐘(SCL)控制匯流排的傳輸方向,併產生起始和停止條件。SDA線上的資料狀態僅在SCL為低電平的期間才能改變,SCL為高電平的期間,SDA狀態的改變被用來表示起始和停止條件。參見下圖:

掌握SPI和I2C匯流排協議心得,除錯起來果然方便多了......

序列總線上的資料傳送順序

備註:部分圖片來源於網路,侵刪!