24c02簡(jiǎn)介
24C02是一個(gè)2Kbit的串行EEPROM存儲(chǔ)芯片,可存儲(chǔ)256個(gè)字節(jié)數(shù)據(jù)。工作電壓范圍為1.8V到6.0V,具有低功耗CMOS技術(shù),自定時(shí)擦寫周期,1000000次編程/擦除周期,可保存數(shù)據(jù)100年。24C02有一個(gè)16字節(jié)的頁(yè)寫緩沖器和一個(gè)寫保護(hù)功能。通過I2C總線通訊讀寫芯片數(shù)據(jù),通訊時(shí)鐘頻率可達(dá)400KHz。
51型號(hào)驅(qū)動(dòng)程序
sbit I2C_SCL = P1^2; //控制24c02的SCL引腳
sbit I2C_SDA = P1^1; //控制24c02的SDA引腳
void I2C_Delay10us()//IIC協(xié)議所需:延遲10us函數(shù)
{
uchar a, b;
for(b=1; b>0; b--)
{
for(a=2; a>0; a--);
}
}
void I2C_Start() //開始啟動(dòng)IIC,IIC協(xié)議頭
{
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();
}
void I2C_Stop() //停止IIC,IIC協(xié)議尾
{
I2C_SDA = 0;
I2C_Delay10us();
I2C_SCL = 1;
I2C_Delay10us();//建立時(shí)間大于4.7us
I2C_SDA = 1;
I2C_Delay10us();
}
/*******************************************************************************
* 函 數(shù) 名 : I2cSendByte(uchar num)
* 函數(shù)功能 : 通過I2C發(fā)送一個(gè)字節(jié)。在I2C_SCL時(shí)鐘信號(hào)高電平期間,
* * 保持發(fā)送信號(hào)I2C_SDA保持穩(wěn)定
* 輸 入 : num ,ack
* 輸 出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回0
* 備 注 : 發(fā)送完一個(gè)字節(jié)I2C_SCL=0, 需要應(yīng)答則應(yīng)答設(shè)置為1,否則為0
*******************************************************************************/
uchar I2C_SendByte(uchar dat, uchar ack)
{
uchar a = 0,b = 0;//最大255,一個(gè)機(jī)器周期為1us,最大延時(shí)255us。
for(a=0; a8; 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;
}
uchar I2C_ReadByte() //IIC協(xié)議讀取數(shù)據(jù)
{
uchar a = 0,dat = 0;
I2C_SDA = 1; //起始和發(fā)送一個(gè)字節(jié)之后I2C_SCL都是0
I2C_Delay10us();
for(a=0; a8; a++)//接收8個(gè)字節(jié)
{
I2C_SCL = 1;
I2C_Delay10us();
dat <= 1;
dat |= I2C_SDA;
I2C_Delay10us();
I2C_SCL = 0;
I2C_Delay10us();
}
return dat;
}
/*******************************************************************************
* 函 數(shù) 名 : void At24c02Write(unsigned char addr,unsigned char dat)
* 函數(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();
}
/*******************************************************************************
* 函 數(shù) 名 : unsigned char At24c02Read(unsigned char addr)
* 函數(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;
}
void main()
{
TMOD |= 0x01;
TH0=0XFC;
TL0=0X18;
TR0=1;
ET0=1;
EA=1;
while(1)
{
}
}
審核編輯:湯梓紅
-
EEPROM
+關(guān)注
關(guān)注
9文章
1020瀏覽量
81595 -
存儲(chǔ)芯片
+關(guān)注
關(guān)注
11文章
897瀏覽量
43145 -
掉電
+關(guān)注
關(guān)注
0文章
12瀏覽量
7663
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論