<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 元件/連接器 > 設計應用 > I2C串行EEPROM應用系統的健壯性設計

I2C串行EEPROM應用系統的健壯性設計

作者: 時(shí)間:2008-03-28 來(lái)源: 收藏

  引言

本文引用地址:http://dyxdggzs.com/article/80826.htm

  在嵌入式控制系統中,通常要用到非易失性存儲器。無(wú)論是掉電時(shí)維持需要保存的設置,還是存儲重要記錄,可靠的非易失性存儲器都是一種理想的選擇。非易失性存儲常常采用外部串行存儲器來(lái)實(shí)現,其中I2C接口產(chǎn)品是最常用的一種類(lèi)型。然而,這種產(chǎn)品和其他存儲器一樣,在使用時(shí)也存在著(zhù)一些條件會(huì )潛在地導致其產(chǎn)生某些非標準的甚至是錯誤的操作。因此在進(jìn)行I2C串行存儲器的應用設計時(shí),除了應考慮數據手冊規范之外,還必須考慮更多的因素,這樣才能實(shí)現更健壯的總體設計,確保系統具有優(yōu)良的質(zhì)量特性。

  1 防意外寫(xiě)措施

  器件在上電/掉電期間或者SDA/SCL線(xiàn)的噪聲過(guò)大時(shí)都有可能導致意外寫(xiě)操作。為了解決這一問(wèn)題,一方面需要使用去耦電容(容量通常為0.1 μF)來(lái)幫助濾除VCC上的紋波,另一方面則可以通過(guò)寫(xiě)保護措施來(lái)防止對器件的非法訪(fǎng)問(wèn)。

  對于具有硬件寫(xiě)保護功能的器件,既可以將其WP引腳連接到VCC來(lái)保護整個(gè)陣列,也可以將其WP引腳連接到VSS來(lái)放棄寫(xiě)保護。通常用戶(hù)可以將 WP引腳連接到微控制器的一根I/O口線(xiàn)上,并在該引腳與VCC間連接一個(gè)上拉電阻,這樣就可確保器件在平時(shí)處于寫(xiě)保護狀態(tài);但是要啟動(dòng)寫(xiě)周期,WP引腳必須首先被驅動(dòng)為邏輯0。注意,WP引腳不能懸空,否則器件將無(wú)法正常工作。

  對于無(wú)寫(xiě)保護功能的器件,則可以利用一個(gè)電子開(kāi)關(guān)對其SDA引腳與微控制器之間的連接進(jìn)行通斷控制來(lái)實(shí)現寫(xiě)保護。平常不訪(fǎng)問(wèn)器件時(shí),切斷它們的連接;僅在需要對器件實(shí)施讀/寫(xiě)操作時(shí)才接通。

  2 數據完整性保護措施

  在整個(gè)寫(xiě)周期內(對于大多數器件而言,通常最大為5 ms),必須將VCC維持在最小工作電壓以上。如果此時(shí)VCC掉電或降到最小電壓以下,則無(wú)論時(shí)間長(cháng)短,均無(wú)法確保被寫(xiě)頁(yè)面的數據完整性,可能導致編程數據的不正確。此外,由于無(wú)法對單元進(jìn)行完全編程,器件的數據保留時(shí)間會(huì )比數據手冊中規定的時(shí)間短。對于寫(xiě)周期內電源故障所導致的這些問(wèn)題,通??梢栽谲浖喜扇∠鄳谋Wo措施來(lái)加以解決?;谑挛锏奶峤?mdash;回退機制[1]就是一種典型的解決方案??梢宰C明,當EEPROM存儲器應用系統采用該機制后,無(wú)論電源何時(shí)掉電或微控制器何時(shí)被復位,EEPROM存儲子系統都可保持數據的完整性。

  (1) 提交—回退機制的建立

  提交—回退機制的建立包括兩方面的內容:一方面是定義EEPROM存儲器的邏輯結構;另一方面是構造對存儲子系統進(jìn)行訪(fǎng)問(wèn)、檢查和錯誤清理的接口函數。該機制將EEPROM存儲器劃分為主存儲區、校驗存儲區和緩存區3個(gè)部分。其中主存儲區用于存放用戶(hù)數據;校驗存儲區用于存放主存儲區每個(gè)頁(yè)面的 CRC校驗碼,且該區中每一頁(yè)的最后一個(gè)CRC用于校驗本頁(yè)數據;緩存區包括多個(gè)寫(xiě)緩存,每個(gè)寫(xiě)緩存包含4個(gè)域——數據域、地址域、狀態(tài)域和16位CRC 域。數據域用于臨時(shí)存放寫(xiě)函數寫(xiě)入的數據頁(yè)面,執行下一個(gè)提交命令時(shí),該數據頁(yè)面將從緩存區傳送到主存儲區。地址域表示緩存數據要寫(xiě)入的頁(yè)面地址;狀態(tài)域表示緩存的狀態(tài),包括可用(available)、占用(occupied)和終止(expired)狀態(tài);16位CRC域用來(lái)校驗整個(gè)寫(xiě)緩存。

  該機制提供了6個(gè)接口函數:讀、寫(xiě)、提交、回退、檢查和清理。

 ?、?讀函數。接收1個(gè)頁(yè)面編號和1個(gè)用于存放待讀出數據的暫存區指針。如果暫存區指針和頁(yè)面編號處于有效范圍內,程序就會(huì )將指定的頁(yè)面數據讀入暫存區,并校驗數據的有效性。該函數會(huì )返回如下?tīng)顟B(tài)之一:有效讀(valid read)、無(wú)效讀(invalid read)、無(wú)效暫存區地址(invalid buffer address)、無(wú)效頁(yè)面編號(invalid page number)或保護失敗(protection failure)。

 ?、?寫(xiě)函數。接收1個(gè)頁(yè)面編號和1個(gè)指向填好數據的暫存區指針。如果暫存區指針和頁(yè)面編號處于有效范圍內,程序就會(huì )將數據寫(xiě)入非易失性緩存,并標記緩存狀態(tài)以準備提交。

 ?、?提交和回退函數。提交和回退函數是可以在運行寫(xiě)函數之后執行的互補型操作。提交函數將最近被寫(xiě)入緩存的數據復制到存儲區中的對應位置,并為下一個(gè)待寫(xiě)入的數據頁(yè)面準備好緩存結構?;赝撕瘮祵?shí)際上就是一個(gè)“取消”操作,它消除最近一次執行寫(xiě)函數產(chǎn)生的效果,并為下一個(gè)寫(xiě)操作準備好緩存子系統。

 ?、?檢查函數。讀取存儲器件的每個(gè)數據頁(yè)面,并檢查存儲數據的有效性。該函數還檢查緩存子系統,以確保沒(méi)有未執行的寫(xiě)操作。任何無(wú)效頁(yè)面或未執行的寫(xiě)操作都會(huì )使檢查函數返回一個(gè)錯誤狀態(tài)。

 ?、?清理函數。修復一個(gè)數據損壞的EEPROM。實(shí)際上,它將試圖找出發(fā)生的錯誤,并采取相應的解決措施。

  (2) 提交—回退機制的應用

  讀操作:調用讀函數來(lái)實(shí)現。

  更新主存儲區數據操作:先調用寫(xiě)函數再調用提交函數來(lái)完成。主存儲區只有在完成一個(gè)提交操作后才更新數據,而不是在一個(gè)寫(xiě)操作之后更新的。

  異常處理:在任何一個(gè)可能破壞EEPROM寫(xiě)周期的事件之后(例如上電之后),都將首先執行校驗/清理函數。檢查函數將檢驗存儲系統的可用性,并報告任何發(fā)現的錯誤;清理函數將根據檢查函數返回的錯誤代碼解決EEPROM系統存在的任何問(wèn)題。在清理操作退出時(shí),無(wú)論EEPROM子系統先前是何種狀態(tài),都應該可以繼續使用。

  3 I2C通信的有效性保證措施

  (1) 軟件復位

  有時(shí)EEPROM器件可能需要執行軟件復位序列來(lái)確保其處于正確并且已知的狀態(tài)。這在某些情況下會(huì )很有用。例如,在EEPROM上電時(shí),若總線(xiàn)噪聲過(guò)大,EEPROM上電后將會(huì )進(jìn)入不正確的狀態(tài);又如,微控制器在通信期間若發(fā)生復位,將會(huì )使通信陷入不同步的狀態(tài)。為了確保在出現這些情況之后,系統的微控制器與I2C串行EEPROM器件之間能夠正確、有效地實(shí)現通信,可以先發(fā)送圖1所示的軟件復位序列,使I2C接口器件可靠復位,之后,再啟動(dòng)數據的傳輸過(guò)程?! ?/p>

