本節來學習IIC介面下的24C02 驅動分析,本節學完後,再來學習Linux下如何使用IIC操作24C02 1.I2C通信介紹 它是由數據線SDA和時鐘SCL構成的串列匯流排,可發送和接收數據,是一個多主機的半雙工通信方式 每個掛接在匯流排上的器件都有個唯一的地址 位速在標準模式下可達 100kbit/ ...
本節來學習IIC介面下的24C02 驅動分析,本節學完後,再來學習Linux下如何使用IIC操作24C02
1.I2C通信介紹
它是由數據線SDA和時鐘SCL構成的串列匯流排,可發送和接收數據,是一個多主機的半雙工通信方式
每個掛接在匯流排上的器件都有個唯一的地址
位速在標準模式下可達 100kbit/s,在快速模式下可達400kbit/s,在高速模式下可待3.4Mbit/s。
2. I2C匯流排系統結構,如下所示
其中SCL時鐘線的頻率由主機提供,且從機不能主動來引起數據傳輸,必須等待主機先發信號才行
兩個或多個主機同時發起數據傳輸時,可以通過衝突檢測和仲裁來防止數據被破壞。
3.I2C時序介紹
1)空閑狀態
當匯流排上的SDA和SCL兩條信號線同時處於高電平,便是空閑狀態,如上面的硬體圖所示,當我們不傳輸數據時, SDA和SCL被上拉電阻拉高,即進入空閑狀態
2)起始信號
當SCL為高期間,SDA由高到低的跳變;便是匯流排的啟動信號,只能由主機發起,且在空閑狀態下才能啟動該信號,如下圖所示:
3)停止信號
當SCL為高期間,SDA由低到高的跳變;便是匯流排的停止信號,表示數據已傳輸完成,如下圖所示:
4)傳輸數據格式
當發了起始信號後,就開始傳輸數據,傳輸的數據格式如下圖所示:
當SCL為高電平時,便會獲取SDA數據值,其中SDA數據必須是穩定的(若SDA不穩定就會變成起始/停止信號)
當SCL為低電平時,便是SDA的電平變化狀態
若主從機在傳輸數據期間,需要完成其它功能(例如一個中斷),可以主動拉低SCL,使I2C進入等待狀態,直到處理結束再釋放SCL,數據傳輸會繼續
5)應答信號ACK
I2C匯流排上的數據都是以8位數據(位元組)進行的,當發送了8個數據後,發送方會在第9個時鐘脈衝期間釋放SDA數據,當接收方接收該位元組成功,便會輸出一個ACK應答信號,當SDA為高電平,表示為非應答信號NACK,當SDA為低電平,表示為有效應答信號ACK
PS:當主機為接收方時,收到最後一個位元組後,主機可以不發送ACK,直接發送停止信號來結束傳輸。
當從機為接收方時,沒有發送ACK,則表示從機可能在忙其它事、或者不匹配地址信號和不支持多主機發送,主機可以發送停止信號再次發送起始信號啟動新的傳輸
6)完整的數據傳輸
如下圖所示, 發送起始信號後,便發送一個8位的設備地址,其中第8位是對設備的讀寫標誌,後面緊跟著的就是數據了,直到發送停止信號終止
PS:當我們第一次是讀操作,然後想換成寫操作時,可以再次發送一個起始信號,然後發送讀的設備地址,不需要停止信號便能實現不同的地址轉換
4. AT24C02介紹
AT24C02是通過I2C實現通訊的,是一個存儲晶元,能夠存儲2Kb(256KB)數據
4.1它的的硬體圖如下:
其中A2~A0,是這個24C02設備的硬體地址,接GND表示硬體地址都為0
4.2其中AT24C02的數據格式如下所示:
4.3打開AT24C02數據手冊,它的設備地址如下圖所示:
其中A2~A1表示硬體地址,P2~P0表示page頁地址
bit[0]地址:表示讀/寫狀態(所有I2C器件都是這樣,最低位表示方向位)
4.3.1 為什麼需要page頁地址?
因為I2C的數據位是8位,而AT24CXX的讀寫地址值最大可以為2048(2^11),超過了I2C的數據位
而page頁地址就是用來解決這個問題的
比如AT24C16:
當設備地址=0XA1, P[2:0]=0x01,要讀的地址=0x00,表示要讀的真正地址=0x01*256+0=0x100,轉化為二進位= 1 0000 0000
當設備地址=0XA0, P[2:0]=0x00,要讀的地址=0xff,表示要讀的真正地址=0x00*256+0xFF=0xFF,轉化為二進位= 0 1111 1111
4.3.2 如上圖所示,對於AT240C02來講:
- 晶元的容量小於等於2^8(256)位元組,那麼讀寫地址就用8bit來表示,所以設備地址里沒有P2~P0
- 讀操作時,發送的設備地址等於0XA1
- 寫操作時,發送的設備地址等於0XA0
5. AT24C02時序圖介紹
5.1寫時序介紹
當隨機寫一個位元組時,只需要先發送一個起始信號,然後跟上0XA0設備地址,以及要寫的起始地址值,後面便是要寫入地址的data,如果需要連續寫數據,只需要連續寫入data,地址會自動加1,直到發送停止信號結束
5.2讀時序介紹
當隨機讀一個位元組時,先發送第一個起始信號,然後寫入0XA0設備地址和要讀的地址值,
接著發送第二個起始信號,然後寫入0XA1設備地址,接著就是要讀的data,如果需要連續讀數據,只需要連續讀出data,地址會自動加1,直到發送停止信號結束