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,但目前大多
7) 連線到相同匯流排的IC數量受到匯流排的最大電容400pF的限制。
I2C
訊號
IIC匯流排在傳送資料過程中共有三種類型訊號,它們分別是:開始訊號、結束訊號和應答訊號。
開始訊號:SCL
為高電平,SDA
由高電平向低電平跳變,開始傳送資料。
結束訊號:SCL
為高電平,SDA
由低電平向高電平跳變,結束傳送資料。
應答訊號:接收資料的IC
在接收到8bit資料後,向傳送資料的IC
發出特定的低電平脈衝,表示已收到資料。CPU
向受控單元發出一個訊號後,等待受控訊號發出一個應答訊號,CPU
接收到應答訊號後,根據實際情況作出是否繼續傳遞訊號的判斷。若未收到應答訊號,由判斷為受控單元出現故障。
主機和從機通訊時,
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 ROM
、OTPROM
、EPROM
、EEPROM
以及Flash
儲存器。
EEPROM學習
在正點原子的《STM32F4開發指南-庫函式版本_V1.1.pdf》中,好像沒有介紹有關AT24C02的部分(也可能是博主沒有仔細找)。但是在野火的《零死角玩轉STM32—F429挑戰者.pdf》中有相關的介紹。博主把兩者結合起來看,感覺效果很不錯。
簡介
EEPROM
是一種掉電後資料不丟失的儲存器,常用來儲存一些配置資訊,以便系統重新上電的時候載入之。EEPROM
晶片最常用的通訊方式是IIC
協議。
EEPROM
(AT24C02
)的SCL
及SDA
引腳連線到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”,常稱該值為”讀地址”。
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》