1. 程式人生 > >I2C協議與AT24C02學習

I2C協議與AT24C02學習

目錄

前言

需要驅動磁力計,使用的I2C匯流排,所以博主只能拿起正點原子和野火的教程快速開發了。記得以前博主的同學說,面試的時候讓他講出I2C還是SPI匯流排的大體過程,那時候還是啃linux的東西,心想怎麼可能知道,這麼複雜!正好博主現在用到I2C,以這個方向來學習吧!

I2C協議介紹

簡介

I2C通訊協議(Inter-Intergrated Circuit)由Phiilps公司開發,由於它引腳少,硬體實現簡單,可擴充套件性強,現在被廣泛地使用在系統內多個積體電路間通訊。I2C由資料線SDA和時鐘線SCL構成,可傳送和接收資料。

I2C物理層

  • 物理層特點:
    1) 支援多個裝置的匯流排
    。”匯流排”指多個裝置共用的訊號線。在一個I2C通訊匯流排中,可連線多個I2C通訊裝置,支援多個通訊主機及多個通訊從機。
    2) 一個I2C匯流排只使用兩條匯流排線路,一條雙向序列資料線(SDA),一條序列時鐘線(SCL)。資料線即用來表示資料,時鐘線用於資料收發同步。
    3) 每個連線到匯流排的裝置都有一個獨立的地址,主機可以利用這個地址進行不同裝置間的訪問。
    4) 匯流排通過上拉電阻接到電源。當I2C裝置空閒時,會輸出高阻態,而當所有裝置都空閒,都輸出高阻態時,由上拉電阻把匯流排拉成高電平。
    5) 多個主機同時使用匯流排時,為了防止資料衝突,會利用仲裁方式決定由哪個裝置佔用匯流排。
    6) 具有三種傳輸模式:標準模式傳輸速率100kbit/s,快速模式為400kbit/s,高速模式下可達3.4Mbit/s,但目前大多
    I2C
    裝置尚不支援高速模式。
    7) 連線到相同匯流排的IC數量受到匯流排的最大電容400pF的限制。

I2C訊號

IIC匯流排在傳送資料過程中共有三種類型訊號,它們分別是:開始訊號、結束訊號和應答訊號。
開始訊號:SCL為高電平,SDA由高電平向低電平跳變,開始傳送資料。
結束訊號:SCL為高電平,SDA由低電平向高電平跳變,結束傳送資料。

0

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


主機和從機通訊時,SDA線通訊過程如下:
1. 主機I2C介面產生傳輸起始訊號,這時連線到I2C總線上的所有從機都會接收到這個訊號。起始訊號產生後,所有從機就開始等待主機緊接下來廣播的從機地址訊號。在I2C總線上,每個裝置的地址都是唯一的,當主機廣播的地址與某個裝置地址相同時,這個裝置就被選中了,沒被選中的裝置將會忽略之後的資料訊號。根據I2C協議,這個從機地址可以是7位或10位。
2. 在地址位之後,是傳輸方向的選擇位該位為0時,表示後面的資料傳輸方向是由主機傳輸至從機,即主機向從機寫資料;該位為1時,則相反,即主機由從機讀資料
3. 從機接收到匹配的地址後,主機或從機返回一個應答(ACK)或非應答(NACK)訊號,只有接收到應答訊號後,主機才能繼續傳送或接收資料。
4. 若配置的方向傳輸為”寫資料”方向,廣播完地址,接收到應答訊號後,主機開始正式向從機傳輸資料,資料包的大小為8位,主機每傳送完一個位元組資料,都要等待從機的應答訊號(ACK),重複這個過程,可以向從機傳輸N個數據,這個N沒有大小限制。當資料傳輸結束時,主機向從機發送一個停止傳輸為(P),表示不再傳輸資料。
5. 若配置的方向傳輸為”讀資料”方向,廣播完地址,接收到應答訊號後,從機開始向主機返回資料(DATA),資料包大小也為8位,從機每傳送完一個數據,都會等待主機的應答訊號(ACK),重複這個過程,可以返回N個數據,這個N也沒有大小限制。當主機希望停止接收資料時,就向從機返回一個非應答訊號(NACK),則從機自動停止資料傳輸。
6. 除了基本的讀寫,I2C通訊更常用的是複合格式,該傳輸過程中有兩次起始訊號(S)。一般在第一次傳輸中,主機通過SLAVE_ADDRESS尋找從裝置後,傳送一段”資料”,這段資料通常用於表示從裝置內部的暫存器或儲存器地址;在第二次的傳輸中,對該地址的內容進行讀或寫。也就是,第一次通訊是告訴從機讀寫地址,第二次是讀寫的實際內容。

