1. 程式人生 > >IIC匯流排協議基礎1

IIC匯流排協議基礎1

文件類別

文件標識

IIC匯流排協議基礎1

當前版本

V0.2

作    者

Louis

完成時間

2015-05-27

IIC匯流排協議基礎1

1.IIC時序基礎知識

SDA:雙向資料線引腳,用來傳輸序列資料。引腳一般為開漏結構,可以和其他的開漏極或開集電極進行“線與”。【不同手冊上看到有“線或”的說法,應該不對】

SCL:時鐘輸入引腳。【有些資料說是在SCL的上升沿才能將資料寫入AT24C02中,在SCL的下降沿才能從 AT24C02 中讀出資料,這是不正確的。實際測試:在SCL的下降沿後再從SDA總線上去讀取資料,資料有誤。】

開始時序:在SCL高電平時SDA出現一個下降沿;

結束時序:在SCL高電平時SDA出現一個上升沿;

 

資料SDL變化必須在SCL低電平的時候變化。並且在SCL高電平時保持不變,否則會被誤認為是命令(開始/結束)條件。

SCL一直由Master控制,SDA依照資料傳送的方向,讀資料時由Slave控制SDA,寫資料時由Master控制SDA。當8位資料傳送完畢之後,應答位ACK或者非應答位NACK的SDA控制權與資料位傳送時相反。

寫資料的時候,Master每傳送完8個數據位,Slave裝置如果還有空間接受下一個位元組應該回答“ACK”,Slave裝置如果沒有空間接受更多的位元組應該回答“NACK”,Master當收到“NACK”或者一定時間之後沒收到任何資料將視為超時,此時Master放棄資料傳送,傳送“Stop”。

讀資料的時候,Slave裝置每傳送完8個數據位,如果Master希望繼續讀下一個位元組,Master應該回答“ACK”以提示Slave準備下一個數據,如果Master不希望讀取更多位元組,Master應該回答“NACK”以提示Slave裝置準備接收Stop訊號。

MASTER 指主控制端,在一般系統中就是我們常說的微控制器了;

SLAVE是指具備I2C協議的專用IC,比如24C16、14C32等。

在資料傳送器傳送完8個位數據後,就會把SDA釋放(拉高,因為IIC外部上拉)。裝置在接收完畢8個位後,在第9個時鐘SCL,裝置將SDA拉低,產生應答ACK,來告訴資料傳送器收到資料了。當傳送器檢測到SDA被拉低,就知道裝置接收器接收完畢資料了。

 

非應答(NACK)一般發生在主機讀取資料時,當主機要結束讀取資料時,就會發出非應答NACK。

如果slave方是硬體i2c要求一定要標準的NACK,master方是GPIO軟體模擬i2c若沒有正確的傳送NACK,就會出現“slave收不到stop”導致i2c掛死。

MASTER向SLAVE傳送資料

MASTER每次向SLAVE端傳送8位資料後,就會將SDA置1,等待SLAVE端的確認;SLAVE端如果正確接受到資料,就會自動將SDA置0。程式能做的只是檢測確認訊號,即每傳送完8位資料後就檢測一次SDA的狀態,如果是0,則讓程式繼續往下執行,如果是1則強迫MASTER將剛才的8位資料再發送一遍;當然,如果SDA一直是1,也就是SLAVE一直未能正確接受到資料,也不能一直讓MASTER反覆傳送,要做TIMEOUT處理,以防系統宕機。

MASTER從SLAVE讀取資料:

MASTER從SLAVE端讀取資料,情況與傳送資料有所區別,在讀到最後8位資料時,要SDA1,也就是做NACK動作,讓系統知道讀取資料到此結束;這個置1動作由程式來做,因為資料讀到哪裡結束,只有程式設計師知道。

IIC資料傳輸方式

    NOTEIICMSB FIRST傳送的

即在傳送完一個位元組後(開始+8資料+ACK),沒有傳送STOP的情況下,繼續下一次START(就是指repeatstart)。這個需要注意的是在第9個時鐘之後和REPEAT START之間SDA要有一定的延時Tbuf(一般有個最小值)。

 


內部寫入週期器件,STOP和下一次的START之間需要有個延時Twr,保證裝置寫好資料。一般手冊給出一個Twr最大值。

注意:英文資料裡要求24c02內部寫資料最大時間為10ms,也就是說在軟體設計時,應該把2次寫記憶時間間隔控制在大於Twr時間即間隔大於10ms,這樣就不會有問題了,不同的晶片Twr時間相差很大,一般以參考手冊為準。

NOTEIICMSB FIRST傳送的

 


2.IIC裝置

(以AT24C02器件為物件來介紹)

SDA引腳通常由外部裝置上拉。SDA上的資料只有在SCL是low的時候才可以變化。如果SDA上的資料在SCL的high期間內變化,那麼將會被認為是開始/結束條件。

 

在SCL的high期間,SDA從high-到-low變化,就會觸發一個開始條件。這個條件必須在其他任何指令開始之前發出的。

在SCL的high期間,SDA從low-到-high變化,就會觸發一個結束條件。在讀時序之後,收到一個停止條件,將會使EEPROM進入待機模式。

 

所有的資料和地址資訊都是通過8-bit的形式進行來回傳輸的。EEPROM將傳送一個0來應答,表示它已經接收到每個位元組了。這個時刻發生在第9個SCL。

 

AT24C02有待機模式的特性,如下形式將進入待機模式:

