潘興明,石 倩,路勝杰,王 晨,尹文穎
(北京石油機械廠 北京100083)
EEPROM 是電可擦除可編程存儲器,具有占用引腳少、容量擴展配置靈活以及讀寫操作相對簡單的特點,在數據可保護存儲領域得到了廣泛的應用[1-2]。 當單片機片內存儲空間不能滿足需求時,在單片機片外擴展EEPROM 存儲空間,可以擴展數據存儲空間,也可以實現數據的掉電保護。
工業應用現場環境惡劣,數據存儲傳輸量較大,在讀取EEPROM 數據時可能受到環境干擾等因素的影響降低數據傳輸的準確性。 海明碼編譯碼簡單,不僅可以驗證數據是否有效,還能在數據出錯的情況下指明錯誤位置,使得它在數據通信、存儲系統和嵌入式系統中應用非常廣泛[3]。 為了提高數據的可靠性,可以對需要發送的數據進行海明編碼,然后存儲到EEPROM 芯片中, 上位機讀取EEPROM 后來判斷出現錯誤的數據位,并及時進行校正。
海明碼也稱漢明碼屬于線性分組編碼方式, 其編碼原理:在數據中間加入幾個校驗碼,碼距均勻拉大,將數據的每個二進制位分配在幾個奇偶校驗組里,當某一位發生錯誤,會引起幾個校驗位的值發生變化,由此來進行某一位的糾錯。
碼字(Code Word) 按如下方法構建:
1)把所有2 的冪次方的數據位標記為奇偶校驗位(編號為1, 2, 4, 8, 16, 32, 64 等的位置) ;
2)其他數據位用于待編碼數據(編號為3, 5, 6, 7, 9, 10,11, 12, 13, 14, 15, 17 等的位置) ;
3) 每個奇偶校驗位的值代表了代碼字中部分數據位的奇偶性,其所在位置決定了要校驗和跳過的比特位順序。
位置1: 校驗位1, 跳過1 位, 校驗1 位, 跳過1 位(1,3,5,7,9,11,13,15,…)
位置2: 校驗位2, 跳過2 位, 校驗2 位, 跳過2 位(2,3,6,7,10,11,14,15,…)
位置4: 校驗位4, 跳過4 位, 校驗4 位, 跳過4 位(4,5,6,7,12,13,14,15,20,21,22,23,…)
位置8:校驗位8,跳過8 位,校驗8 位,跳過8 位(8-15,24-31,40-47,…)
如果全部校驗的位置中有奇數個1, 把該奇偶校驗位置為1;如果全部校驗的位置中有偶數個1,把該奇偶校驗位置為0。
一般說來, 對所有校驗位進行檢查, 將所有出錯的校驗位置相加, 得到的就是錯誤信息所在的位置。
EEPROM 芯片選擇8 個IIC 總線通信協議的24LC512[4],見圖1。此芯片容量為512 kbit,工作電壓范圍1.8~5.5 V。此芯片1 次最多可寫入128 個字節數據 (1 頁物理地址空間),1次最多讀取512 kbit,64K 字節,即讀出整個芯片中數據。芯片的地址引腳可允許最多擴展8 個芯片, 使得尋找空間可達4 Mbit。 外部存儲電路的接口通過IIC 總線與單片機進行通信。端口A2,A1,A0 作為每個存儲芯片的片選信號,如圖1 所示,這3 個端口連接的邏 輯電平分別為000,001,010,011,100,101,110,111。 這樣設置后將EERPOM 外部存儲空間尋址范圍 達 到 0 ~0X7FFFF 字 節。 SCL 和SDA 連 接 單 片 機dsPIC33F3013 的IIC 模塊引腳,WP 引腳可以連接單片機的一個I/O 腳,在軟件設計過程中控制24LC512 芯片的寫保護端(WP 設置高電平則寫保護進行可以寫入數據,低電平則寫保護功能使能,數據不能被寫入)。
設計電路板的實物見圖2, 圖中右側為8 個24LC512 EEPROM 存儲芯片。

圖1 EEPROM 硬件電路圖Fig. 1 EEPROM hardware circuit

圖2 EEPROM 數據存取電路板Fig. 2 EEPROM data access PCB
使用8 片EEPROM24LC512 芯片,在軟件設計時可以將A0用作尋址的第17位,A1用作尋址的第18位,A2用作尋址的第19 位。圖1中的8個芯片在接收或是發送數據時都作為從機工作,聽從于單片機IIC 模塊[5]的主機命令。
芯片寫入數據有兩種方式:單個字節數據寫入和數據頁寫入。 單個字節的寫入見圖3,啟動IIC 后,需要向總線寫入控制字節,然后地址高8 位,地址低8 位,需要寫入的字節數據,24LC512 芯片產生ACK 確認信號后, 主機產生總線停止條件,一個字節的寫入操作全部完成。

圖3 數據字節寫入序列圖Fig. 3 Data byte writing sequence
實際存儲數據時,可能一次需要順序存儲大量數據,如果每個字節都要按照圖3 中進行軟件編程, 勢必繁瑣,而24LC512 芯片具有頁寫入的功能,見圖4,方便用戶快捷將數據寫入芯片。 頁寫入操作和字節寫入不同處在于在控制字節數據, 地址數據寫入后可以連續最多寫入128 個字節數據,只要在最后寫入字節后檢測到24LC512 產生的ACK 確認信號,單片機IIC 模塊發送總線停止條件,本次頁寫入操作全部完成。 每個芯片從第1 個地址單元開始到第128 個單元為第1 頁,第129 個單元到256 個單元為第2 頁,以此類推。 當一次寫入的數據地址范圍需要跨頁時,軟件要及時判斷且必須要分兩頁進行處理, 否則會導致數據在當前一頁輪回操作,數據寫入完全混亂。
24LC512 讀操作的方式包括三種:當前地址單元數據讀取、隨機地址讀取和地址單元連續讀取。 24LC512 芯片內部有一個地址計數器, 會將上次讀取操作的單元地址自動加1轉向當前地址。 單次的當前地址單元數據讀取相對于其他兩種方式較簡單,因為不需要在IIC 總線上進行地址操作,直接就可讀取,如圖5 所示。

圖4 數據頁寫入序列圖Fig. 4 Data page writing sequence

圖5 當前地址單元數據讀取序列圖Fig. 5 Current address byte reading sequence
隨機地址讀取允許主機可以隨機訪問地址空間中的任意位置。操作時首先在啟動IIC 總線后要寫入控制字節,接著寫入具體的地址,然后再次啟動IIC 總線發送控制字節(讀操作),24LC512 從機確認后開始發送該地址中的1 個字節數據, 主機接收數據后不會確認但是會產生一個停止IIC 總線的時序。 這樣一次隨機地址讀取操作完畢,如圖6 所示。
地址單元連續讀取的方式和隨機地址單元數據讀取方式很相近,只是在主機接收到1 個數據字節之后不是產生停止IIC 總線的時序,而是產生一個ACK 確認信號。 這個確認信號可以讓從機繼續發送下一個地址單元中的數據,如此實現連續讀取。 直到主機接收到最后一個字節數據后主機才產生停止IIC 總線的時序,如圖7 所示。

圖6 隨機地址單元數據讀取序列圖Fig. 6 Random address byte reading sequence