儲存器

儲存器是用來儲存程式程式碼和資料的部件,有了儲存器計算機才具有記憶功能。儲存器按其儲存介質特性主要分為”易失性儲存器”和”非易失性儲存器”兩大類。一般易失性儲存器存取速度快,而非易失性儲存器可長期儲存資料。在計算機中易失性儲存器最典型的代表是記憶體,非易失性儲存器代表則是硬碟。

RAM儲存器

根據RAM的儲存機制,分為動態隨機儲存器DRAM(Dynamic RAM)以及靜態隨機儲存器SRAM(Static RAM)兩種。

ROM儲存器

ROM儲存器有MASK ROMOTPROMEPROMEEPROM以及Flash儲存器。

EEPROM學習

在正點原子的《STM32F4開發指南-庫函式版本_V1.1.pdf》中,好像沒有介紹有關AT24C02的部分(也可能是博主沒有仔細找)。但是在野火的《零死角玩轉STM32—F429挑戰者.pdf》中有相關的介紹。博主把兩者結合起來看,感覺效果很不錯。

簡介

EEPROM是一種掉電後資料不丟失的儲存器,常用來儲存一些配置資訊,以便系統重新上電的時候載入之。EEPROM晶片最常用的通訊方式是IIC協議。
EEPROM(AT24C02)的SCLSDA引腳連線到STM32對應的I2C引腳中,構成了I2C通訊匯流排,它們通過I2C匯流排互動。EEPROM晶片的裝置地址一共有7位,其中高四位固定為:1010b,低3位則有A0/A1/A2訊號線的電平決定,戰艦板中STM32F407中設定A0/A1/A2均為0,所以AT24C02的地址為:1010000b,即0x50。由於I2C通訊時常常是地址跟讀寫方向連在一起構成一個8位數,且當R/W位為0時,表示寫方向,所以加上7位地址,其值為”0xA0”,常稱該值為I2C裝置的”寫地址”當R/W位為1時,表示讀方向,加上7位地址,其值為”0xA1”,常稱該值為”讀地址”

2

EEPROM的單位元組時序規定,向它寫入資料的時候,第一個位元組為記憶體地址,第二個位元組是要寫入的資料內容。命令、地址的本質都是資料,對資料的解釋不同,就有不同的功能。

讀寫過程簡述

STM32F407讀一個位元組,先發送0xA0,表示讀資料;然後傳送讀地址;最後傳送0xA1,表示讀資料。
STM32F407讀一個位元組,先發送0xA0,表示寫資料;然後傳送寫地址;最後傳送要寫的資料。

u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                 
    u8 temp = 0;                                                                                 
    IIC_Start();  
    if(EE_TYPE > AT24C16)
    {
        IIC_Send_Byte(0XA0);            
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr>>8);             
    }
    else 
    {
        IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));  
    }

    IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);        
    IIC_Wait_Ack();     
    IIC_Start();           
    IIC_Send_Byte(0XA1);                           
    IIC_Wait_Ack();  
    temp = IIC_Read_Byte(0);           
    IIC_Stop();                                

    return temp;
}

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                            
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);            
        IIC_Wait_Ack();
        IIC_Send_Byte(WriteAddr>>8);    
    }
    else 
    {
        IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   
    } 
    IIC_Wait_Ack();    
    IIC_Send_Byte(WriteAddr%256);       
    IIC_Wait_Ack();                                                        
    IIC_Send_Byte(DataToWrite);                                    
    IIC_Wait_Ack();                    
    IIC_Stop();                         
    delay_ms(10);    
}

總結

博主並沒有認真的去把I2C控制的方方面面看懂,但是感覺差不多夠用了!大概如果把I2C的傳輸資料的過程描述一下其實還是很簡單的,當然對應如果用軟體去實現I2C協議,還是需要細究的。但是STM32現在用的不要太廣泛,這樣的程式碼也都寫好了,可以直接用!所以這也是模組化的好處,節省開發時間,但是對於程式設計師來說,只要複製貼上!比如博主就是。這樣會失去核心競爭力的,當年紀大了,複製貼上都沒有年輕人快怎麼辦!

參考書籍

《STM32F4開發指南-庫函式版本_V1.1.pdf》
《零死角玩轉STM32—F429挑戰者.pdf》