(1)      上電後;

(2)      接收到STOP,或者完成了內部所有操作後;

在協議中斷,掉電或者系統復位後,可以通過如下步驟進行復位:

(1)      傳送一個START條件;

(2)      傳送9個時鐘;

(3)      再發送一個START條件,並緊跟著一個STOP條件。

2K EEPROM裝置需要在一個START條件後面,跟上一個8-bit的裝置地址使能晶片讀、寫功能。

 

裝置地址的高4位由固定的1和0組成。通常在EEPROM裝置中的高四位地址都是一樣的。【不知道為什麼???

緊接著3位是2K EEPROM的A2、A1、A0裝置地址位,這三位是用來區分EEPROM裝置的,需要和硬體地址相等。

最後,第8位是裝置地址的READ/WRITE讀/寫位。此位置1表示讀操作,此為置0為寫操作。

當裝置地址對比之後,EEPROM將會反饋輸出一個0.假如比較結果不對,那麼晶片(EEPROM)將進入待機狀態。


1010 111 R/W

1010 000 R/W

AT24C02裝置地址的高4位由固定的1和0組成。接著3位是EEPROM的裝置地址位A2、A1、A0。第8位是裝置地址的READ/WRITE讀/寫位。此位置1表示讀操作,此為置0為寫操作。

寫操作需要傳送裝置地址,並跟隨一個8-bit位資料地址和ACK。在接收到地址後,EEPROM將再次響應輸出0,然後進入第一個8-bit資料的時鐘。接收到8-bit資料後,EEPROM將輸出一個0,定址裝置(主裝置)必須傳送一個STOP條件結束寫操作。這樣EEPROM就進入內部寫入階段(internally timed write cycle .[twr]),避免外部對memory進行操作。在這個階段,所有輸入無效,並且EEPROM不會有任何響應,直到內部寫完畢。

 

這個2K的EEPROM能夠進行8-byte頁寫入。

Page寫入和byte寫入的初始化是一樣的,只是控制器在傳送完第一個資料後,不傳送STOP條件。而是在第一個資料的ACK後,連續在傳送後面的7個數據位元組。EEPROM將在接收到每個資料位元組後,均會產生一個ACK來響應(控制器)。傳送完8個位元組後,控制器必須傳送一個STOP條件來結束PAGE寫入。

資料地址的低3位bit在接收到每個資料後,都會自動增加。資料地址的高5位bit資料不增加,保持在當前頁【row location】。

如果寫入資料的地址,自動增加達到了PAGE邊緣,那麼接下去的位元組將會從本頁從頭開始覆蓋儲存(“roll over”)。就是所如果在寫入頁的資料大於8byte(8-byte容量的page),那麼多於的資料將會從本頁從頭寫入,並覆蓋掉先前的資料。所以在寫入資料大於PAGE容量時,在寫完一個PAGE,就需要STOP,然後重新開始,並寫入下一頁的地址,在開始寫入資料。

    一旦進入內部寫週期,將開啟輪詢應答,外部對EEPROM的輸入將失效。此時如果傳送一個START條件,和裝置地址給EEPROM,只有當內部寫週期完成後,EEPROM裝置才會產生應答ACK。

    有三種讀操作:讀取當前地址資料,隨機地址讀取,連續地址讀取。

只要晶片電源沒有掉電,在進行上一次A地址的讀寫操作之後,(A+1)地址就會一直有效。在讀取資料中出現的“roll over”,指的是從最後一頁的最後一個位元組,跳到第一頁的第一個位元組。【和寫時候出現的“roll over”是不一樣的】

    一旦在傳送裝置地址時,write/read位被設為1,並得到EEPROM應答ACK,那麼當前地址(就是前文中的【A+1】地址)的資料就會被輸出。控制器接收到資料後,不產生應答ACK【即產生非應答(NACK)】,而是在後面產生一個STOP條件

【非應答:當控制器想結束訪問資料後,就將SDA拉高,結束讀取資料。但記得在NACK後要跟隨一個STOP】。

    隨機讀取資料,需要一個“dummy”操作,即:傳送裝置地址+寫操作(得到EEPROM應答ACK),並跟隨傳送需要訪問資料的地址。當這個動得到EEPROM的應答ACK,控制器必須再次產生一個START條件,接著傳送裝置地址+讀操作,在得到EEPROM應答ACK後,EEPROM接著就會發送出控制器要訪問資料的地址。控制器接收到資料後,不產生應答ACK【即產生非應答(NACK)】,而是在後面產生一個STOP條件。

 

可以看出“隨機地址讀”比“當前地址讀”多了一個“偽寫入”動作:

2.4.3 連續地址讀

連續讀取初始化,可以通過“當前地址讀取”或者“隨機地址讀取”操作來啟動。只是在控制器接收到以第一位元組後,控制器需要產生一個應答ACK給EEPROM。EEPROM一旦收到ACK,EEPROM就會繼續將資料地址+1,傳送資料。

當EEPROM的memory地址到達極限後,資料地址將會“roll over”,同時會繼續讀取資料。當控制器要終止連續讀操作,控制器不產生應答ACK【即產生非應答(NACK)】,而是在後面產生一個STOP條件。

 

注意:

當控制器要終止連續讀操作,直接給停止訊號也是可以結束此次讀操作,但是會對後面的操作帶來影響。非應答訊號在需要的時候必須給。

[1] Atmel AT24C02B datasheet

[2] NXP Semiconductors UM10204 datasheet