字體:小 中 大 | |
|
|
2008/08/22 17:14:18瀏覽7414|回應1|推薦1 | |
Flash的寫入是比較囉嗦的,除了要先做Erase,還要下一連串的command才能寫入,同時還很慢,很花時間,下圖是AMD的AM29LV800B的部份規格,spec上都有說到, 這裏就不說詳細的程式該如何寫了,假設大家都會寫程式,規格內有maximum的保證完成時間,有的人就會使用這個規格來使得自己寫出的flash寫入程式會正常運作,不過這有了一個問題,最大的sector erase time是15秒,裡面有一、二十個sector,假設有18個sector,那光erase就要等上270sec=4.5分鐘,寫入更久ㄡ,要27秒,27*18=504=8.4分鐘,那嚇死人了,這種程式可以說毫無利用價值,是不正確的寫法。 應該是要利用該flash提供的某些程序,例如判斷DQ6這根腳會toggle來決定programming/erasing sequence完成,詳細方法請參考各個spec,使用這樣的方式可以降低好幾倍的時間,而且沒有問題,如此作法才是正確的寫法。 那這裡提供的秒數是幹什麼用的呢?此處是”最差狀況”,是讓我們估計用的,注意不同溫度、不同的電壓的寫入時間是大大不同的。 Flash還容易,spec上也有寫到該如何處理,那eeprom呢?以 除了電壓不同造成的寫入時間不同,這顆eeprom有512k/8=64kbytes,每個byte的寫入時間超長,最長的要 事實上是可以的,要使用I ready:Ack=0 busy: Ack=1 只要busy,就立刻跳回這個I For(i=0; i<10000; i++) { Start(); …… If(busy) Continue; …… Stop(); } 這種作法就可以讓時間大幅縮小數倍,不用再侷限於20ms的最差時間。 這樣其實還不夠,還要再使用page write,以此顆為例,一個page=128bytes,因為內部在寫入時,eeprom是以128bytes為單位的,換句話說,eeprom是準備寫128bytes的,只是內部還有一些其他機制,使得我們可以對單一byte動作而不會影響到其他byte的資料,既然eeprom都已經準備好了,而我們又準備寫入很多的資料,何必要浪費掉這樣的動作,當使用page write時,會加快很多很多。 不過要注意,page是以位置”0000h”來當基準的,就是0000h,0080h,00100h……,不是任意值,程式要小心這樣的處理,不同size、不同廠牌的page大小有可能不同,要仔細看spec,回頭看一下電子學裡面有關EPROM的那章,很容易就會體會到為什麼flash類的元件要做某些動作(例如要先erase才能寫等)。 還有最後要注意的一件事,FLASH, EEPROM, MCU內建的FLASH等,在做erase、programming等的動作時,要嚴禁突然中斷電源,因為在做此類的動作時,ic內部會先做電壓提升的動作,突然的斷電,會導致負載異常,所謂異常就是出乎意料,可能高可能低,那個提升的電壓降下也就罷了,就怕提升,可能讓元件損毀。 |
|
( 心情隨筆|工作職場 ) |