EPROM是指可擦除可程式只讀存儲(chǔ)�,是一種斷電后仍能保留�(shù)�(jù)的計(jì)算機(jī)存儲(chǔ)芯片�
EPROM是可編程器件,主流�(chǎn)品是采用雙層?xùn)?二層poly)�(jié)�(gòu),主要�(jié)�(gòu)如圖所�:
浮柵中沒(méi)有電子注入時(shí),在控制柵加電壓時(shí),浮柵中的電子跑到上層,下層出現(xiàn)空穴�
由于感應(yīng),便會(huì)吸引電子,并開(kāi)啟溝道�
如果浮柵中有電子的注入時(shí),即加大的管子的閾值電�,溝道處于關(guān)閉狀�(tài).這樣就達(dá)成了�(kāi)�(guān)功能�
如圖2所�,這是EPROM的寫(xiě)入過(guò)�,在漏極加高壓,電子從源極流向漏極溝道充分�(kāi)�.在高壓的作用�,電子的拉力加強(qiáng),能量使電子的溫度極度上升,變?yōu)闊犭�?hot electrON).這種電子幾乎不受原子的振�(dòng)作用引起的散�,在受控制柵的施加的高壓時(shí),熱電子使能躍�(guò)SiO2的勢(shì)�,注入到浮柵中�
在沒(méi)有別的外力的情況�,電子�(huì)很好的保持著.在需要消去電子時(shí),利用紫外線�(jìn)行照�,給電子足夠的能量,逃逸出浮柵�
EEPROM的寫(xiě)入過(guò)程,是利用了隧道效應(yīng),即能量小于能量�(shì)壘的電子能夠穿越�(shì)壘到�(dá)另一��
量子力學(xué)�(rèn)為物理尺寸與電子自由程相�(dāng)�(shí),電子將呈現(xiàn)波動(dòng)�,這里就是表明物體要足夠的��
就pn�(jié)�(lái)�,�(dāng)p和n的雜�(zhì)濃度�(dá)到一定水平時(shí),并且空間電荷極少時(shí),電子就�(huì)因隧道效�(yīng)�?qū)нw��
電子的能量處于某�(gè)�(jí)別允許級(jí)別的范圍�(chēng)�"�",較低的能帶稱(chēng)為價(jià)�,較高的能帶稱(chēng)為導(dǎo)帶�
電子到達(dá)較高的導(dǎo)帶時(shí)就可以在原子間自由的�(yùn)�(dòng),這種�(yùn)�(dòng)就是電流�
EEPROM�(xiě)入過(guò)�,如圖3所�,根據(jù)隧道效應(yīng),包圍浮柵的SiO2,必須極薄以降低勢(shì)壘�
源漏極接�,處于�(dǎo)通狀�(tài).在控制柵上施加高于閾值電壓的高壓,以減少電�(chǎng)作用,吸引電子穿��
要達(dá)到消去電子的要求,EEPROM也是通過(guò)隧道效應(yīng)�(dá)成的.如圖4所示,在漏極加高壓,控制柵�0V,翻�(zhuǎn)拉力方向,將電子從浮柵中拉出。這�(gè)�(dòng)作,如果控制不好,會(huì)出現(xiàn)�(guò)消去的結(jié)��
全球各單片機(jī)生產(chǎn)廠商在MCS-51�(nèi)核基�(chǔ)�,派生了大量的51�(nèi)核系列單片機(jī),極大地豐富了MCS-51的種�,致使MCS-51單片�(jī)是目前國(guó)�(nèi)�(yīng)用最廣泛的一種單片機(jī)�.其中STC公司推出了STC89系列單片�(jī),增加了大量新功能,提高�51的性能,是MCS-51家族中的佼佼�.早期的單片機(jī)控制系統(tǒng),采用單片�(jī)加片外EEPROM配合,�(lái)存儲(chǔ)一些需要預(yù)置的重要參數(shù),并在�(shù)碼管上顯示出�(lái).由于單片�(jī)控制的整流器要求�(shí)�(shí)性很�(qiáng),而早期EEPROM的寫(xiě)周期�10 ms左右,因此�(yùn)行參�(shù)的預(yù)置是在整流器待機(jī)的情況下�(jìn)行的.而很多情況下需要在�(yùn)行的同時(shí)記錄�(shù)�(jù),如用單片�(jī)控制�12脈波汽車(chē)電泳整流器要求在�(yùn)行的同時(shí)�(shí)�(shí)記錄重要�(shù)�(jù),而且在掉電時(shí)不丟�.由于�12脈波整流器中�(yùn)行的單片�(jī)程序,其周期必須小�1.67 ms(交流電網(wǎng)�1�(gè)周期�20 ms,除以12就是l[_]67 ms),這就要求�(shí)�(shí)記錄的時(shí)間在1ms以下甚至更短(考慮到程序的�(zhí)行時(shí)�).�(jīng)查閱資料�(fā)�(xiàn),目前很多EEPROM�(dá)不到這�(gè)要求[1],即使�(shí)間最短的AT89S8252單片�(jī)片內(nèi).EEP-ROM的寫(xiě)周期也是2.5 ms.本文通過(guò)�(duì)EEPROM的巧妙應(yīng)�,�(shí)�(xiàn)了整流器在線記錄�(shù)�(jù)的功��
1 尋找符合要求的單片機(jī)
�(shè)備使用的是Atmel公司的AT89C52(40DIP封裝)單片�(jī)和EEPROM芯片2817A.要想在不改變?cè)O(shè)備電路板的情況下完成要求的功�,就只能在兼容的MCS-51系列單片�(jī)中想辦法.AT89S8252片內(nèi)含有2 KB的EEPROM,�(jīng)編程�(cè)試發(fā)�(xiàn),它雖然能�(shí)�(shí)記錄�(shù)�(jù)并且斷電不丟�,但是在向片內(nèi)EEPROM中記�1�(gè)�(shù)�(jù)�(shí),能引起輸出電壓和電流的波�(dòng),不能�(mǎn)足實(shí)際運(yùn)行的需�.其原因是AT89S8252單片�(jī)片內(nèi)EEPROM的寫(xiě)周期�2.5 ms,超過(guò)�1.67 ms的程序的�(zhí)行周�,從而影響了程序的正常運(yùn)�.所以執(zhí)行周期是解決�(wèn)題的�(guān)��
STC89C51RC/RD+系列單片�(jī)片內(nèi)含有EEPROM(Data Flash),讀1�(gè)字節(jié)/編程1�(gè)字節(jié)/擦除1�(gè)扇區(qū)(512字節(jié))的時(shí)間分別為10/μs/60μs/10 ms.編程1�(gè)字節(jié)的時(shí)間為60μs,�(yuǎn)小于AT89S8252片內(nèi)EEPROM 2.5 ms的編程時(shí)�,這為解決�(wèn)題提供了思路�
2�(wèn)題的解決
單片�(jī)STC89C55RD+(40DIP封裝),其引腳、功能完全與AT89C52兼容,與MCS-51程序也兼�,片內(nèi)含有20KB的Flash程序存儲(chǔ)�,16KB的EEPROM�(shù)�(jù)存儲(chǔ)�.把原用于AT89C52中的程序?qū)懙絊TC89C255RD+�,放到原設(shè)備上�(yùn)�,可長(zhǎng)期穩(wěn)定地�(yùn)�.�(jīng)修改的在整流器中�(yùn)行的單片�(jī)程序,�(shí)�(shí)記錄一些數(shù)�(jù)到STC289C55RD+的EEPROM�,整流器可正常�(yùn)�,但不能執(zhí)行扇區(qū)擦除操作.�(zhí)行扇區(qū)擦除操作將嚴(yán)重影響整流器的正常運(yùn)�,引起輸出電壓和電流的很大波動(dòng).�(zhí)行扇區(qū)擦除操作�(shí),從示波器�(lái)看整流器的輸出間斷了20 ms,電壓電流顯示很大的波�(dòng).用示波器捕捉到了EEPROM�(xiě)�(shí)的波�,輸出波形暫停�20 ms,1�(gè)周波電壓,電壓波形如圖1所�,不執(zhí)行扇區(qū)擦除操作�(shí)的波形如�2所�.從圖中可以看�,�(wèn)題得到了很好的解��
究其原因,這與EEPROM的特�(diǎn)有關(guān).STC89C5lRC/RD+系列單片�(jī)片內(nèi)的EEPROM,與普通的EEPROM不同.普通的EEPROM有字節(jié)讀/�(xiě)功能,不需要擦�,在字節(jié)�(xiě)的時(shí)候自�(dòng)擦除.而STC89C51RC/RD+系列單片�(jī)片內(nèi)的EEPROM,具有Flash的特�,只能在擦除了扇區(qū)后�(jìn)行字節(jié)�(xiě),�(xiě)�(guò)的字節(jié)中不能重�(fù)�(xiě),只有待扇區(qū)擦除后才能重新寫(xiě),而且�(méi)有字節(jié)擦除功能,只能扇區(qū)擦除�
3 EEPROM(Data FIash)的巧妙應(yīng)�
基于以上EEPROM(Data Flash)不易擦除的特�(diǎn),可以�(xiě)后先不擦�.利用EEPROM(Data Flash)容易�(xiě)、時(shí)間短(字節(jié)�(xiě)只有60 μs)的特�(diǎn),可以充分利用其寫(xiě)的功�.根據(jù)汽車(chē)電泳整流器的特點(diǎn):每泳1輛汽�(chē),整流器的輸出電流就從0逐漸上升到電�,然后又逐漸回到0.從電流的變化可以�(zhǔn)確地�(shí)別出電泳�(guò)的車(chē)的數(shù)�.每識(shí)別出1輛車(chē),就在EEPROM(Data Flash)�1�(gè)字節(jié)�(起始地址�0000H)�(xiě)�#01H(也可以是其他�(shù),但不能為#OFFH),然后地址自動(dòng)�1,等待�(shí)別出下一輛車(chē).這樣就通過(guò)EEPROM(Data Flash)字節(jié)地址的方�,間接記錄了汽�(chē)電泳整流器電泳過(guò)的車(chē)輛總�(shù),并可在數(shù)碼管上顯示出�(lái).16 KB的EEPROM(Data Flash)可記�16 384輛車(chē).待將�(jì)�(mǎn)�(shí),可按擦除按鈕擦除EEP-ROM(Data Flash)中的所有扇區(qū),再重新計(jì)�(shù).如按�10分鐘電泳1輛車(chē),1天工�16小時(shí),可連續(xù)記錄16 384/60/10×16)=170�.此種方法也可用于�(duì)電泳整流器連續(xù)工作�(shí)間的累計(jì),如每10分鐘記錄1�(gè)�(shù)�(jù),可連續(xù)記錄16 384/(60/10)=2 730小時(shí)�
整流器停�(jī)斷電�,每次�(kāi)�(jī)給單片機(jī)上電�(shí),在初始化程序�,首先從地址#0000H讀片內(nèi)EEPROM的數(shù)�(jù),如果�(shù)�(jù)不為#OFFH,地址自動(dòng)�1,再讀下一�(gè)字節(jié),直到所讀�(shù)�(jù)�#OFFH為止.此時(shí)EEPROM的地址指針�(shù)�(jù),即為前面累加的電泳車(chē)輛數(shù)(或累�(jì)電泳工作�(shí)�),可在�(shù)碼管上顯示出�(lái).整流器工作后,按前�
�(jié)�(yǔ)
�(jié)合上�(chǎn)的實(shí)際情�,在不改變?cè)O(shè)備電路板的情況下,通過(guò)使用MCS-51系列兼容單片�(jī)STC89C55RD+,巧妙利用其片�(nèi)EEPROM,�(shí)�(xiàn)了在整流器運(yùn)行的同時(shí)記錄�(shù)�(jù)的功�,切掉�(diǎn)情況下不丟失�(shù)�(jù).這種方法有效地提高了原設(shè)備的功能,給用�(hù)的使用到�(lái)了極大的方便,并且通過(guò)�(shí)�(yàn)�(yàn)證了此方法是可行��
介紹
在嵌入式微控制器�(yīng)用中,通常都要用到非易失性存�(chǔ)�.�(wú)論是掉電�(shí)維持需要保存的�(shè)�,還是存儲(chǔ)公司的重要記�,可靠的非易失性存�(chǔ)器都是現(xiàn)代微控制器領(lǐng)域的一�(gè)基本單元�
非易失性存�(chǔ)常常采用外部串行存儲(chǔ)器實(shí)�(xiàn).多年以來(lái),該領(lǐng)域用到了�(shù)十億顆類(lèi)似存�(chǔ)器件,它們的可靠性得到了的廣泛認(rèn)�.目前,存儲(chǔ)器可以做到幾百字節(jié)�1兆字節(jié)甚至更大的容�,在每一�(gè)需要保持設(shè)置的�(shè)備中,都能找到這樣一�(gè)緊湊、廉�(jià)的器��
包括EEPROM、閃存和旋轉(zhuǎn)式存�(chǔ)器在�(nèi),所有類(lèi)型的非易失性存�(chǔ)器都面臨一�(gè)共同的問(wèn)�:�(xiě)周期被中斷時(shí),�(shù)�(jù)�(huì)丟失.一旦在�(xiě)周期�(zhí)行過(guò)程中掉電,那么即使再恢�(fù)電源,也很難修�(fù)損壞的數(shù)�(jù). 本文提出了一種基于事�(wù)的提�-回退�(jī)�,用于保護(hù)一�(gè)外部串行EEPROM存儲(chǔ)器件的內(nèi)�.這些措施同樣適用于大多數(shù)MAXQ微控制器的內(nèi)置EEPROM.可以下載本應(yīng)用的代碼文件(ZIP,20.5kb)�
I2C EEPROM的特�(diǎn)
串行存儲(chǔ)器件有多種接�,但最常用的接口是I2C接口.這種總線接口有很多優(yōu)�(diǎn):高度�(biāo)�(zhǔn)化的接口;控制器和存儲(chǔ)器之間只需兩條�;而且具有靈活的時(shí)序要�,可以由軟件驅(qū)�(dòng).一�(gè)I2C主機(jī)可以�(qū)�(dòng)很多I2C從機(jī),從而減少了主機(jī)的引腳數(shù)�
在所有EEPROM器件�,�(xiě)周期都要比讀周期�(zhǎng)的多.�?yàn)樵趯?xiě)周期�(guò)程中,電荷需要借助隧道效應(yīng)并通過(guò)絕緣層�(jìn)行轉(zhuǎn)�,而這�(gè)�(guò)程很�(fèi)�(shí)�.雖然增加電壓可以加快這�(gè)�(guò)�,但是�(guò)高的電壓�(huì)�(dǎo)致絕緣層的介�(zhì)擊穿,從而損壞器�.典型的EEPROM器件�(xiě)周期持續(xù)10毫秒左右;而讀周期通常需要幾百�(gè)納秒�
為了顯著縮短�(xiě)周期的時(shí)�,許多I2C EEPROM器件采用�(yè)面模�.該模式允許將多�(gè)字節(jié)傳送到緩存�,然后將數(shù)�(jù)一次性寫(xiě)入存�(chǔ)區(qū).I2C存儲(chǔ)器件的典型頁(yè)面尺寸為32字節(jié).因此,可以在一�(gè)�(xiě)周期�(nèi)向EEPROM填入32�(gè)字節(jié)�
這一�(diǎn)非常重要,�?yàn)榇蠩EPROM器件都具有特定的耐久�:即每�(gè)�(yè)面所能承受的�(xiě)周期次數(shù)上限.典型的寫(xiě)周期次數(shù)�10,000�1,000,000�.然�,即使存儲(chǔ)器件能夠承受1百萬(wàn)次寫(xiě)周期,軟件也會(huì)很快將其損耗殆�.軟件每秒僅執(zhí)�100次寫(xiě)周期,那么不到3�(gè)小時(shí)就會(huì)耗盡器件的寫(xiě)周期次數(shù)�
考慮到這些基本的EEPROM特�,�(shè)�(jì)者為一�(gè)嵌入式處理器�(shè)�(jì)可靠的非易失存儲(chǔ)系統(tǒng)�(shí),需切記以下幾點(diǎn):
不要在同一�(yè)面上反復(fù)�(zhí)行寫(xiě)操作.尤其是不要將某�(gè)�(yè)面設(shè)置成�(xiě)入任何其它頁(yè)面時(shí)都要更新�"目錄"�
如果在寫(xiě)周期�(guò)程中電源被中�,必須提供以下�(jī)�:(1) 檢測(cè)被中斷的�(xiě)操作;(2) 完成被中斷的操作;(3) 或者將事件回退至寫(xiě)操作之前的狀�(tài)�
必須通過(guò)某些�(shù)�(jù)校驗(yàn)�(jī)�(校驗(yàn)�、CRC或消息摘�)�(lái)保證�(shù)�(jù)的完整��
�(shè)�(jì)目標(biāo)
雖然上面提到的EEPROM�(wèn)題可通過(guò)多種非易失文件系�(tǒng)加以解決,但這樣的文件機(jī)制對(duì)于小型嵌入式微控制器�(lái)�(shuō)�(fù)�(dān)�(guò)�.很多文件系統(tǒng)需要更多的RAM,�(yuǎn)�(yuǎn)超出了小型微控制器所能提供的容量,而且�(duì)于多�(shù)�(yīng)�,也不需要一�(gè)完整的文件系�(tǒng)�
考慮到這一�(diǎn),下面列出了EEPROM�(shù)�(jù)保護(hù)�(jī)制的�(shè)�(jì)目標(biāo):
精簡(jiǎn):保護(hù)�(jī)制用于存�(chǔ)校驗(yàn)�(shù)�(jù)的空間不�(yīng)超過(guò)EEPROM�10[%],它應(yīng)該只需要少量的�(jì)算開(kāi)�(xiāo)�
塊大�:被保�(hù)的塊大小,�(yīng)該和EEPROM的寫(xiě)操作�(yè)面大小一�.由于EEPROM器件的頁(yè)面大小通常�2的偶�(shù)次冪,因此與每�(gè)塊保�1�2�(gè)字節(jié)的做法相�,相同的尺寸大小更便于軟件編碼�
耐久�:每�(gè)保護(hù)周期不要�(duì)同一�(yè)面�(jìn)行寫(xiě)操作�
可靠�:每次掉電情況�,�(shù)�(jù)都應(yīng)是可恢復(fù)��
這里提到的保�(hù)�(jī)制有6�(gè)接口函數(shù):讀、寫(xiě)、提交、回退、檢查和清理�
讀函數(shù)接收一�(gè)塊編�(hào)和一�(gè)指向32字節(jié)緩存的指�.如果緩存地址和塊編號(hào)處于有效范圍�(nèi),程序就會(huì)將指定的塊數(shù)�(jù)讀入緩�,并校�(yàn)�(shù)�(jù)的有效�.它會(huì)返回如下?tīng)顟B(tài):有效讀(valid read)、無(wú)效讀(invalid read)、無(wú)效緩存地址(invalid buffer address)、無(wú)效頁(yè)面編�(hào)(invalid page number)或保�(hù)失敗(protectiON failure)�
�(xiě)函數(shù)接收一�(gè)塊編�(hào)和一�(gè)指向填好�(shù)�(jù)�32字節(jié)緩存的指�.如果緩存地址和塊編號(hào)處于有效范圍�(nèi),程序就會(huì)將數(shù)�(jù)�(xiě)入非易失性緩�,并標(biāo)記緩存狀�(tài)以準(zhǔn)備提��
提交和回退函數(shù),是可以在�(xiě)操作之后�(zhí)行的互補(bǔ)型操�.提交函數(shù)將最近被�(xiě)入的緩存�(shù)�(jù)�(fù)制到�(duì)�(yīng)的存�(chǔ)區(qū)最終位�,并為下一�(gè)待寫(xiě)入的�(shù)�(jù)塊準(zhǔn)備好緩存�(jié)�(gòu).回退函數(shù)�(shí)際上就是一�(gè)"取消"操作.它消除最近一次寫(xiě)操作�(chǎn)生的效果,并為下一�(gè)�(xiě)操作�(zhǔn)備好緩存子系�(tǒng). 檢查函數(shù)讀取存�(chǔ)器件的每�(gè)�(shù)�(jù)�,并檢查存�(chǔ)�(shù)�(jù)的有效�.該函�(shù)還檢查緩存子系統(tǒng),以確保沒(méi)有未�(zhí)行的�(xiě)操作.任何�(wú)效塊或未�(zhí)行的�(xiě)操作都會(huì)使檢查函�(shù)返回一�(gè)�(cuò)誤狀�(tài)�
清理函數(shù)修復(fù)一�(gè)�(shù)�(jù)損壞的EEPROM.�(shí)際上,它將試圖找出�(fā)生的�(cuò)�,并采取相�(yīng)的解決措施�
�(guān)于這些函數(shù)的更多細(xì)節(jié),參見(jiàn)下面的操作詳��
�1. EEPROM存儲(chǔ)器的�(jié)�(gòu).存儲(chǔ)器被劃分�3�(gè)區(qū)�:主存�(chǔ)區(qū),包含�(shí)際用�(hù)�(shù)�(jù);校驗(yàn)存儲(chǔ)區(qū),包含主存�(chǔ)區(qū)�1�(yè)的CRC;緩存,包含存儲(chǔ)臨時(shí)�(xiě)入數(shù)�(jù)的四�(gè)緩存�
EEPROM�(jié)�(gòu)
參考上面圖1給出的EEPROM�(jié)�(gòu).EEPROM包含三�(gè)主要區(qū)�:
主存�(chǔ)區(qū):EEPROM的區(qū)域用于存�(chǔ)用戶(hù)�(shù)�(jù).在一�(gè)16kB器件�(nèi),包括512�(yè)、每�(yè)32字節(jié)的存�(chǔ)空間.在這樣的器件中,�(kāi)始的473�(gè)�(yè)面專(zhuān)門(mén)用來(lái)存儲(chǔ)�(shù)�(jù)�
校驗(yàn)存儲(chǔ)區(qū):EEPROM的第二�(gè)部分,用于校驗(yàn)主存�(chǔ)區(qū)每�(gè)�(yè)面的�(shù)�(jù).校驗(yàn)存儲(chǔ)區(qū)的每1�(yè)都包�15�(gè)16位的CRC�.�1�(yè)�1�(gè)CRC用于校驗(yàn)本頁(yè)�(shù)�(jù).校驗(yàn)存儲(chǔ)區(qū)占用31�(yè)(�473�503�(yè))�
緩存:EEPROM的部�,包含�8�(gè)�(yè)面構(gòu)成的4�(gè)�(xiě)緩存.每�(gè)緩存包含4�(gè)�:�(shù)�(jù)�,它包�32字節(jié)�(shù)�(jù),�(zhí)行下一�(gè)提交命令�(shí),�(shù)�(jù)將被�(xiě)入主存儲(chǔ)區(qū);地址�,它表示緩存數(shù)�(jù)要寫(xiě)入的�(yè)面地址;狀�(tài)�,它表示緩存的狀�(tài)(包括可用(available)、占�(occupied)和終�(expired)狀�(tài));16位CRC�,用來(lái)校驗(yàn)整�(gè)�(xiě)緩存.緩存�(jié)�(gòu)�(jiàn)�1所示�
這種EEPROM�(jié)�(gòu)可以�(shí)�(xiàn)主要的設(shè)�(jì)目標(biāo).首先,由于主存�(chǔ)區(qū)�1�(yè)�(shù)�(jù)的校�(yàn)�(jié)果都存儲(chǔ)在另一�(gè)位置,所以頁(yè)面的所有位都用于存�(chǔ)用戶(hù)�(shù)�(jù).其次,由于主存�(chǔ)區(qū)的每1�(yè)都通過(guò)校驗(yàn)存儲(chǔ)區(qū)的特定字�(lái)校驗(yàn),因此校驗(yàn)存儲(chǔ)區(qū)不會(huì)有單�(diǎn)�(cuò)�,并且也不�(huì)在每�(gè)�(xiě)周期中都去更新整�(gè)校驗(yàn)存儲(chǔ)區(qū)的同一�(yè)�.,使用4�(gè)�(xiě)緩存分散了寫(xiě)周期帶來(lái)的損��
操作詳解
�(duì)于一�(gè)不帶保護(hù)功能的EEPROM,具體操作非常�(jiǎn)�.一�(gè)讀周期�(jiǎn)單地將字節(jié)從所選擇的地址傳送給主機(jī);一�(gè)�(xiě)周期將字節(jié)從主�(jī)�(xiě)入EEPROM,并等待操作完�(大多�(shù)器件需要幾�(gè)毫秒的時(shí)�).然�,在一�(gè)提供保護(hù)的EEPROM�(huán)境下,讀和寫(xiě)操作就比較復(fù)雜了.在以下各節(jié)�,�(duì)每�(gè)操作�(jìn)行了分解,以便了解函數(shù)被調(diào)用時(shí)到底是如何操作的�
讀操作
�2. 讀操作的流程圖
讀操作這�(gè)最�(jiǎn)單的接口函數(shù),也是相當(dāng)�(fù)雜的.�2給出了操作流�:
檢查�(yè)面地址和緩存地址,以檢�(yàn)它們的有效�.如果地址�(wú)�,則就此結(jié)束操�,函數(shù)返回一�(gè)�(wú)效緩存地址或無(wú)效頁(yè)面編�(hào)�(cuò)誤代��
將所選頁(yè)面讀入緩��
�(jì)算校�(yàn)�(yè)面的地址,并將相應(yīng)的校�(yàn)�(yè)面讀入暫存區(qū)�
�(jì)算校�(yàn)�(yè)面的CRC.如果校驗(yàn)�(yè)面的�(shù)�(jù)�(wú)�,則返回一�(gè)保護(hù)失敗�(cuò)誤代��
�(jì)算數(shù)�(jù)緩存的CRC,并將其與暫存區(qū)中對(duì)�(yīng)讀取頁(yè)面的CRC�(jìn)行比�.如果CRC匹配,則程序返回有效讀代碼;如果CRC不匹�,則程序返�?zé)o效讀代碼.�(wú)論結(jié)果怎樣,�(shí)際讀取的�(shù)�(jù)都保存在返回緩存�,以供�(diào)用讀操作的程序使用�
�(xiě)操作
�3. �(xiě)操作的流程圖
如上所�,�(xiě)操作并不是真正將�(shù)�(jù)�(xiě)入主存儲(chǔ)區(qū).�(shí)際上,�(xiě)操作是將�(shù)�(jù)�(xiě)�4�(gè)緩存之一.在這種方式�,主存�(chǔ)區(qū)�(nèi)原先的數(shù)�(jù)將一直保持到整�(gè)有效�(xiě)操作流程完成后為�.�3的流程說(shuō)明了以下幾點(diǎn):
檢查�(yè)面地址和緩存地址,以檢�(yàn)其有效�.如果地址�(wú)�,操作在這里�(jié)�,函數(shù)返回一�(gè)�(wú)效緩存地址或無(wú)效頁(yè)面編�(hào)�(cuò)誤代��
讀取每�(gè)�(xiě)緩存的狀�(tài)�.如果任何緩存處于占用狀�(tài),則操作失敗并返回�(xiě)�(guò)�(write sequence)�(cuò)誤代��
4�(gè)�(xiě)緩存之一�(yīng)處于終止?fàn)顟B(tài).如果是這樣,激活下一�(gè)緩存�
�(shù)�(jù)被復(fù)制到�(xiě)緩存的數(shù)�(jù)��
�(yè)面地址被寫(xiě)入地址�.�(jì)算CRC校驗(yàn)�(jié)果并將其�(xiě)入CRC�.將狀�(tài)改為占用.將前一�(gè)緩存置為可用狀�(tài)(即更新原�(lái)的終�?fàn)顟B(tài))�
需要注�,此時(shí)�(duì)新寫(xiě)的頁(yè)面�(jìn)行讀操作,將返回頁(yè)面原�(lái)的數(shù)�.只有等提交操作完成后,才會(huì)返回新��
提交操作
�4. 提交操作的流�
提交函數(shù)不需要參�(shù).它的工作就是如實(shí)地將�(shù)�(jù)從寫(xiě)緩存?zhèn)魉偷街鞔�?chǔ)區(qū),然后將寫(xiě)緩存�(biāo)記為終止?fàn)顟B(tài).提交函數(shù)的操作流程如�4所�:
讀取每�(gè)�(xiě)緩存的狀�(tài)�.�(yīng)該只�1�(gè)緩存�(biāo)記為占用狀�(tài).否則,函數(shù)在此�(jié)�,并返回一�(gè)�(xiě)�(guò)程錯(cuò)誤代��
�(duì)被占用的緩存�(jìn)行CRC校驗(yàn).如果不匹�,則返回一�(gè)�(shù)�(jù)損壞�(cuò)誤代碼�
提取�(yè)面地址,并將�(shù)�(jù)�(xiě)入主存儲(chǔ)區(qū)的指定頁(yè)��
�(jì)算緩存的�(shù)�(jù)部分的CRC.該值被保存在一�(gè)臨時(shí)寄存器中�
找到�(duì)�(yīng)所選主存儲(chǔ)區(qū)�(yè)面的校驗(yàn)�(yè)�,并讀取該校驗(yàn)�(yè)面的�(nèi)��
用前面計(jì)算的CRC更新校驗(yàn)�(yè)�,為校�(yàn)�(yè)面計(jì)算新的CRC�
將校�(yàn)�(yè)面數(shù)�(jù)重新�(xiě)回校�(yàn)存儲(chǔ)區(qū)�
將寫(xiě)緩存更新為終�?fàn)顟B(tài)�
回退操作
�5. 回退操作的流程圖
如圖5所�,回退函數(shù)是最�(jiǎn)單的操作之一.由于主存�(chǔ)區(qū)只有在完成一�(gè)提交操作后才更新�(shù)�(jù),而不是在一�(gè)�(xiě)操作之后更新�,所以回退操作只需將寫(xiě)緩存置為�(wú)效狀�(tài)即可�
讀取每�(gè)�(xiě)緩存的狀�(tài)�.�(yīng)該只有一�(gè)緩存被標(biāo)記為占用.否則,函數(shù)在此�(jié)�,并返回一�(gè)�(xiě)�(guò)程錯(cuò)誤代��
將所選的�(xiě)緩存狀�(tài)域置為終��
檢查操作
�6. 檢查操作的流程圖
在任何上電情況下,都需要調(diào)用檢查函�(shù)以確保EEPROM可以接受�(shù)�(jù).檢查函數(shù)檢驗(yàn)存儲(chǔ)系統(tǒng)的可用�,并報(bào)告任何發(fā)�(xiàn)的錯(cuò)�.該函�(shù)的檢查操作如�6所�:
讀取每�(gè)�(xiě)緩存,確�(rèn)只有一�(gè)緩存不是可用狀�(tài).如果只有一�(gè)緩存含有未定義的狀�(tài)代碼,則返回一�(gè)�(xiě)操作中斷(interrupted write)�(cuò)誤代�。如果所有緩存均包含未定義的狀�(tài)代碼,則返回EEPROM未初始化(uninitialized EEPROM)�(cuò)誤代��
如果僅有一�(gè)緩存包含占用狀�(tài)代碼,�(jì)算此緩存的CRC.如果CRC不匹�,則返回一�(gè)�(xiě)操作中斷�(cuò)誤代��
檢查校驗(yàn)存儲(chǔ)區(qū)的每一�(gè)�(yè)�.如果任何�(yè)面沒(méi)有通過(guò)CRC校驗(yàn),則返回保�(hù)失敗�(cuò)誤代碼�
,檢查主存�(chǔ)區(qū)的每一�(yè),并與存儲(chǔ)的各�(yè)CRC�(jìn)行對(duì)�.如果�1�(yè)未通過(guò)CRC校驗(yàn),則返回一�(gè)提交中斷(interrupted commit)�(cuò)誤代��
清理操作
�7. 清理操作的流�
清理函數(shù)解決EEPROM系統(tǒng)存在的任何問(wèn)�.在清理操作退出時(shí),�(wú)論EEPROM子系�(tǒng)先前是何種狀�(tài),都應(yīng)該可以繼�(xù)使用�.所有未提交的寫(xiě)操作將被回退,并且完成失敗的提交操作�
�7演示了清理操作是如何工作�:
如果檢查操作返回一�(gè)EEPROM未初始化的錯(cuò)誤代�,則初始化EEPROM.清除所有數(shù)�(jù)�(yè)�,并且初始化所有校�(yàn)�(yè)�.除一�(gè)�(xiě)緩存被初始化為終�?fàn)顟B(tài)�,清除其它所有寫(xiě)緩存并置為可用狀�(tài)�
如果檢查操作返回一�(gè)�(xiě)操作中斷�(cuò)誤代�,則找到那�(gè)不是可用狀�(tài)的寫(xiě)緩存.將它的狀�(tài)改為終止?fàn)顟B(tài)�
如果檢查操作返回一�(gè)提交中斷�(cuò)誤代�,則找到CRC不匹配的主頁(yè)�.�(jì)算出它的CRC并更新相�(guān)校驗(yàn)�(yè)��
如果檢查操作返回保護(hù)失敗�(cuò)誤代�,則表示緊隨提交操作的更新校驗(yàn)�(yè)面操作被中斷.讀出所有與�(cuò)誤校�(yàn)�(yè)面相�(guān)的主存儲(chǔ)區(qū)�(yè)�,并刷新校�(yàn)�(yè)��
安全性證�
要證明系�(tǒng)的安全�,需要確定寫(xiě)操作�(guò)程中�(shù)�(jù)容易損壞的時(shí)�.(讀操作從本�(zhì)上來(lái)�(shuō)是安全的.讀操作期間不會(huì)�(duì)EEPROM�(yè)面�(jìn)行寫(xiě)操作,因此�(shù)�(jù)不會(huì)被損�.) 確定了這些易損�(shí)刻后,只需要再確定一�(gè)恢復(fù)�(guò)�.如果恢復(fù)�(jī)制涵蓋了所有可能的�(shù)�(jù)損失情況,而且如果我們假定在任何一�(gè)可能破壞EEPROM�(xiě)周期的事件之�,都將首先�(zhí)行校�(yàn)/清理周期(例如上電),那么系統(tǒng)就是安全��
在大多數(shù)串行EEPROM器件�,一�(gè)�(xiě)操作首先將頁(yè)面的每位�(shù)�(jù)都置為已知�,然后將所有需要改變的位設(shè)置為需要的�.因此在掉電時(shí),中斷的寫(xiě)操作極有可能破壞該頁(yè)的所有字節(jié).�??梢酝ㄟ^(guò)向損壞頁(yè)面寫(xiě)入新�(shù)�(jù),�(jìn)而從這一失效事件中恢�(fù)出來(lái).但這會(huì)失去原來(lái)的數(shù)�(jù)�
�(xiě)操作�(guò)程中�(shù)�(jù)容易損壞的時(shí)刻如下所�(按發(fā)生的�(shí)間順序排�):
�(duì)�(shù)�(jù)域�(jìn)行寫(xiě)操作:如果此時(shí)�(fā)生電源失效事�,檢查操作不會(huì)檢測(cè)到錯(cuò)�.正在被寫(xiě)入的�(xiě)緩存仍顯示可用狀�(tài),但可用的緩存不包含有效的CRC��
向當(dāng)前寫(xiě)緩存�(xiě)入狀�(tài)信息:這�(gè)操作將狀�(tài)域改為占用狀�(tài),�(shè)定CRC并為�(xiě)操作填入�(yè)面地址.如果這�(gè)�(guò)程被中斷,可能�(fā)生如下情�:(1) 狀�(tài)�(wú)�,從而導(dǎo)致一�(gè)�(xiě)操作中斷�(cuò)�;(2) 狀�(tài)有效,但CRC�(cuò)�,仍會(huì)�(dǎo)致一�(gè)�(xiě)操作中斷�(cuò)�;(3) 狀�(tài)和CRC域有�.在這種情形�,系統(tǒng)有未提交處理的寫(xiě)操作.可以檢測(cè)到這一狀�(tài),�?yàn)榇藭r(shí)一�(gè)緩存將處于占用狀�(tài)而另一�(gè)緩存為終�?fàn)顟B(tài).如果子系�(tǒng)的其它部分檢查通過(guò),則用�(hù)代碼可通過(guò)�(fā)出提交或回退操作繼續(xù)�(zhí)�.�(wú)論發(fā)生何種情�,主存�(chǔ)區(qū)和校�(yàn)存儲(chǔ)區(qū)都是安全的�
前一�(gè)緩存狀�(tài)清除為可用狀�(tài):緩存可能有損壞的狀�(tài)或CRC,而下一�(gè)緩存為占用狀�(tài).這意味著清除該緩存的狀�(tài)�(shí)操作被中�,這種情況下可以執(zhí)行提交或回退操作�
在寫(xiě)操作和提交操作之�:只有一�(gè)�(xiě)緩存將處于占用狀�(tài),并且通過(guò)了CRC校驗(yàn).用戶(hù)代碼可以�(qǐng)求提交或回退操作.�(xiě)緩存、校�(yàn)存儲(chǔ)區(qū)和主存儲(chǔ)區(qū)都是安全��
提交操作�(guò)程中�(shù)�(jù)容易損壞的時(shí)刻如下所�:
將數(shù)�(jù)域復(fù)制到主存�(chǔ)區(qū):如果�(xiě)操作被中�,主存�(chǔ)區(qū)�1�(gè)�(yè)面數(shù)�(jù)可能被破�.檢查函數(shù)�(huì)檢測(cè)到兩種狀�(tài):(1) 一�(gè)有效的占用寫(xiě)緩存;(2) 中斷的提交操作導(dǎo)致主存儲(chǔ)區(qū)�(yè)面數(shù)�(jù)損壞。寫(xiě)緩存和校�(yàn)存儲(chǔ)區(qū)是安全的,在這種情況�,清理操作�(huì)完成提交操作并返回一�(gè)干凈的系�(tǒng)。注�:即使�(xiě)操作已經(jīng)完成,檢查操作仍會(huì)�?yàn)樾r?yàn)存儲(chǔ)區(qū)的CRC與計(jì)算出的CRC不匹配而報(bào)�(cuò)�
更新校驗(yàn)存儲(chǔ)區(qū)的CRC:如果�(duì)校驗(yàn)�(yè)面的�(xiě)操作被中�,則整�(gè)�(yè)面的�(shù)�(jù)都可能被破壞.這意味著主存�(chǔ)區(qū)�15�(gè)�(yè)面都�(duì)�(yīng)著無(wú)效的CRC.但是由于校驗(yàn)存儲(chǔ)區(qū)的每一�(yè)都有自己的校�(yàn)�,而且在寫(xiě)操作中斷后會(huì)�(chǎn)生校�(yàn)和錯(cuò)�,因此檢查程序�(huì)�(fā)�(xiàn)這一�(diǎn).在這種情況�,檢查程序�(huì)返回保護(hù)失敗.修復(fù)方法如下:首先重新�(jì)算所有受影響�15�(gè)�(yè)面的CRC�.然后將這些值和該頁(yè)自身的有效CRC值一起寫(xiě)入校�(yàn)�(yè)��
更新�(xiě)緩存的狀�(tài)信息:如果�(dāng)狀�(tài)變量從占用狀�(tài)�?yōu)榻K�?fàn)顟B(tài)�(shí),�(xiě)周期被中�,那么整�(gè)�(xiě)緩存�(yè)面的�(shù)�(jù)都可能被損壞。但�,校驗(yàn)存儲(chǔ)區(qū)和主存儲(chǔ)區(qū)都是安全�。檢查操作會(huì)找到�(shù)�(jù)損壞的頁(yè)�,并返回寫(xiě)操作中斷�(cuò)誤代�.�(dāng)�(yùn)行清理程序時(shí),它將�(fù)位寫(xiě)緩存子系�(tǒng),并完成提交操作�
,在回退操作中數(shù)�(jù)容易損壞的時(shí)刻為:
更新�(xiě)緩存的狀�(tài):與提交周期的最終狀�(tài)�(lèi)�,該操作只是簡(jiǎn)單地將寫(xiě)緩存的占用狀�(tài)�(fù)位至終止?fàn)顟B(tài).如果它被中斷,則檢查程序會(huì)返回�(xiě)操作中斷,并且清理程序�(huì)重新初始化所有的�(xiě)緩存區(qū)�.校驗(yàn)存儲(chǔ)區(qū)和主存儲(chǔ)區(qū)仍是安全��
可以看出,�(wú)論電源何�(shí)掉電或處理器何時(shí)被復(fù)�,存儲(chǔ)子系�(tǒng)都可保持?jǐn)?shù)�(jù)的完整�.�(fā)生電源失效事件后,存儲(chǔ)子系�(tǒng)�(huì)返回到可�(jìn)行讀�?qū)懙臓顟B(tài).如果一�(gè)提交操作被中�,子系�(tǒng)�(huì)返回到可�(zhí)行提交或回退操作的狀�(tài)�
�(shè)�(jì)起步
MAXQ微控制器的EEPROM存儲(chǔ)系統(tǒng)功能完備.系統(tǒng)�(shè)�(jì)者可以根�(jù)需要來(lái)增強(qiáng)該系�(tǒng)的功�.但需要注意以下幾�(diǎn):
C封裝程序:在多�(shù)C�(yǔ)言�(biāo)�(zhǔn)�,與匯編語(yǔ)言子程序雙向傳送數(shù)�(jù)�(shí)都有一套標(biāo)�(zhǔn)的方�.例如在IAR�(kāi)�(fā)�(huán)境下,參數(shù)在低編號(hào)的累加器中傳入和傳出.由于參數(shù)已經(jīng)傳入A[0]和A[1],為這些程序建立一�(gè)C封裝�,就像�(xiě)函數(shù)原型一樣容�.在其它C�(huán)境下,參數(shù)傳遞是通過(guò)�(shù)�(jù)棧�(jìn)行的,需要一�(gè)�(jiǎn)單的封裝子程��
并發(fā)處理:首先要保證寫(xiě)周期的完整�,并且提供一套能夠保證完整性的�(jī)�,�(duì)于整�(gè)平臺(tái)的成敗至�(guān)重要.但很多應(yīng)用都需要這樣一種機(jī)�,即可以讓一系列�(xiě)周期排隊(duì)并一次執(zhí)行完�,從而保證全都執(zhí)行或全都不執(zhí)�.但本文討論的�(jī)制不能工作在這種方式�.如果一�(gè)系統(tǒng)存有跨越多�(gè)�(yè)面的信息記錄,則可以中斷一�(gè)�(xiě)操作,這使得恢�(fù)之后的記錄涵蓋了包含部分新數(shù)�(jù)的頁(yè)面和包含部分舊數(shù)�(jù)的頁(yè)�.有一種方法可避免該問(wèn)�,即在�(zhí)行提交操作之前允許多重寫(xiě)操作.這種方法并不像聽(tīng)上去那么�(jiǎn)�,�?yàn)橐粋�(gè)部分提交的事�(wù),可能同時(shí)包括新紀(jì)錄片�、舊記錄片斷和損壞的�(yè)��
平均讀�(xiě)�(jī)�:平均讀�(xiě)作為閃存文件系統(tǒng)的一�(gè)特點(diǎn),是指虛擬化頁(yè)面地址,使得被頻繁寫(xiě)入的�(yè)面會(huì)出現(xiàn)在存�(chǔ)器的任何物理位置.但是很難找到�(shí)�(xiàn)這一目標(biāo)的方�.這是�?yàn)?最直接的解決方�(活動(dòng)存儲(chǔ)塊的目錄處于固定的位�,并且每次�(xiě)操作后都要對(duì)它�(jìn)行更�)�(huì)�(dǎo)致存�(chǔ)目錄的頁(yè)面迅速損�.所�,就像處理�(shù)�(jù)�(yè)面那�,還必須虛擬化和離散化目錄本身�
其它�(yè)面尺�:這里給出的系�(tǒng)假定采用一�(gè)16kB、每�(yè)32字節(jié)的存�(chǔ)器件.如果所選擇的器件具有更大的�(yè)面尺�(64字節(jié)�128字節(jié)),這些函數(shù)仍可工作,只是�(huì)伴隨一些額外的�(xiě)入損�.(更新128字節(jié)�(yè)面中�32字節(jié)區(qū)段時(shí),�(huì)�(duì)整�(gè)128字節(jié)�(yè)面執(zhí)行寫(xiě)操作).但這些函數(shù)�(wú)法對(duì)具有更小�(yè)面尺寸的器件�(jìn)行操�.可以�(gòu)建一�(gè)能夠在線確定EEPROM器件特性的系統(tǒng),并可根據(jù)�(shí)際特性配置系�(tǒng)的參�(shù)�
增強(qiáng)的安全�:本系�(tǒng)�(duì)以下�(lèi)型的�(cuò)誤提供保�(hù):由于電源失效或不可預(yù)期的系統(tǒng)�(fù)位而造成的EEPROM操作中斷.但EEPROM器件偶爾也會(huì)�?yàn)槠渌虺鲥e(cuò).例如,由于電路噪聲或致電離輻射�(dǎo)致的軟件�(cuò)�.或者由于一�(gè)或多�(gè)存儲(chǔ)單元損耗而導(dǎo)致硬件錯(cuò)��
一種解決方法是�(jì)算并維護(hù)校正�(syndrome),而不是采用簡(jiǎn)單的CRC校驗(yàn)�.校正子和校驗(yàn)字類(lèi)�,但是包含了足夠的信息以修�(fù)�(jiǎn)單的位錯(cuò)�.最�(jiǎn)單的校正子系�(tǒng)可以用log2n + 1�(gè)校驗(yàn)位來(lái)檢驗(yàn)n�(gè)�(shù)�(jù)�.因此,�(duì)于一�(gè)32字節(jié)(256�)的頁(yè)面來(lái)�(shuō),一�(gè)僅包�9位的校正子就可以修正任何1位錯(cuò)�.�(duì)�(shù)�(jù)完整性的要求更加�(yán)格時(shí),可以采用更加�(fù)雜的系統(tǒng)�(lái)解決�(lèi)似問(wèn)��
�(jié)�(yǔ)
外部串行EEPROM為微控制器環(huán)境下存儲(chǔ)非易失數(shù)�(jù)提供了一種可靠的方法.利用本文提到的技�(shù),即使面臨�(xiě)操作中斷的情�,串行EEPROM依然能夠可靠地工�.在任何對(duì)�(shù)�(jù)完整性要求較高的�(yīng)用中,�(shè)�(jì)者都可以考慮這些技�(shù)�
維庫(kù)電子�,電子知�(shí),一查百通!
已收錄詞�153979�(gè)