IIC時序分析

TATAzml發表於2024-05-25
轉載部落格:https://www.cnblogs.com/liujinggang/p/9656358.html以及https://www.cnblogs.com/xuyan123/p/14134246.html
我也怕什麼時候大神把部落格刪除了,後面這個連結簡單明瞭,一下就讓我看明白了iic的基礎。

一.IIC匯流排協議介紹:     

I2C匯流排是由資料線SDA和時鐘SCL構成的序列匯流排,可傳送和接收資料,並且在硬體上都需要接一個上拉電阻到VCC。

各種被控制電路均並聯在這條匯流排上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模組都有唯一的地址,這樣,各控制電路雖然掛在同一條匯流排上,卻彼此獨立,互不相關。   

二.IIC的通訊狀態

總的來說,IIC匯流排在通訊的過程中一共有一下幾種狀態:   

1、空閒狀態   

IIC 匯流排的 SDA 和 SCL 兩條訊號線同時處於高電平時,規定為匯流排的空閒狀態。此時各個器件的輸出級場效電晶體均處在截止狀態,即釋放匯流排,由兩條訊號線各自的上拉電阻把電平拉高。   

2、起始狀態和結束狀態   

在時鐘線 SCL 保持高電平期間,資料線 SDA 上的電平被拉低(即負跳變),定義為 I2C 匯流排匯流排的起始訊號,它標誌著一次資料傳輸的開始。起始訊號是由主控器主動建立的,在建立該訊號之前 I2C 匯流排必須處於空閒狀態。   

在時鐘線 SCL 保持高電平期間,資料線 SDA 被釋放,使得 SDA 返回高電平(即正跳變),稱為 I2C 匯流排的停止訊號,它標誌著一次資料傳輸的終止。停止訊號也是由主控器主動建立的,建立該訊號之後,I2C 匯流排將返回空閒狀態。   

起始訊號和結束訊號如下圖所示

3、有效的資料位傳輸

  在 IIC 匯流排上傳送的每一位資料都有一個時鐘脈衝相對應(或同步控制),即在 SCL 序列時鐘的配合下,資料在 SDA 上從高位向低位依次序列傳送每一位的資料。進行資料傳送時,在 SCL 呈現高電平期間,SDA 上的電平必須保持穩定,低電平為資料 0,高電平為資料 1。只有在 SCL 為低電平期間,才允許 SDA 上的電平改變狀態。下圖是0xaa在IIC匯流排上有效傳輸(有效傳輸是指第9個時鐘的高電平期間,從機給主機反饋了一個有效的應答位0)的圖示

4、應答訊號與非應答訊號

    I2C 匯流排上的所有資料都是以 8 位位元組傳送的,傳送器(主機)每傳送一個位元組,就在第9個時鐘脈衝期間釋放資料線,由接收器(從機)反饋一個應答訊號。應答訊號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接收了該位元組;應答訊號為高電平時,規定為非應答位(NACK),一般表示接收器接收該位元組沒有成功。對於反饋有效應答位 ACK 的要求是,接收器在第 9 個時鐘脈衝之前的低電平期間將 SDA 線拉低,並且確保在該時鐘的高電平期間為穩定的低電平。

    對非應答位(NACK)還要特別說明的是,還有以下四種情況IIC通訊過程中會產生非應答位:

      1、接收器(從機)正在處理某些實時的操作無法與主機實現IIC通訊的時候,接收器(從機)會給主機反饋一個非應答位(NACK)

      2、主機傳送資料的過程中,從機無法解析傳送的資料,接收器(從機)也會給主機反饋一個非應答位(NACK)

      3、主機傳送資料的過程中,從機無法再繼續接收資料,接收器(從機)也會給主機反饋一個非應答位(NACK)

      4、主機從從機中讀取資料的過程中,主機不想再接收資料,主機會給從機反饋一個非應答位(NACK),注意,這種情況是主機給從機反饋一個非應答位(NACK)

  關於有效應答位的圖示在上一傳輸0xaa的圖中可以清楚的看到,關於非應答位的圖示見下圖

三.IIC寫資料

  1、主機透過IIC匯流排往從機裡面寫資料

    主機透過IIC匯流排往從機中寫資料的時候,主機首先會傳送一個起始訊號,接著把IIC從機的7位裝置地址後面添一個0(裝置地址後面的0表示主機向從機寫資料,1表示主機從從機中讀資料)組成一個8位的資料,把這個8位的資料發給從機,發完這8位的資料以後主機馬上釋放SDA訊號線等待從機的應答,如果從機正確收到這個資料,從機就會傳送一個有效應答位0給主機告訴主機自己已經收到了資料,主機收到從機的有效應答位以後 ,接下來主機會傳送想要寫入的暫存器地址,暫存器傳送完畢以後主機同樣會釋放SDA訊號線等待從機的應答,從機如果正確收到了主機發過來的暫存器地址,從機會再次傳送一個有效應答位給主機,主機收到從機的有效應答位0以後,接下來主機就會給從機傳送想要寫入從機的資料,從機正確收到這個資料以後仍然像之前兩次一樣會給主機傳送一個有效應答位,主機收到這個有效應答位以後給從機傳送一個停止訊號,整個傳輸過程就結束了。下圖是整個傳輸過程的示意圖:

 特別注意:上圖中灰色的地方表示主機正在控制SDA訊號線,白色的地方表示從機正在控制SDA訊號線。

 

