一. 芯片簡(jiǎn)介
AT24C02是一個(gè)2K位串行CMOS E2PROM,內(nèi)部含有256個(gè)8位字節(jié),采用先進(jìn)CMOS技術(shù)實(shí)質(zhì)上減少了器件的功耗。 AT24C02有一個(gè)8字節(jié)頁(yè)寫緩沖器,該器件通過IIC總線接口進(jìn)行操作,有一個(gè)專門的寫保護(hù)功能。
二. 芯片參數(shù)
1.特點(diǎn)
- 工作電壓:1.8V~5.5V;
- 低功耗CMOS技術(shù),工作電流1mA,待機(jī)電流1uA;
- 應(yīng)用在內(nèi)部結(jié)構(gòu):128x8(1K),256x8(2K),512x8(4K),1024x8(8K),2048x8(16K);
- 二線串行接口,支持標(biāo)準(zhǔn)IIC通信協(xié)議;
- 雙向數(shù)據(jù)傳輸協(xié)議;
- 兼容 400KHz傳輸速率(1.8V,2.5V,2.7V,3.6V);
- 支持硬件寫保護(hù)功能;
- 擦出次數(shù)可達(dá)10000次;
- 存儲(chǔ)數(shù)據(jù)時(shí)間超過100年;
2.引腳定義
A0-A2引腳為芯片地址,用于多器件工作模式; SDA、SCL分別為IIC通信的數(shù)據(jù)線和時(shí)鐘線; WP為寫保護(hù)引腳,當(dāng)該引腳接 GND 時(shí),允許正常的讀/寫操作。 當(dāng)該引腳接 VCC 時(shí),芯片啟動(dòng)寫保護(hù)功能;
3.參考電路
A0-A2接到GND上,地址固定為0; SCL、SDA引腳內(nèi)部為開漏輸出,所以需接上拉電阻; WP引腳接GND,表示芯片可讀可寫。
三. 通信接口
1.芯片讀寫地址
在進(jìn)行I2C通信時(shí),主機(jī)發(fā)送啟動(dòng)信號(hào)后,再發(fā)送尋址信號(hào)。 器件的地址有7位和10位,以7為地址尋址為例; 尋址信號(hào)由一個(gè)字節(jié)構(gòu)成,高7位為地址位,最低位為方向位,用來表示主機(jī)與從器件的數(shù)據(jù)傳輸方向;
方向位0代表主機(jī)接下來對(duì)從器件進(jìn)行寫操作; 方向位為1,表明主機(jī)接下來對(duì)器件進(jìn)行讀操作。
如上圖,AT24C02的高4位是固定的,為1010b,低3位則由A0/A1/A2信號(hào)線的電平?jīng)Q定。 按照我們此處的連接, A0/A1/A2 均為 0,所以 EEPROM 的 7 位設(shè)備地址是:1010 000b ,即 0x50。
由于 I2C 通訊時(shí)常常是地址跟讀寫方向連在一起構(gòu)成一個(gè) 8 位數(shù),且當(dāng)R/W 位為 0 時(shí),表示寫方向,所以加上 7 位地址,其值為“ 0xA0”,常稱該值為 I2C 設(shè)備的“寫地址”; 當(dāng) R/W 位為 1 時(shí),表示讀方向,加上 7 位地址,其值為“ 0xA1”,常稱該值為“讀地址”。
A0/A1/A2輸入腳用于多個(gè)器件級(jí)聯(lián)時(shí)設(shè)置器件地址,當(dāng)這些腳懸空時(shí)默認(rèn)值為0。 當(dāng)使用AT24C02 時(shí)最大可級(jí)聯(lián)8個(gè)器件。 如果只有一個(gè)AT24C02被總線尋址,這三個(gè)地址輸入腳(A0、A1、A2 )可懸空(接地也可以)或連接到Vss,如果只有一個(gè)AT24C01被總線尋址這三個(gè)地址輸入腳(A0、A1、A2 )必須連接到Vss。
2.IIC通信
由于51單片機(jī)內(nèi)部無集成IIC控制硬件資源,所以需要軟件模擬IIC通信。 函數(shù)有四個(gè),分別為IIC起始信號(hào)、IIC停止信號(hào)、IIC讀取字節(jié)、IIC寫入字節(jié)等函數(shù)。
/*********************IIC.h*************************************/
//--定義使用的IO口--//
sbit I2C_SCL = P2^1;
sbit I2C_SDA = P2^0;
//--聲明全局變量--//
void I2C_Delay10us();
void I2C_Start(); //起始信號(hào):在I2C_SCL時(shí)鐘信號(hào)在高電平期間I2C_SDA信號(hào)產(chǎn)生一個(gè)下降沿
void I2C_Stop(); //終止信號(hào):在I2C_SCL時(shí)鐘信號(hào)高電平期間I2C_SDA信號(hào)產(chǎn)生一個(gè)上升沿
uchar I2C_SendByte(uchar dat, uchar ack);//使用I2c讀取一個(gè)字節(jié)
uchar I2C_ReadByte(); //通過I2C發(fā)送一個(gè)字節(jié)。在I2C_SCL時(shí)鐘信號(hào)高電平期間,保持發(fā)送信號(hào)I2C_SDA保持穩(wěn)定
/*********************IIC.c*************************************/
//延時(shí):1us
void I2C_Delay10us()
{
uchar a, b;
for(b=1; b>0; b--)
{
for(a=2; a>0; a--);
}
}
// 起始信號(hào):在I2C_SCL時(shí)鐘信號(hào)在高電平期間I2C_SDA信號(hào)產(chǎn)生一個(gè)下降沿
void I2C_Start()
{
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時(shí)間是I2C_SDA保持時(shí)間>4.7us
I2C_SDA = 0;
I2C_Delay10us();//保持時(shí)間是>4us
I2C_SCL = 0;
I2C_Delay10us();
}
//終止信號(hào):在I2C_SCL時(shí)鐘信號(hào)高電平期間I2C_SDA信號(hào)產(chǎn)生一個(gè)上升沿
void I2C_Stop()
{
I2C_SDA = 0;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時(shí)間大于4.7us
I2C_SDA = 1;
I2C_Delay10us();
}
//通過I2C發(fā)送一個(gè)字節(jié)。在I2C_SCL時(shí)鐘信號(hào)高電平期間, 保持發(fā)送信號(hào)I2C_SDA保持穩(wěn)定
uchar I2C_SendByte(uchar dat, uchar ack)
{
uchar a = 0,b = 0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。
for(a=0; a<8; a++)//要發(fā)送8位,從最高位開始
{
I2C_SDA = dat >> 7; //起始信號(hào)之后I2C_SCL=0,所以可以直接改變I2C_SDA信號(hào)
dat = dat << 1;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時(shí)間>4.7us
I2C_SCL = 0;
I2C_Delay10us();//時(shí)間大于4us
}
I2C_SDA = 1;
I2C_Delay10us();
I2C_SCL = 1;
while(I2C_SDA && (ack == 1))//等待應(yīng)答,也就是等待從設(shè)備把I2C_SDA拉低
{
b++;
if(b > 200) //如果超過200us沒有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束
{
I2C_SCL = 0;
I2C_Delay10us();
return 0;
}
}
I2C_SCL = 0;
I2C_Delay10us();
return 1;
}
// 使用I2c讀取一個(gè)字節(jié)
uchar I2C_ReadByte()
{
uchar a = 0,dat = 0;
I2C_SDA = 1; //起始和發(fā)送一個(gè)字節(jié)之后I2C_SCL都是0
I2C_Delay10us();
for(a=0; a<8; a++)//接收8個(gè)字節(jié)
{
I2C_SCL = 1;
I2C_Delay10us();
dat <<= 1;
dat |= I2C_SDA;
I2C_Delay10us();
I2C_SCL = 0;
I2C_Delay10us();
}
return dat;
}
四 .控制程序
實(shí)現(xiàn)了基本IIC通訊函數(shù)后,就可對(duì)AT24C02進(jìn)行操作,主要是寫入數(shù)據(jù)和讀取數(shù)據(jù)兩個(gè)函數(shù)。
芯片尋址可對(duì)內(nèi)部256B中的任一個(gè)進(jìn)行讀/寫操作,其尋址范圍為00FF,共256個(gè)尋址單位。 所以可任意在00FF地址寫入我們需要保存的數(shù)據(jù)。
1.AT24C02寫入數(shù)據(jù)
時(shí)序順序?yàn)? 發(fā)送開始信號(hào),IIC啟動(dòng)->發(fā)送器件地址,其中讀寫標(biāo)志位為寫->發(fā)送器件內(nèi)部存儲(chǔ)地址->向器件中寫入數(shù)據(jù)->發(fā)送停止信號(hào),IIC停止;
//函數(shù)功能 : 往24c02的一個(gè)地址寫入一個(gè)數(shù)據(jù)
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2C_Start();
I2C_SendByte(0xa0, 1);//發(fā)送寫器件地址
I2C_SendByte(addr, 1);//發(fā)送要寫入內(nèi)存地址
I2C_SendByte(dat, 0); //發(fā)送數(shù)據(jù)
I2C_Stop();
}
2.AT24C02讀取數(shù)據(jù)
時(shí)序順序?yàn)? 發(fā)送開始信號(hào),IIC啟動(dòng)->發(fā)送器件地址,其中讀寫標(biāo)志位為寫->發(fā)送器件內(nèi)部->發(fā)送開始信號(hào),IIC再次啟動(dòng)->發(fā)送器件地址,其中讀寫標(biāo)志位為讀->從器件讀出數(shù)據(jù)->返回所讀取的數(shù)據(jù);
// 函數(shù)功能 :讀取24c02的一個(gè)地址的一個(gè)數(shù)據(jù)
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2C_Start();
I2C_SendByte(0xa0, 1); //發(fā)送寫器件地址
I2C_SendByte(addr, 1); //發(fā)送要讀取的地址
I2C_Start();
I2C_SendByte(0xa1, 1); //發(fā)送讀器件地址
num=I2C_ReadByte(); //讀取數(shù)據(jù)
I2C_Stop();
return num;
}
3.AT24C02讀寫數(shù)據(jù)
實(shí)現(xiàn)以上的讀寫功能,就可以使用AT24C02來實(shí)現(xiàn)我們需要的功能。 功能為:使用按鍵1,寫入num0; 按鍵2,讀取num0; 按鍵3,使num0加1; 按鍵4,清零num0;
void main()
{
unsigned int num0 = 0,num1 = 0,num2 = 0,n;
LcdInit();
while(1)
{
if(K1 == 0) //按鍵1按下,將num0寫入eeprom
{
Delay10ms(1);
if(K1 == 0)
{At24c02Write(2,num0);
At24c02Write(3,num0);}
while((n < 20)&&(K3==0))
{
n++;
Delay10ms(1);
}
n=0;
n=0;
}
if(K2 == 0) //按鍵2按下,讀取eeprom數(shù)據(jù)
{
Delay10ms(1);
if(K2 == 0)
{num1 = At24c02Read(2);
num2 = At24c02Read(3); }
while((n < 20)&&(K2 == 0))
{
n++;
Delay10ms(1);
}
n=0;
}
if(K3 == 0) //按鍵3按下,使num0自加1
{
Delay10ms(1);
if(K3 == 0)
num0++;
while((n < 50)&&(K3 == 0))
{
n++;
Delay10ms(1);
}
n=0;
if(num0==256)
num0=0;
}
if(K4 == 0) //按鍵4按下,清零
{
Delay10ms(1);
if(K4 == 0)
num0 = 0;
while((n < 50) && (K4 == 0))
{
n++;
Delay10ms(1);
}
n=0;
}
LCD_Display();
}
}
-
接口
+關(guān)注
關(guān)注
33文章
8593瀏覽量
151132 -
緩沖器
+關(guān)注
關(guān)注
6文章
1922瀏覽量
45479 -
數(shù)據(jù)存儲(chǔ)
+關(guān)注
關(guān)注
5文章
971瀏覽量
50906 -
存儲(chǔ)芯片
+關(guān)注
關(guān)注
11文章
897瀏覽量
43143
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論