前言
在實(shí)際的應(yīng)用中,我們需要一些存儲(chǔ)介質(zhì)幫助我們來(lái)存儲(chǔ)一些東西,如保存一些參數(shù)和配置數(shù)據(jù)等。比較常用的有AT24Cxx系列。AT24C02芯片是以IIC接口的EEPROM器件。所謂EEPROM即電可擦除可編程只讀存儲(chǔ)器,是ROM的一種。它是只讀存儲(chǔ)器,即掉電可繼續(xù)存儲(chǔ)數(shù)據(jù),而同時(shí)又可以在高于普通電壓的作用下擦除和重寫(xiě)。
AT24C02
其中A0、A1、A2用于定義芯片地址,VCC和GND是供電正負(fù)接口,SCL和SDA是IIC的數(shù)據(jù)總線,WP是寫(xiě)保護(hù)(若接VCC則該芯片所有內(nèi)容都被保護(hù),只能讀不能寫(xiě),一般我們直接接地)。單片機(jī)入門(mén)繪制電路板,需要正品元器件可去唯樣商城,原廠真貨。
AT24C02的從機(jī)地址前四位1010為固定值,A0,A1,A2正好與芯片的1,2,3引角對(duì)應(yīng),最末一位表示讀(1)或?qū)懀?)。
AT24C02的內(nèi)存有2Kbit(256byte),分為32頁(yè),對(duì)其的寫(xiě)操作包括字節(jié)寫(xiě)和頁(yè)寫(xiě)。
寫(xiě)操作
字節(jié)寫(xiě)
字節(jié)寫(xiě)就是對(duì)指定地址的字節(jié)進(jìn)行寫(xiě)入操作,時(shí)序是:
①發(fā)送start信號(hào)
②發(fā)送從器件地址+寫(xiě)標(biāo)志“0”,并等待應(yīng)答信號(hào)
③發(fā)送要寫(xiě)入的地址,并等待應(yīng)答信號(hào)
④發(fā)送要寫(xiě)入的數(shù)據(jù),并等應(yīng)答信號(hào)
⑤發(fā)送stop信號(hào)。
頁(yè)寫(xiě)
頁(yè)寫(xiě)則是在字節(jié)寫(xiě)的基礎(chǔ)上,在第⑤步之前多次使用第④步,即最后先不要發(fā)送stop信號(hào),而是繼續(xù)發(fā)送數(shù)據(jù),這時(shí)AT24C02就會(huì)自動(dòng)將地址加一,待所有數(shù)據(jù)發(fā)送完畢再發(fā)送stop信號(hào)。
讀操作
隨機(jī)讀
隨機(jī)讀可以指定要讀取數(shù)據(jù)的地址,具體時(shí)序:
①發(fā)送start信號(hào)
②發(fā)送從器件地址+寫(xiě)標(biāo)志“0”,并等待應(yīng)答
③發(fā)送要讀數(shù)據(jù)的地址,并等待應(yīng)答
④重新發(fā)送一個(gè)start信號(hào)(也可稱為restart信號(hào))
⑤發(fā)送從器件地址+讀標(biāo)志“1”,并等待應(yīng)答
⑥接收傳來(lái)的數(shù)據(jù),收到數(shù)據(jù)后要發(fā)送非應(yīng)答信號(hào)
⑦發(fā)送stop信號(hào)。
當(dāng)前地址讀
當(dāng)前地址讀則是只能讀取芯片內(nèi)部最近一次操作的地址加一處的數(shù)據(jù)(主要在已知上次操作地址時(shí)使用),具體時(shí)序:
①發(fā)送start信號(hào)
②發(fā)送從器件地址+讀標(biāo)志“1”,并等待應(yīng)答
③接收傳來(lái)的數(shù)據(jù),然后發(fā)送非應(yīng)答信號(hào)
④發(fā)送stop信號(hào)。
順序讀
順序讀則是在前兩種讀操作的基礎(chǔ)上,在接收到數(shù)據(jù)后發(fā)送應(yīng)答信號(hào),然后就可以繼續(xù)讀上次操作地址加一處的數(shù)據(jù)了(這是在芯片內(nèi)部實(shí)現(xiàn)的),當(dāng)讀夠數(shù)據(jù)后,要發(fā)送非應(yīng)答信號(hào),最后發(fā)送stop信號(hào)。
代碼
void write_AT24C02(uchar unit_addr, uchar dat)
{
start();
write_byte(AT24C02_ADDR + 0);//下一個(gè)字節(jié)為寫(xiě),所以是+0
ack();
write_byte(unit_addr);
ack();
write_byte(dat);
ack();
end();
}
?
uchar read_AT24C02(uchar unit_addr)
{
uchar dat;
/先寫(xiě)數(shù)據(jù)/
start();
write_byte(AT24C02_ADDR + 0);//下一個(gè)字節(jié)為寫(xiě)
ack();
write_byte(unit_addr);
ack();
start();
write_byte(AT24C02_ADDR + 1);//下一個(gè)字節(jié)為讀
ack();
dat = read_byte();
end();
return dat;
}
?
void main()
{
write_AT24C02(0xf0, 0xae);
delay_10ms(); //寫(xiě)完后,必須延時(shí)一定的時(shí)間才可以讀取
P1 = read_AT24C02(0xf0);
while(1);
}
?
審核編輯 黃昊宇
-
單片機(jī)
+關(guān)注
關(guān)注
6040文章
44602瀏覽量
637057
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論