按此在新窗口瀏覽圖片

   圖1 軟件復位序列

  第1個(gè)起始位會(huì )使器件從期望接收微控制器數據的狀態(tài)復位。在該模式下,器件處于接收模式并監視數據總線(xiàn),能夠檢測到強制其內部復位的起始位。9 位“1”用于強制復位那些無(wú)法通過(guò)前面的起始位復位的器件。這只在以下情況下發(fā)生:器件處于在總線(xiàn)上驅動(dòng)應答(低電平)的模式中;或處于輸出模式中,正在總線(xiàn)上驅動(dòng)輸出數據位0。在這兩種情況下,由于器件將總線(xiàn)保持在低電平,所以無(wú)法產(chǎn)生前面的起始位(定義為SCL為高電平時(shí)SDA被拉低)。通過(guò)發(fā)送9位 “1”,可以確保器件檢測到NACK(即微控制器不將總線(xiàn)驅動(dòng)為低電平,從而不應答EEPROM發(fā)送的數據),這樣也會(huì )強制進(jìn)行內部復位。

  發(fā)送第2個(gè)起始位是為了防止在以下情況中可能發(fā)生的罕見(jiàn)的錯誤寫(xiě)操作:微控制器在向EEPROM發(fā)送寫(xiě)命令時(shí)被復位,并且在發(fā)送第1個(gè)起始位時(shí) EEPROM正在總線(xiàn)上驅動(dòng)ACK。在這種特殊情況下,如果沒(méi)有發(fā)送第2個(gè)起始位,而是發(fā)送了停止位,器件將啟動(dòng)寫(xiě)周期。只有在微控制器向EEPROM發(fā)送寫(xiě)命令時(shí)被復位的情況下,才可能發(fā)生這種錯誤寫(xiě)操作。

  最后的停止位將終止總線(xiàn)活動(dòng),并將EEPROM置于待機模式中。

  (2) 檢查應答位

  I2C通信的眾多優(yōu)點(diǎn)之一就是在接收到每個(gè)字節后發(fā)送應答位ACK。除了正在進(jìn)行寫(xiě)周期之外,I2C接口EEPROM在接收到每個(gè)字節后總會(huì )發(fā)送1位低電平,表明已收到有效的起始位和控制字節。因此,主器件可以在整個(gè)運行期間監視接收到的ACK位,以檢測可能發(fā)生的任何錯誤。在發(fā)送期間檢查接收到的ACK是否為邏輯1(表明EEPROM沒(méi)有響應)始終是一種好的做法,若接收到ACK為邏輯1,則需要執行一個(gè)錯誤處理程序來(lái)確定器件為何沒(méi)有響應,并根據需要執行軟件復位序列。

  (3) 應答查詢(xún)

  串行EEPROM上的寫(xiě)操作要求在啟動(dòng)寫(xiě)操作后遵守寫(xiě)周期時(shí)間,使器件有時(shí)間存儲數據。在此期間,正常器件操作將被禁止,微控制器對器件的所有訪(fǎng)問(wèn)嘗試都將被忽略。因此,微控制器應等待寫(xiě)周期結束后再?lài)L試訪(fǎng)問(wèn)EEPROM,這一點(diǎn)很重要。每個(gè)器件在其數據手冊中都給出了最長(cháng)的寫(xiě)周期時(shí)間,該參數通常用TWC表示。確保遵守寫(xiě)周期時(shí)間的一種簡(jiǎn)單方法是:在再次訪(fǎng)問(wèn)EEPROM之前執行規定時(shí)長(cháng)的延時(shí)。但是,器件在短于規定的最長(cháng)時(shí)間內完成寫(xiě)周期是很尋常的事。因而,用這種延時(shí)方法會(huì )使EEPROM完成寫(xiě)操作后的一段時(shí)間內微控制器仍在等待。為了消除這段額外的時(shí)間,使運行更加高效,強烈建議利用應答查詢(xún)功能。由于I2C接口EEPROM器件在寫(xiě)周期內不會(huì )應答,所以可在發(fā)送停止條件并啟動(dòng)器件的內部寫(xiě)周期后持續地向器件發(fā)送寫(xiě)命令控制字節并進(jìn)行應答查詢(xún),直到接收到指示寫(xiě)操作已完成的ACK位為止。圖2是應答查詢(xún)流程?! ?/p>

