14 6 EEPROM的頁寫入

2021-07-14 13:35:55 字數 3632 閱讀 8098

在向 eeprom 連續寫入多個位元組的資料時,如果每寫乙個位元組都要等待幾 ms 的話,整體上的寫入效率就太低了。因此 eeprom 的廠商就想了乙個辦法,把 eeprom 分頁管理。24c01、24c02 這兩個型號是 8 個位元組乙個頁,而 24c04、24c08、24c16 是 16 個位元組一頁。我們開發板上用的型號是 24c02,一共是 256 個位元組,8 個位元組一頁,那麼就一共有 32 頁。

/*****************************i2c.c 檔案程式源*********************************/

(此處省略,可參考之前章節的**)

/***************************lcd1602.c 檔案程式源*******************************/

(此處省略,可參考之前章節的**)

/****************************eeprom.c 檔案程式源*******************************/

#include

extern

void

i2cstart

();extern

void

i2cstop

();extern

unsigned

char

i2creadack

();extern

unsigned

char

i2creadnak

();extern

biti2cwrite

(unsigned

char dat);

/* 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);

//寫入起始位址

while

(len >0)

}i2cstop

();}

}

遵循模組化的原則,我們把 eeprom 的讀寫函式也單獨寫成乙個 eeprom.c 檔案。其中e2read 函式和上一節是一樣的,因為讀操作與分頁無關。重點是 e2write 函式,我們在寫入資料的時候,要計算下乙個要寫的資料的位址是否是乙個頁的起始位址,如果是的話,則必須跳出迴圈,等待 eeprom 把當前這一頁寫入到非易失區域後,再進行後續頁的寫入。

/*****************************main.c 檔案程式源********************************/

#include

extern

void

initlcd1602

();extern

void

lcdshowstr

(unsigned

char x,

unsigned

char y,

unsigned

char

*str);

extern

void

e2read

(unsigned

char

*buf,

unsigned

char addr,

unsigned

char len);

extern

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,

0x8e

,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++;}}

多位元組寫入和頁寫入程式都編寫出來了,而且頁寫入的程式我們還特地跨頁寫的資料,它們的寫入時間到底差別多大呢。我們用一些工具可以測量一下,比如示波器,邏輯分析儀等工具。我現在把兩次寫入時間用邏輯分析儀給抓了出來,並且用時間標籤 t1 和 t2 標註了開始位置和結束位置,如圖 14-5 和圖 14-6 所示,右側顯示的|t1-t2|就是最終寫入 5 個位元組所耗費的時間。多位元組乙個乙個寫入,每次寫入後都需要再次通訊檢測 eeprom 是否在「忙」,因此耗費了大量的時間,同樣的寫入 5 個位元組的資料,乙個乙個寫入用了 8.4ms 左右的時間,而使用頁寫入,只用了 3.5ms 左右的時間。

圖 14-5  多位元組寫入時間

圖 14-6  跨頁寫入時間

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...

EEPROM 和 FLASH的區別

eeprom,eprom,flash都是基於一種浮柵管單元 floating gate transister 的結構。eprom的浮柵處於絕緣的二氧化矽層中,充入的電子只能用紫外線的能量來激出,eeprom的單元是由flotox floating gate tuneling oxide transi...