24C02芯片介紹
EEPROM (Electrically Erasable Programmable read only memory),帶電可擦可編程只讀存儲器——一種掉電后數據不丟失的存儲芯片。
24Cxx芯片是EEPROM芯片的一種,它是基于IIC總線的存儲器件,遵循二線制協議,由于其具有接口方便,體積小,數據掉電不丟失等特點,在儀器儀表及工業自動化控制中得到大量的應用。24Cxx在電路的作用主要是在掉電的情況下保存數據。
本文使用的是24C02芯片,總容量是2k個bit(256個字節)。這里芯片名稱里的02代表著總容量。
24C02芯片的引腳分布和具體的作用見下圖:
24C02 引腳圖引腳名稱 | 說明 |
A0-A2 | 地址輸入線 |
SDA | 數據線 |
SCL | 時鐘線 |
WP | 寫保護 |
GND、VCC | 提供電源 |
下圖是本文中24C02和STM32的引腳連接圖:
從圖中可以看出:A0、A1、A2都為0。
對于并聯在一條IIC總線上的每個IC都有唯一的地址。那么看一下從器件地址,可以看出對于不同大小的24Cxx,具有不同的從器件地址。由于24C02為2k容量,也就是說只需要參考圖中第一行的內容:
設備地址根據圖中的內容:如果是寫24C02的時候,從器件地址為10100000(0xA0);讀24C02的時候,從器件地址為10100001(0xA1)。
24C02芯片的時序圖
這部分的內容應結合上文:I2C總線的數據傳送的內容一起理解。
24C02字節寫時序
寫時序
對24C02芯片進行寫字節操作的時候,步驟如下:
(1) 開始位,后面緊跟從器件地址位(0xA0),等待應答,這是為了在IIC總線上確定24C02的從地址位置;
(2) 確定操作24C02的地址,等待應答,也就是將字節寫入到24C02中256個字節中的位置;
(3) 確定需要寫入24C02芯片的字節,等待應答,停止位。
24C02字節讀時序
對24C02芯片進行讀字節操作的時候,步驟如下:
(1)開始位,后面緊跟從器件地址位(0xA0),等待應答,這是為了在IIC總線上確定24C02的從地址位置;
(2)確定操作24C02的地址,等待應答,也就是從24C02中256個字節中讀取字節的位置;
(3)再次開始位,后面緊跟從器件地址位(0xA1),等待應答;
(4)獲取從24C02芯片中讀取的字節,發出非應答信號,停止位。
進行數據傳送時,在SCL為高電平期間,SDA線上電平必須保持穩定,只有SCL為低時,才允許SDA線上電平改變狀態。并且每個字節傳送時都是高位在前;
對于應答信號,ACK=0時為有效應答位,說明從機已經成功接收到該字節,若為1則說明接受不成功;
如果從機需要延遲下一個數據字節開始傳送的時間,可以通過把SCL電平拉低并保持來強制主機進入等待狀態;
主機完成一次通信后還想繼續占用總線在進行一次通信,而又不釋放總線,就要利用重啟動信號。它既作為前一次數據傳輸的結束,又作為后一次傳輸的開始;
總線沖突時,按“低電平優先”的仲裁原則,把總線判給在數據線上先發送低電平的主器件;
在特殊情況下,若需禁止所有發生在I2C總線上的通信,可采用封鎖或關閉總線,具體操作為在總線上的任一器件將SCL鎖定在低電平即可;
SDA仲裁和SCL時鐘同步處理過程沒有先后關系,而是同時進行的。
讀取24C02芯片程序
#define AT24C01 127
#define AT24C02 255
#define AT24C04 511
#define AT24C08 1023
#define AT24C16 2047
#define AT24C32 4095
#define AT24C64 8191
#define AT24C128 16383
#define AT24C256 32767
//Mini STM32開發板使用的是24c02,所以定義EE_TYPE為AT24C02
#define EE_TYPE AT24C02
//初始化IIC接口
void AT24CXX_Init(void)
{
IIC_Init();
}
//在AT24CXX指定地址讀出一個數據
//ReadAddr:開始讀數的地址
//返回值 :讀到的數據
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16) //為了兼容24Cxx中其他的版本
{
IIC_Send_Byte(0XA0); //發送寫命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8); //發送高地址
IIC_Wait_Ack();
}else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //發送器件地址0XA0,寫數據
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;
}
//在AT24CXX指定地址寫入一個數據
//WriteAddr :寫入數據的目的地址
//DataToWrite:要寫入的數據
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)); //發送器件地址0XA0,寫數據
}
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr%256); //發送低地址
IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite); //發送字節
IIC_Wait_Ack();
IIC_Stop(); //產生一個停止條件
delay_ms(10);
}
//在AT24CXX里面的指定地址開始寫入長度為Len的數據
//該函數用于寫入16bit或者32bit的數據.
//WriteAddr :開始寫入的地址
//DataToWrite:數據數組首地址
//Len :要寫入數據的長度2,4
void AT24CXX_WriteLenByte(u16 WriteAddr,u32 DataToWrite,u8 Len)
{
u8 t;
for(t=0;t>(8*t))&0xff);
}
}
//在AT24CXX里面的指定地址開始讀出長度為Len的數據
//該函數用于讀出16bit或者32bit的數據.
//ReadAddr :開始讀出的地址
//返回值 :數據
//Len :要讀出數據的長度2,4
u32 AT24CXX_ReadLenByte(u16 ReadAddr,u8 Len)
{
u8 t;
u32 temp=0;
for(t=0;t
;t++)>;t++)>
-
EEPROM
+關注
關注
9文章
1033瀏覽量
81954 -
存儲芯片
+關注
關注
11文章
902瀏覽量
43271 -
IIC總線
+關注
關注
1文章
66瀏覽量
20399
發布評論請先 登錄
相關推薦
評論