圖7 連續地址單元數據讀取序列圖Fig. 7 Sequence address byte reading sequence
實際EEPROM 數據在讀取時,一次讀取數據量很大,所以采用連續地址單元數據讀取方式更加適合,但是需要特別注意的是由于24LC512 芯片每次最多只能讀取一整片的數據。
編寫數據讀取程序時,由于每次發送或接收一個字節數據都需要判斷并給予IIC 總線一個狀態,而dsPIC33F3013 單片機IIC 模塊具有檢測這些狀態的中斷功能可用, 所以讀取程序的主要操作放在IIC 中斷服務程序中進行。
dsPIC33F3013 單 片 機IIC 模 塊 作 為 主 機,24LC512 數 據存儲的8 個芯片作為從機。 單片機IIC 模塊作為主機時,中斷在以下事件完成時產生[6]:啟動條件、停止條件、數據傳輸字節發送/接收、應答發送、重復啟動、檢測到總線沖突事件。 這些條件完成時產生的中斷入口只有一個, 所以IIC 中斷服務程序只有一個,在中斷服務程序中對這些狀態完成集中處理。
單片機IIC 模塊向24LC512 寫數據子程序設計,考慮到可能遇到的跨頁寫入問題,設定一次連續寫入的字節個數不大于128,這樣每次寫操作最多進行一次跨頁操作。若實際寫地址的范圍跨度超出128 個字節范圍,可以將空間劃分為若干個128 字節段和最后一個不大于128 個字節段來分別調用24LC512 寫數據子程序即可解決跨頁寫入數據問題。
具體設計寫數據子程序時,首先要判斷此次寫入的地址范圍(最大不超過128 個字節)是否需要跨越地址頁。 如果不需跨越地址頁則在本頁執行一次頁寫入操作即可完成,否則將會在寫入數據的首地址所處的本頁執行頁操作至本頁最后一個地址單元,然后在連續的下一頁第一個地址單元開始寫入剩下的數據字節數量完成本次寫入操作。 由于向24LC512 寫入數據的正確序列是唯一且確定的,見圖4。第一次中斷在IIC 啟動條件完成時產生。 每次寫入一個字節的命令或地址或數據,接收器件產生應答信號,因而還會產生中斷,用戶要確定每次進入中斷時,寫數據序列所進行到的確切位置,這樣才能在中斷程序中做出正確的處理,并為下次中斷做以準備,最后一次中斷發生在IIC 停止條件完成時。
單片機IIC 模塊從24LC512 讀取數據子程序設計,考慮作。 從24LC512 讀出數據的正確序列是唯一且確定的,見圖7。 第一次中斷在IIC 啟動條件完成時產生。 每次在IIC 總線上寫入或讀取數據,接收數據一方都會產生應答信號,產生中斷, 用戶要確定每次進入中斷時讀取數據序列所處的位置,這樣才能在中斷服務程序中做出合理的處理,并為下次中斷做以準備。 最后一次中斷發生在IIC 停止條件完成時。
在設計中斷服務程序時同時考慮到寫入數據過程和讀取數據過程中所產生的中斷,為了便于編程,設置一個標志位來分辨寫入過程中斷和讀取過程中斷, 且每次進入中斷后, 根據程序在發送和讀取序列中所進行的具體位置的差異,給此標志位賦以不同的值,為下次中斷操作做好準備。
中斷服務程序設計的基本框圖,如圖8 所示。

圖8 IIC 中斷服務程序流程圖Fig. 8 Flow chart of IIC interrupt service program
圖8 中,進入中斷服務程序后可以由標志位值的不同判斷是24LC512 寫數據操作還是讀取數據操作還是其他。從圖中可以看出,左邊部分為讀取數據基本流程圖,右邊為寫入數據基本流程圖。 每次進入中斷都需要根據標志位的值進行相應處理,并且依據下次進入中斷服務程序的狀態對標志位進行賦值便于下次操作。 可見,借助標志位的設置和判斷,使得編程更加簡便。
對單片機系統測量的數據進行于海明編碼,然后將大量數據存儲在以單片機IIC 模塊為核心擴展的8 片24LC512存儲芯片構成的4Mbit 數據存儲空間內。測試表明,經過利用海明碼編碼的數據傳輸的誤碼率低于百萬分之一。 現場應用證明,系統運行穩定,數據存取可靠,滿足設計需求,具有很好的工程應用價值。
[1] 姚亞峰,陳建文,黃載祿. 嵌入式系統中EEPROM接口及控制電路設計[J].半導體技術,2007(4):328-330.YAO Ya-feng, CHEN Jian-wen , HUANG Zai-lu. Design of Interface and Control Circuit of EEPROM in Embedded System[J].Design and Development of IC,2009(7):328-330.
[2] 于宗光,許居衍,魏同立. EEPROM單元結構的變革及發展方向[J].固體電子學研究與進展,1996(3):233-239.YU Zong-guang,XU Ju-yan,WEI Tong-li.Change and developing of the EEPROM cell structure[J].Research & Prgress of Solia State Electronic,1996(3):233-240.
[3] 汪海山,康劍冰,馬騁. 漢明碼在大型傳感器網絡中的應用研究[J].計算機應用研究,2009(7):2656-2657.WANG Hai -shan, KANG Jian -bing , MA Cheng.Application and research of Haiming code in large scale sensor networks. Application Research of Computers, 2009(7):2656-2657.
[4] 512K IIC CMOS Serial EEPROM[EB/OL].(2004).http://www.microchip.com.
[5] I2C Serial EEPROM datasheet(pdf)[M].Microchip Technology Inc,2005.
[6] DSPIC33F Reference Guide.[EB/OL].http://www microchip.com.