四.IIC讀資料

 1、主機透過IIC匯流排從從機裡面讀資料

    主機透過IIC匯流排從從機中讀資料的過程與寫資料的過程有相似之處,但是讀資料的過程還多了一些額外的步驟。主機從從機讀資料時主機首先會傳送一個起始訊號,接著把IIC從機的7位裝置地址後面添一個0(裝置地址後面的0表示主機向從機寫資料,1表示主機從從機中讀資料),把這個8位的資料發給從機,發完這8位的資料以後主機馬上釋放SDA訊號線等待從機的應答,如果從機正確收到這個資料,從機就會傳送一個有效應答位0給主機告訴主機自己已經收到了資料,主機收到從機的有效應答位以後 ,接下來主機會傳送想要讀的暫存器地址,暫存器傳送完畢以後主機同樣會釋放SDA訊號線等待從機的應答,從機如果正確收到了主機發過來的暫存器地址,從機會再次傳送一個有效應答位給主機,主機收到從機的有效應答位0以後,主機會給從機再次傳送一次起始訊號,接著把IIC從機的7位裝置地址後面添一個1(裝置地址後面的0表示主機向從機寫資料,1表示主機從從機中讀資料),注意,第一次是在裝置地址後面添0,這一次是在裝置地址後面添1,把這個8位的資料發給從機,發完這8位的資料以後主機馬上釋放SDA訊號線等待從機的應答,如果從機正確收到這個資料,從機就會傳送一個有效應答位0給主機告訴主機自己已經收到了資料,接著從機繼續佔用SDA訊號線給主機傳送暫存器中的資料,傳送完畢以後,主機再次佔用SDA訊號線傳送一個非應答訊號1給從機,主機傳送一個停止訊號給從機結束整個讀資料的過程。下圖是整個讀資料過程的示意圖

特別注意:上圖中灰色的地方表示主機正在控制SDA訊號線,白色的地方表示從機正在控制SDA訊號線。

到這裡其實已經可以大概明白了,下面就是原作者給的一些具體例子

五.具體例子

  1、編寫IIC匯流排主機給從機傳送資料的程式碼,實現FPGA(主機)往EEPROM(從機)的0x23這個地址寫入0x45這個資料

  2、編寫IIC匯流排主機從從機接收資料的程式碼,實現FPGA(主機)從EEPROM(從機)的0x23這個地址讀出0x45這個資料,並用0x45這個資料的低四位驅動4個LED

(5.1) IIC傳送模組

傳送一個位元組的資料之前必須要先傳送起始位,然後傳送控制位元組,接著等待應答,然後在傳送字地址,接著在等待應答。資料傳送完畢以後,在等待最後一個應答,應答成功後傳送停止訊號結束整個過程。

抓到的時序圖:

為了更清晰的說明上面的時序,我把起始訊號,停止訊號,每個位元以及應答位全部框出來進一步解釋如下:

(5.2) IIC接收模組

接收一個位元組的資料的過程與傳送一個位元組資料相比多了一個第二次的起始訊號與控制位元組(CONTROL BYTE),而且第二個控制位元組(CONTROL BYTE)的最低位應該為1,表示IIC主機(FPGA)從IIC從機(24LC04)中讀資料,當主機(FPGA)想結束讀資料的過程時,它會給IIC裝置傳送一個非應答位1,最後在傳送停止訊號結束整個讀資料的過程。

 由於EEPROM是一種非易失性儲存器,所以做在IIC傳送資料的實驗中往24LC04的0x23地址中的0x45這個資料在掉電以後並不會丟失。剛好可以透過這個接收模組給讀出來,並用讀出資料的最低位驅動四個LED燈,如果時序正確的話,四個LED燈會間隔亮起來。下面是我抓到的接收資料時序圖:

  透過上面的時序圖可以清楚的看到成功讀出了EEPROM中的0x45這個資料,並且我板子上的四個LED燈也間隔亮了起來。

  為了更清晰的說明上面的時序,我把起始訊號,停止訊號,每個位元,應答位和非應答位全部框出來進一步解釋如下:

主要看基礎介紹那裡就行,基本一下就能看明白基礎,後面的例子可以自己分析。

相關文章