網路城邦
上一篇 回創作列表 下一篇   字體:
Serial eeprom與flash的用法
2008/08/22 17:14:18瀏覽7414|回應1|推薦1

   Flash的寫入是比較囉嗦的,除了要先做Erase,還要下一連串的command才能寫入,同時還很慢,很花時間,下圖是AMDAM29LV800B的部份規格,spec上都有說到,

這裏就不說詳細的程式該如何寫了,假設大家都會寫程式,規格內有maximum的保證完成時間,有的人就會使用這個規格來使得自己寫出的flash寫入程式會正常運作,不過這有了一個問題,最大的sector erase time15秒,裡面有一、二十個sector,假設有18sector,那光erase就要等上270sec=4.5分鐘,寫入更久ㄡ,要27秒,27*18=504=8.4分鐘,那嚇死人了,這種程式可以說毫無利用價值,是不正確的寫法。

應該是要利用該flash提供的某些程序,例如判斷DQ6這根腳會toggle來決定programming/erasing sequence完成,詳細方法請參考各個spec,使用這樣的方式可以降低好幾倍的時間,而且沒有問題,如此作法才是正確的寫法。

那這裡提供的秒數是幹什麼用的呢?此處是最差狀況,是讓我們估計用的,注意不同溫度、不同的電壓的寫入時間是大大不同的。

Flash還容易,spec上也有寫到該如何處理,那eeprom呢?以24C512為例,如上圖

除了電壓不同造成的寫入時間不同,這顆eeprom512k/8=64kbytes,每個byte的寫入時間超長,最長的要20ms64k*20ms=1310.72=21分鐘,這麼久的時間,那要嚇死人了。

24C512只有I2C介面,不像flash,再也沒有其他腳位可供判斷,21分鐘是個嚇死人的時間,難道真的只能使用delay來等待嗎?

事實上是可以的,要使用I2C裡面的Ack bit

readyAck=0

busy Ack=1

   只要busy,就立刻跳回這個I2C command sequencestart,從頭開始做,設一個執行時間略大於20mstimeout(就是此處的10000次,不過次數是我瞎掰的)即可:

      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等,在做eraseprogramming等的動作時,要嚴禁突然中斷電源,因為在做此類的動作時,ic內部會先做電壓提升的動作,突然的斷電,會導致負載異常,所謂異常就是出乎意料,可能高可能低,那個提升的電壓降下也就罷了,就怕提升,可能讓元件損毀。

( 心情隨筆工作職場 )
回應 推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=cchahacaptain&aid=2152960

 回應文章

immortal
耗電
2008/09/26 13:01

用 while 作 polling 會很耗 cpu 及 "電"
對於手持式裝置 並不建議用此方法讀寫 flash

彼得鄧(cchahacaptain) 於 2008-09-29 15:46 回覆:

是的,不同的產品必須用不同的解決方式,這是很重要的看法,感謝您的意見。
說實話,其實這是一個很大且普遍的問題!
    【很耗cpu】:純硬體工程師看不懂。
    【很耗電】:純軟體工程師看不懂。
當發生了問題,例如如您提到的問題,會發現,純粹的軟硬體工程師會很難找到答案,就算是一起合作也會有一點問題。
軟硬體分家,原本只是任務上的分工,但是現在真的分家了,互相看不懂,【積極一點】的還會互管,只是不曉得會管成怎麼樣罷了。
很有趣的一點,有時候看一下產品設計,大致上就可以猜出這個案子管理者的特性,究竟是軟體出身?還是硬體出身?有時甚至是業務出身......

彼得鄧(cchahacaptain) 於 2008-09-29 16:25 回覆:

當解決這類問題,除了要看產品特性,還要看擁有的資源,例如有無作業系統也是一個重要考量,因為如果有作業系統,就可以利用如sleep(us)類的函式來釋放cpu資源,除了可有效避免佔用cpu的問題,又可以達到時間延遲的目的,同時也可減少polling的次數,達到省電的目的。

但若是單工的系統,有的cpu ram/flash很少,就要好好安排一下怎樣做會比較好了。

一般普通的產品,應該不會有頻繁寫入flash或eeprom的問題,偶行一次應該無礙電力的時間,如果是內建flash或eeprom的cpu,那是非polling不可了,你不poll,甚至是開啟中斷,就準備當機吧!有的連polling的機會都沒有,因為是ic內部幫你poll的,當你能執行下一行時,就是poll完了。

如果不等flash或eeprom寫完就開始執行程式,那就要很注意程式時序的問題,就是semaphore的維護,會是一個很麻煩的問題,究竟是要浪費一點電?還是仔細檢討程式碼結構?就需要仔細考慮了。

文中提到的while的方式,只是一個意思的表達而已,究竟該如何做,必須要考慮所有資源,專案時間,甚至是產品價格與特性,誇張一點,如果這個東西是一個用完即丟的東西,那這麼省電有什麼用呢?