IIC接口下的24C02 驅動分析


本節來學習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]地址:表示讀/寫狀態,1:讀,0:寫 (所有I2C器件都是這樣,最低位表示方向位)

4.3.1 為什么需要page頁地址?

因為I2C的數據位是8位,而AT24CXX的讀寫地址值最大可以為2048(2^11),超過了I2C的數據位

而page頁地址就是用來解決這個問題的

比如AT24C16:

當發送:0XA2(設備地址P[2:0]=0x01) ,0x00(讀地址)時:

表示要讀的真正地址=0x01(頁地址)*256+0(讀地址)=0x100,轉化為二進制= 1 0000 0000

當發送:0XA0(設備地址), 0x00(讀地址)時:

表示要讀的真正地址=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,直到發送停止信號結束

 

 

接下來,下節開始學習:

Linux下如何利用linux下I2C驅動體系結構來操作24C02  http://www.cnblogs.com/lifexy/p/7816324.html

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM