I2串行EEPROM應用系統的設計
在嵌入式控制系統中,通常要用到非易失性存儲器。無論是掉電時維持需要保存的設置,還是存儲重要記錄,可靠的非易失性存儲器都是一種理想的選擇。非易失性存儲常常采用外部串行存儲器來實現,其中I2C接口產品是最常用的一種類型。然而,這種產品和其他EEPROM存儲器一樣,在使用時也存在著一些條件會潛在地導致其產生某些非標準的甚至是錯誤的操作。因此在進行I2C串行EEPROM存儲器的應用設計時,除了應考慮數據手冊規范之外,還必須考慮更多的因素,這樣才能實現更健壯的總體設計,確保系統具有優良的質量特性。
1? 防意外寫措施
器件在上電/掉電期間或者SDA/SCL線的噪聲過大時都有可能導致意外寫操作。為了解決這一問題,一方面需要使用去耦電容(容量通常為0.1 μF)來幫助濾除VCC上的紋波,另一方面則可以通過寫保護措施來防止對器件的非法訪問。
對于具有硬件寫保護功能的器件,既可以將其WP引腳連接到VCC來保護整個陣列,也可以將其WP引腳連接到VSS來放棄寫保護。通常用戶可以將WP引腳連接到微控制器的一根I/O口線上,并在該引腳與VCC間連接一個上拉電阻,這樣就可確保器件在平時處于寫保護狀態;但是要啟動寫周期,WP引腳必須首先被驅動為邏輯0。注意,WP引腳不能懸空,否則器件將無法正常工作。
對于無寫保護功能的器件,則可以利用一個電子開關對其SDA引腳與微控制器之間的連接進行通斷控制來實現寫保護。平常不訪問器件時,切斷它們的連接;僅在需要對器件實施讀/寫操作時才接通。
2? 數據完整性保護措施
在整個寫周期內(對于大多數器件而言,通常最大為5 ms),必須將VCC維持在最小工作電壓以上。如果此時VCC掉電或降到最小電壓以下,則無論時間長短,均無法確保被寫頁面的數據完整性,可能導致編程數據的不正確。此外,由于無法對EEPROM單元進行完全編程,器件的數據保留時間會比數據手冊中規定的時間短。對于寫周期內電源故障所導致的這些問題,通常可以在軟件上采取相應的保護措施來加以解決。基于事物的提交—回退機制[1]就是一種典型的解決方案。可以證明,當EEPROM存儲器應用系統采用該機制后,無論電源何時掉電或微控制器何時被復位,EEPROM存儲子系統都可保持數據的完整性。
(1) ?提交—回退機制的建立
提交—回退機制的建立包括兩方面的內容:一方面是定義EEPROM存儲器的邏輯結構;另一方面是構造對存儲子系統進行訪問、檢查和錯誤清理的接口函數。該機制將EEPROM存儲器劃分為主存儲區、校驗存儲區和緩存區3個部分。其中主存儲區用于存放用戶數據;校驗存儲區用于存放主存儲區每個頁面的CRC校驗碼,且該區中每一頁的最后一個CRC用于校驗本頁數據;緩存區包括多個寫緩存,每個寫緩存包含4個域——數據域、地址域、狀態域和16位CRC域。數據域用于臨時存放寫函數寫入的數據頁面,執行下一個提交命令時,該數據頁面將從緩存區傳送到主存儲區。地址域表示緩存數據要寫入的頁面地址;狀態域表示緩存的狀態,包括可用(available)、占用(occupied)和終止(expired)狀態;16位CRC域用來校驗整個寫緩存。
該機制提供了6個接口函數:讀、寫、提交、回退、檢查和清理。
① ?讀函數。接收1個頁面編號和1個用于存放待讀出數據的暫存區指針。如果暫存區指針和頁面編號處于有效范圍內,程序就會將指定的頁面數據讀入暫存區,并校驗數據的有效性。該函數會返回如下狀態之一:有效讀(valid read)、無效讀(invalid read)、無效暫存區地址(invalid buffer address)、無效頁面編號(invalid page number)或保護失敗(protection failure)。
②? 寫函數。接收1個頁面編號和1個指向填好數據的暫存區指針。如果暫存區指針和頁面編號處于有效范圍內,程序就會將數據寫入非易失性緩存,并標記緩存狀態以準備提交。
③ ?提交和回退函數。提交和回退函數是可以在運行寫函數之后執行的互補型操作。提交函數將最近被寫入緩存的數據復制到存儲區中的對應位置,并為下一個待寫入的數據頁面準備好緩存結構。回退函數實際上就是一個“取消”操作,它消除最近一次執行寫函數產生的效果,并為下一個寫操作準備好緩存子系統。
④? 檢查函數。讀取存儲器件的每個數據頁面,并檢查存儲數據的有效性。該函數還檢查緩存子系統,以確保沒有未執行的寫操作。任何無效頁面或未執行的寫操作都會使檢查函數返回一個錯誤狀態。
⑤? 清理函數。修復一個數據損壞的EEPROM。實際上,它將試圖找出發生的錯誤,并采取相應的解決措施。
(2)? 提交—回退機制的應用
讀操作:調用讀函數來實現。
更新主存儲區數據操作:先調用寫函數再調用提交函數來完成。主存儲區只有在完成一個提交操作后才更新數據,而不是在一個寫操作之后更新的。
異常處理:在任何一個可能破壞EEPROM寫周期的事件之后(例如上電之后),都將首先執行校驗/清理函數。檢查函數將檢驗存儲系統的可用性,并報告任何發現的錯誤;清理函數將根據檢查函數返回的錯誤代碼解決EEPROM系統存在的任何問題。在清理操作退出時,無論EEPROM子系統先前是何種狀態,都應該可以繼續使用。
3? I2C通信的有效性保證措施
(1) ?軟件復位
有時EEPROM器件可能需要執行軟件復位序列來確保其處于正確并且已知的狀態。這在某些情況下會很有用。例如,在EEPROM上電時,若總線噪聲過大,EEPROM上電后將會進入不正確的狀態;又如,微控制器在通信期間若發生復位,將會使通信陷入不同步的狀態。為了確保在出現這些情況之后,系統的微控制器與I2C串行EEPROM器件之間能夠正確、有效地實現通信,可以先發送圖1所示的軟件復位序列,使I2C接口器件可靠復位,之后,再啟動數據的傳輸過程。
第1個起始位會使器件從期望接收微控制器數據的狀態復位。在該模式下,器件處于接收模式并監視數據總線,能夠檢測到強制其內部復位的起始位。9位“1”用于強制復位那些無法通過前面的起始位復位的器件。這只在以下情況下發生:器件處于在總線上驅動應答(低電平)的模式中;或處于輸出模式中,正在總線上驅動輸出數據位0。在這兩種情況下,由于器件將總線保持在低電平,所以無法產生前面的起始位(定義為SCL為高電平時SDA被拉低)。通過發送9位“1”,可以確保器件檢測到NACK(即微控制器不將總線驅動為低電平,從而不應答EEPROM發送的數據),這樣也會強制進行內部復位。
發送第2個起始位是為了防止在以下情況中可能發生的罕見的錯誤寫操作:微控制器在向EEPROM發送寫命令時被復位,并且在發送第1個起始位時EEPROM正在總線上驅動ACK。在這種特殊情況下,如果沒有發送第2個起始位,而是發送了停止位,器件將啟動寫周期。只有在微控制器向EEPROM發送寫命令時被復位的情況下,才可能發生這種錯誤寫操作。
最后的停止位將終止總線活動,并將EEPROM置于待機模式中。
(2) ?檢查應答位
I2C通信的眾多優點之一就是在接收到每個字節后發送應答位ACK。除了正在進行寫周期之外,I2C接口EEPROM在接收到每個字節后總會發送1位低電平,表明已收到有效的起始位和控制字節。因此,主器件可以在整個運行期間監視接收到的ACK位,以檢測可能發生的任何錯誤。在發送期間檢查接收到的ACK是否為邏輯1(表明EEPROM沒有響應)始終是一種好的做法,若接收到ACK為邏輯1,則需要執行一個錯誤處理程序來確定器件為何沒有響應,并根據需要執行軟件復位序列。
(3) ?應答查詢
串行EEPROM上的寫操作要求在啟動寫操作后遵守寫周期時間,使器件有時間存儲數據。在此期間,正常器件操作將被禁止,微控制器對器件的所有訪問嘗試都將被忽略。因此,微控制器應等待寫周期結束后再嘗試訪問EEPROM,這一點很重要。每個器件在其數據手冊中都給出了最長的寫周期時間,該參數通常用TWC表示。確保遵守寫周期時間的一種簡單方法是:在再次訪問EEPROM之前執行規定時長的延時。但是,器件在短于規定的最長時間內完成寫周期是很尋常的事。因而,用這種延時方法會使EEPROM完成寫操作后的一段時間內微控制器仍在等待。為了消除這段額外的時間,使運行更加高效,強烈建議利用應答查詢功能。由于I2C接口EEPROM器件在寫周期內不會應答,所以可在發送停止條件并啟動器件的內部寫周期后持續地向器件發送寫命令控制字節并進行應答查詢,直到接收到指示寫操作已完成的ACK位為止。圖2是應答查詢流程。
4? 延長EEPROM使用壽命的方法
(1) ?避免對同一區域反復執行寫操作
不要在同一個單元或同一個頁面上反復執行寫操作,尤其是不要將某個頁面設置成寫入任何其他頁面時都要更新的“目錄”。
(2) ?盡可能降低供電電壓
在滿足器件最低供電電壓的前提下,供電電壓越低,器件的使用壽命越長。
(3) ?選擇適當的寫操作模式
EEPROM存儲器的寫操作有3種模式: 字節模式、頁寫模式和塊寫模式。有些器件支持所有上述3種模式,而另一些器件則可能只支持上述3種模式中的一種或兩種。選擇適當的寫操作模式,可使EEPROM存儲器的使用壽命得以延長。在僅需要改變存儲器中的一個字節時,應采用字節模式。而在需要改變存儲器中的某塊內容或全部內容時,寫操作模式的選擇原則是:首先應考慮塊寫模式,其次再考慮頁寫模式,最后才是字節模式。
(4) ?存儲塊輪換使用
一般應用中,要存儲的數據比較單一,EEPROM空間與要存儲的數據相比會大得多。為此,可采用一種存儲塊輪換使用的方法來延長EEPROM的使用壽命。其原理如下:
根據要存儲的數據量將EEPROM空間分塊,從第1塊開始存儲數據,當數據被改寫N次后轉到第2塊存放,等到第2塊中的數據被改寫N次后再轉到第3塊存放,依此類推,直到最后一個塊存放的數據被改寫N次后,又轉到第1個塊重新開始。在這種解決方案中,系統掉電后再上電時可用來確定數據存儲塊首地址的方法有[2]: 找最大數據法、用后還原法和地址指針法。
結語
健壯性設計是確保系統具有優良質量特性的基本措施。本文介紹的技術實用、可靠,在對I2C串行EEPROM存儲器進行應用設計時應該盡可能地考慮這些技術。
評論
查看更多