我們讀取 eeprom 的時候很簡單,eeprom 根據我們所送的時序,直接就把資料送出來了,但是寫 eeprom 卻沒有這麼簡單了。給 eeprom 傳送資料後,先儲存在了 eeprom的快取,eeprom 必須要把快取中的資料搬移到「非易失」的區域,才能達到掉電不丟失的效果。而往非易失區域寫需要一定的時間,每種器件不完全一樣,atmel 公司的 24c02 的這個寫入時間最高不超過 5ms。在往非易失區域寫的過程,eeprom 是不會再響應我們的訪問的,不僅接收不到我們的資料,我們即使用 i
2c 標準的定址模式去定址,eeprom 都不會應答,就如同這個匯流排上沒有這個器件一樣。資料寫入非易失區域完畢後,eeprom 再次恢復正常,可以正常讀寫了。
細心的同學,在看上一節程式的時候會發現,我們寫資料的那段**,實際上我們有去讀應答位 ack,但是讀到了應答位我們也沒有做任何處理。這是因為我們一次只寫乙個位元組的資料進去,等到下次重新上電再寫的時候,時間肯定遠遠超過了 5ms,但是如果我們是連續寫入幾個位元組的時候,就必須得考慮到應答位的問題了。寫入乙個位元組後,再寫入下乙個位元組之前,我們必須要等待 eeprom 再次響應才可以,大家注意我們程式的寫法,可以學習一下。
之前我們知道編寫多.c 檔案移植的方便性了,本節程式和上一節的 lcd1602.c 檔案和i2c.c 檔案完全是一樣的,因此這次我們只把 main.c 檔案給大家發出來,幫大家分析明白。
而同學們卻不能這樣,同學們是初學,很多知識和技巧需要多練才能鞏固下來,因此每個程式還是建議大家在你的 keil 軟體上乙個**乙個**的敲出來。
/*****************************i2c.c 檔案程式源*********************************/
(此處省略,可參考之前章節的**)
/***************************lcd1602.c 檔案程式源*******************************/
(此處省略,可參考之前章節的**)
/*****************************main.c 檔案程式源********************************/#include
extern
void
initlcd1602
();extern
void
lcdshowstr
(unsigned
char x,
unsigned
char y,
unsigned
char
*str);
extern
void
i2cstart
();extern
void
i2cstop
();extern
unsigned
char
i2creadack
();extern
unsigned
char
i2creadnak
();extern
biti2cwrite
(unsigned
char dat);
void
e2read
(unsigned
char
*buf,
unsigned
char addr,
unsigned
char len);
void
e2write
(unsigned
char
*buf,
unsigned
char addr,
unsigned
char len);
void
memtostr
(unsigned
char
*str,
unsigned
char
*src,
unsigned
char len);
void
main
()e2write
(buf,
0x90
,sizeof
(buf));
//再寫回到 e2 中
while(1
);}/* 將一段記憶體資料轉換為十六進製制格式的字串,
str-字串指標,src-源資料位址,len-資料長度 */
void
memtostr
(unsigned
char
*str,
unsigned
char
*src,
unsigned
char len)
else
tmp =
*src &
0x0f
;//再取低 4 位
if(tmp <=9)
else
*str++
=' '
;//轉換完乙個位元組新增乙個空格
src++;}}
/* e2 讀取函式,buf-資料接收指標,addr-e2 中的起始位址,len-讀取長度 */
void
e2read
(unsigned
char
*buf,
unsigned
char addr,
unsigned
char len)
i2cstop
();}
while(1
);i2cwrite
(addr);
//寫入起始位址
i2cstart
();//傳送重複啟動訊號
i2cwrite
((0x50
<<1)|
0x01
);//定址器件,後續為讀操作
while
(len >1)
*buf =
i2creadnak
();//最後乙個位元組為讀取操作+非應答
i2cstop
();}
/* e2 寫入函式,buf-源資料指標,addr-e2 中的起始位址,len-寫入長度 */
void
e2write
(unsigned
char
*buf,
unsigned
char addr,
unsigned
char len)
i2cstop
();}
while(1
);i2cwrite
(addr++);
//寫入起始位址
i2cwrite
(*buf++);
//寫入乙個位元組資料
i2cstop
();//結束寫操作,以等待寫入完成}}
函式 memtostr:可以把一段記憶體資料轉換成十六進製制字串的形式。由於我們從eeprom 讀出來的是正常的資料,而 1602 液晶接收的是 ascii 碼字元,因此我們要通過液晶把資料顯示出來必須先通過一步轉換。演算法倒是很簡單,就是把每乙個位元組的資料高 4 位和低 4 位分開,和 9 進行比較,如果小於等於 9,則直接加„0‟轉為 0~9 的 ascii 碼;如果大於 9,則先減掉 10 再加„a‟即可轉為 a~f 的 ascii 碼。
函式 e2read:我們在讀之前,要查詢一下當前是否可以進行讀寫操作,eeprom 正常響應才可以進行。進行後,讀最後乙個位元組之前的,全部給出 ack,而讀完了最後乙個位元組,我們要給出乙個 nak。
函式 e2write:每次寫操作之前,我們都要進行查詢判斷當前 eeprom 是否響應,正常響應後才可以寫資料。
eeprom的wp 引腳 EEPROM的詳細分析
eeprom的詳細分析 本例的eeprom型號為at24cm01,在電路中的引腳連線如下圖所示 1,該器件的特性如下 時鐘支援標準模式 100khz 快速模式 400khz 極快速模式 1mhz 支援標準電壓 vcc 2.5v 5.5v 低壓模式 vcc 1.7v 5.5v 工業級溫度範圍 40 至...
eeprom的wp 引腳 EEPROM的詳細分析
本例的eeprom型號為at24cm01,在電路中的引腳連線如下圖所示 1,該器件的特性如下 時鐘支援標準模式 100khz 快速模式 400khz 極快速模式 1mhz 支援標準電壓 vcc 2.5v 5.5v 低壓模式 vcc 1.7v 5.5v 工業級溫度範圍 40 至85 內部容量為1mbi...
14 5繼承與組合
程式的版權和版本宣告部分 檔名稱 a.cpp 作 者 孔雲 完成日期 2014年5月29日 版 本 號 v1.0 輸入描述 num,name,year,month,day 和修改後的year,month,day 問題描述 1 birthdate 生日類 含有 year,month,day 等資料成員...