<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > I^2C總線(xiàn)EEPROM編程心得

I^2C總線(xiàn)EEPROM編程心得

作者: 時(shí)間:2016-11-28 來(lái)源:網(wǎng)絡(luò ) 收藏
相比起學(xué)校教材所用的8031+鎖存器+存儲芯片的組合搭建(不過(guò)貌似這種組合只有教科書(shū)才用),8952+AT24CXX的組合已經(jīng)完全夠用而且可以很明確地將AT24CXX功能定位在掉電數據存儲。
自己在進(jìn)行電子鐘的編程中,將AT24C02作為了鬧鐘定時(shí)保存的存儲,因為操作方便,很適合作為程序附加功能的拓展,比如電子密碼儲存部件等等。對于沒(méi)接觸過(guò)的人來(lái)說(shuō),唯一頭痛的就是I^2C總線(xiàn)的軟件模擬編程,雖然只有SCL和SDA兩條通訊線(xiàn)以及高低電平,上下沿幾種狀態(tài)加以組合,但是單調得難以理解,尤其延時(shí)應該是多少,應答怎么實(shí)現這些問(wèn)題都很困擾。I^2C總線(xiàn)是AT24CXX硬件自帶,而常見(jiàn)8952不自帶的,所以進(jìn)行交互通訊時(shí),需要在8952上運行軟件模擬。相關(guān)的原理解釋網(wǎng)上很多,這里建立在理解了原理的基礎上,進(jìn)行程序分析:在保證程序能正常工作的前提下,進(jìn)行了延時(shí)最短處理

//24C02的初始化
void c02_init()
{
scl=1;
sda=1;
}
//開(kāi)啟I^C總線(xiàn)
void start()
{
sda=1;
nop();
scl=1;
nop();
sda=0;
nop();
scl=0;
nop();
}
//停止I^2C總線(xiàn)
void stop()
{
sda=0;
nop();
scl=1;
nop();
sda=1;
nop();
}

本文引用地址:http://dyxdggzs.com/article/201611/323083.htm

//前面總線(xiàn)開(kāi)關(guān)操作和初始化好理解,看著(zhù)說(shuō)明書(shū)的原理波形就能夠寫(xiě)出

//發(fā)送8位數據

//之前還真不知道數據是這樣一位位賦值傳遞的
void s_byte(uchar s_dat)
{
uchar i;
for(i=0;i<8;i++)
{
s_dat<<=1;//最高位再左移就會(huì )寫(xiě)入到 CY
scl=0;
nop();
sda=CY;//如此類(lèi)推將每次左移讀CY值,直到讀完8位
scl=1;//SCL=1,保留數據。SCL=0,改變數據。
nop();
}
scl=0;
nop();
sda=1;
nop();
}

//讀取8位數據
uchar r_byte()
{
uchar i,k=0;
for(i=0;i<8;i++)
{
scl=1;
nop();
k<<=1;
if(sda)
{
k++;
}
scl=0;
nop();
}
return k;
}

//從件應答
void ack()
{
uchar i;
scl=1;
nop();

scl=0;
//參考了很多程序還是這個(gè)好理解,有應答時(shí)SDA==0跳出,沒(méi)有應答等待i累加完畢也退出。

//但是應答這樣用貌似沒(méi)有什么意義。在無(wú)應答時(shí),是不是該轉入其他操作?

while((sda==1)&&i<(200))i++;
scl=0;
nop();
}

//寫(xiě)入函數

void c02_write(uchar w_add,uchar w_dat)
{
start();
s_byte(0xa0);
ack();
s_byte(w_add);
ack();
s_byte(w_dat);
ack();
stop();
delay(5);
}

//讀取函數,這個(gè)是任意地址的讀取函數。包含了當前地址讀取的操作
uchar c02_read(uchar r_add)
{
start();
//這里要注意,向從件寫(xiě)入一個(gè)地址(r_add),讓接收器件自己比對是否相同.故先送一個(gè)寫(xiě)入驅動(dòng)(0xa0)

s_byte(0xa0);
ack();
s_byte(r_add);
ack();

//進(jìn)行讀寫(xiě)入驅動(dòng)前,都要重新開(kāi)啟總線(xiàn) start();
start();

//確定了地址之后,才進(jìn)行真正的寫(xiě)入操作。
s_byte(0xa1);
ack();
return r_byte();
stop();
delay(10);
}

其中應答很多人說(shuō)可有可無(wú),假如EEPROM是作為實(shí)現單一功能的主要元件,比如密碼鎖的存儲器,必須做到功能的盡善盡美,我覺(jué)得是要的。假如像我一樣作為電子鐘許多附加程序的其中一個(gè),為了節省運算時(shí)間,無(wú)奈地不應答也能接受吧?吧?吧?不知道哩……

最后使用write(w_add,w_dat);和read(r_add);就可以方便調用了。記得在這兩個(gè)函數使用前先調用初始化函數。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>