按此在新窗口瀏覽圖片

   圖2 應答查詢(xún)流程

  4 延長(cháng)EEPROM使用壽命的方法

  (1) 避免對同一區域反復執行寫(xiě)操作

  不要在同一個(gè)單元或同一個(gè)頁(yè)面上反復執行寫(xiě)操作,尤其是不要將某個(gè)頁(yè)面設置成寫(xiě)入任何其他頁(yè)面時(shí)都要更新的“目錄”。

  (2) 盡可能降低供電電壓

  在滿(mǎn)足器件最低供電電壓的前提下,供電電壓越低,器件的使用壽命越長(cháng)。

  (3) 選擇適當的寫(xiě)操作模式

  EEPROM存儲器的寫(xiě)操作有3種模式:字節模式、頁(yè)寫(xiě)模式和塊寫(xiě)模式。有些器件支持所有上述3種模式,而另一些器件則可能只支持上述3種模式中的一種或兩種。選擇適當的寫(xiě)操作模式,可使 EEPROM存儲器的使用壽命得以延長(cháng)。在僅需要改變存儲器中的一個(gè)字節時(shí),應采用字節模式。而在需要改變存儲器中的某塊內容或全部?jì)热輹r(shí),寫(xiě)操作模式的選擇原則是:首先應考慮塊寫(xiě)模式,其次再考慮頁(yè)寫(xiě)模式,最后才是字節模式。

  (4) 存儲塊輪換使用

  一般應用中,要存儲的數據比較單一,EEPROM空間與要存儲的數據相比會(huì )大得多。為此,可采用一種存儲塊輪換使用的方法來(lái)延長(cháng)EEPROM的使用壽命。其原理如下:

  根據要存儲的數據量將EEPROM空間分塊,從第1塊開(kāi)始存儲數據,當數據被改寫(xiě)N次后轉到第2塊存放,等到第2塊中的數據被改寫(xiě)N次后再轉到第3塊存放,依此類(lèi)推,直到最后一個(gè)塊存放的數據被改寫(xiě)N次后,又轉到第1個(gè)塊重新開(kāi)始。在這種解決方案中,系統掉電后再上電時(shí)可用來(lái)確定數據存儲塊首地址的方法有[2]: 找最大數據法、用后還原法和地址指針?lè )ā?/p>

  結語(yǔ)

  健壯性設計是確保系統具有優(yōu)良質(zhì)量特性的基本措施。本文介紹的技術(shù)實(shí)用、可靠,在對I2C串行EEPROM存儲器進(jìn)行應用設計時(shí)應該盡可能地考慮這些技術(shù)。

  參考文獻

  [1] Maxim/Dallas公司.MAXQ環(huán)境下EEPROM的保護措施[EB/OL]. http://www.maximic.com.cn/appnotes.cfm/appnote_number/3771,20061213.

  [2] 李維平,張濤,丁振君.延長(cháng)EEPROM使用壽命的方法[J].單片機與嵌入式系統應用,2005(6).

  汪社民(高級工程師),主要研究方向為智能化儀器儀表及嵌入式系統。

存儲器相關(guān)文章:存儲器原理




關(guān)鍵詞: EEPROM

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>