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