潘興明,石 倩,路勝杰,王 晨,尹文穎
(北京石油機械廠 北京100083)
EEPROM 是電可擦除可編程存儲器,具有占用引腳少、容量擴展配置靈活以及讀寫操作相對簡單的特點,在數(shù)據(jù)可保護存儲領(lǐng)域得到了廣泛的應(yīng)用[1-2]。 當(dāng)單片機片內(nèi)存儲空間不能滿足需求時,在單片機片外擴展EEPROM 存儲空間,可以擴展數(shù)據(jù)存儲空間,也可以實現(xiàn)數(shù)據(jù)的掉電保護。
工業(yè)應(yīng)用現(xiàn)場環(huán)境惡劣,數(shù)據(jù)存儲傳輸量較大,在讀取EEPROM 數(shù)據(jù)時可能受到環(huán)境干擾等因素的影響降低數(shù)據(jù)傳輸?shù)臏蚀_性。 海明碼編譯碼簡單,不僅可以驗證數(shù)據(jù)是否有效,還能在數(shù)據(jù)出錯的情況下指明錯誤位置,使得它在數(shù)據(jù)通信、存儲系統(tǒng)和嵌入式系統(tǒng)中應(yīng)用非常廣泛[3]。 為了提高數(shù)據(jù)的可靠性,可以對需要發(fā)送的數(shù)據(jù)進行海明編碼,然后存儲到EEPROM 芯片中, 上位機讀取EEPROM 后來判斷出現(xiàn)錯誤的數(shù)據(jù)位,并及時進行校正。
海明碼也稱漢明碼屬于線性分組編碼方式, 其編碼原理:在數(shù)據(jù)中間加入幾個校驗碼,碼距均勻拉大,將數(shù)據(jù)的每個二進制位分配在幾個奇偶校驗組里,當(dāng)某一位發(fā)生錯誤,會引起幾個校驗位的值發(fā)生變化,由此來進行某一位的糾錯。
碼字(Code Word) 按如下方法構(gòu)建:
1)把所有2 的冪次方的數(shù)據(jù)位標記為奇偶校驗位(編號為1, 2, 4, 8, 16, 32, 64 等的位置) ;
2)其他數(shù)據(jù)位用于待編碼數(shù)據(jù)(編號為3, 5, 6, 7, 9, 10,11, 12, 13, 14, 15, 17 等的位置) ;
3) 每個奇偶校驗位的值代表了代碼字中部分數(shù)據(jù)位的奇偶性,其所在位置決定了要校驗和跳過的比特位順序。
位置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,…)
如果全部校驗的位置中有奇數(shù)個1, 把該奇偶校驗位置為1;如果全部校驗的位置中有偶數(shù)個1,把該奇偶校驗位置為0。
一般說來, 對所有校驗位進行檢查, 將所有出錯的校驗位置相加, 得到的就是錯誤信息所在的位置。
EEPROM 芯片選擇8 個IIC 總線通信協(xié)議的24LC512[4],見圖1。此芯片容量為512 kbit,工作電壓范圍1.8~5.5 V。此芯片1 次最多可寫入128 個字節(jié)數(shù)據(jù) (1 頁物理地址空間),1次最多讀取512 kbit,64K 字節(jié),即讀出整個芯片中數(shù)據(jù)。芯片的地址引腳可允許最多擴展8 個芯片, 使得尋找空間可達4 Mbit。 外部存儲電路的接口通過IIC 總線與單片機進行通信。端口A2,A1,A0 作為每個存儲芯片的片選信號,如圖1 所示,這3 個端口連接的邏 輯電平分別為000,001,010,011,100,101,110,111。 這樣設(shè)置后將EERPOM 外部存儲空間尋址范圍 達 到 0 ~0X7FFFF 字 節(jié)。 SCL 和SDA 連 接 單 片 機dsPIC33F3013 的IIC 模塊引腳,WP 引腳可以連接單片機的一個I/O 腳,在軟件設(shè)計過程中控制24LC512 芯片的寫保護端(WP 設(shè)置高電平則寫保護進行可以寫入數(shù)據(jù),低電平則寫保護功能使能,數(shù)據(jù)不能被寫入)。
設(shè)計電路板的實物見圖2, 圖中右側(cè)為8 個24LC512 EEPROM 存儲芯片。
圖1 EEPROM 硬件電路圖Fig. 1 EEPROM hardware circuit
圖2 EEPROM 數(shù)據(jù)存取電路板Fig. 2 EEPROM data access PCB
使用8 片EEPROM24LC512 芯片,在軟件設(shè)計時可以將A0用作尋址的第17位,A1用作尋址的第18位,A2用作尋址的第19 位。圖1中的8個芯片在接收或是發(fā)送數(shù)據(jù)時都作為從機工作,聽從于單片機IIC 模塊[5]的主機命令。
芯片寫入數(shù)據(jù)有兩種方式:單個字節(jié)數(shù)據(jù)寫入和數(shù)據(jù)頁寫入。 單個字節(jié)的寫入見圖3,啟動IIC 后,需要向總線寫入控制字節(jié),然后地址高8 位,地址低8 位,需要寫入的字節(jié)數(shù)據(jù),24LC512 芯片產(chǎn)生ACK 確認信號后, 主機產(chǎn)生總線停止條件,一個字節(jié)的寫入操作全部完成。
圖3 數(shù)據(jù)字節(jié)寫入序列圖Fig. 3 Data byte writing sequence
實際存儲數(shù)據(jù)時,可能一次需要順序存儲大量數(shù)據(jù),如果每個字節(jié)都要按照圖3 中進行軟件編程, 勢必繁瑣,而24LC512 芯片具有頁寫入的功能,見圖4,方便用戶快捷將數(shù)據(jù)寫入芯片。 頁寫入操作和字節(jié)寫入不同處在于在控制字節(jié)數(shù)據(jù), 地址數(shù)據(jù)寫入后可以連續(xù)最多寫入128 個字節(jié)數(shù)據(jù),只要在最后寫入字節(jié)后檢測到24LC512 產(chǎn)生的ACK 確認信號,單片機IIC 模塊發(fā)送總線停止條件,本次頁寫入操作全部完成。 每個芯片從第1 個地址單元開始到第128 個單元為第1 頁,第129 個單元到256 個單元為第2 頁,以此類推。 當(dāng)一次寫入的數(shù)據(jù)地址范圍需要跨頁時,軟件要及時判斷且必須要分兩頁進行處理, 否則會導(dǎo)致數(shù)據(jù)在當(dāng)前一頁輪回操作,數(shù)據(jù)寫入完全混亂。
24LC512 讀操作的方式包括三種:當(dāng)前地址單元數(shù)據(jù)讀取、隨機地址讀取和地址單元連續(xù)讀取。 24LC512 芯片內(nèi)部有一個地址計數(shù)器, 會將上次讀取操作的單元地址自動加1轉(zhuǎn)向當(dāng)前地址。 單次的當(dāng)前地址單元數(shù)據(jù)讀取相對于其他兩種方式較簡單,因為不需要在IIC 總線上進行地址操作,直接就可讀取,如圖5 所示。
圖4 數(shù)據(jù)頁寫入序列圖Fig. 4 Data page writing sequence
圖5 當(dāng)前地址單元數(shù)據(jù)讀取序列圖Fig. 5 Current address byte reading sequence
隨機地址讀取允許主機可以隨機訪問地址空間中的任意位置。操作時首先在啟動IIC 總線后要寫入控制字節(jié),接著寫入具體的地址,然后再次啟動IIC 總線發(fā)送控制字節(jié)(讀操作),24LC512 從機確認后開始發(fā)送該地址中的1 個字節(jié)數(shù)據(jù), 主機接收數(shù)據(jù)后不會確認但是會產(chǎn)生一個停止IIC 總線的時序。 這樣一次隨機地址讀取操作完畢,如圖6 所示。
地址單元連續(xù)讀取的方式和隨機地址單元數(shù)據(jù)讀取方式很相近,只是在主機接收到1 個數(shù)據(jù)字節(jié)之后不是產(chǎn)生停止IIC 總線的時序,而是產(chǎn)生一個ACK 確認信號。 這個確認信號可以讓從機繼續(xù)發(fā)送下一個地址單元中的數(shù)據(jù),如此實現(xiàn)連續(xù)讀取。 直到主機接收到最后一個字節(jié)數(shù)據(jù)后主機才產(chǎn)生停止IIC 總線的時序,如圖7 所示。
圖6 隨機地址單元數(shù)據(jù)讀取序列圖Fig. 6 Random address byte reading sequence
圖7 連續(xù)地址單元數(shù)據(jù)讀取序列圖Fig. 7 Sequence address byte reading sequence
實際EEPROM 數(shù)據(jù)在讀取時,一次讀取數(shù)據(jù)量很大,所以采用連續(xù)地址單元數(shù)據(jù)讀取方式更加適合,但是需要特別注意的是由于24LC512 芯片每次最多只能讀取一整片的數(shù)據(jù)。
編寫數(shù)據(jù)讀取程序時,由于每次發(fā)送或接收一個字節(jié)數(shù)據(jù)都需要判斷并給予IIC 總線一個狀態(tài),而dsPIC33F3013 單片機IIC 模塊具有檢測這些狀態(tài)的中斷功能可用, 所以讀取程序的主要操作放在IIC 中斷服務(wù)程序中進行。
dsPIC33F3013 單 片 機IIC 模 塊 作 為 主 機,24LC512 數(shù) 據(jù)存儲的8 個芯片作為從機。 單片機IIC 模塊作為主機時,中斷在以下事件完成時產(chǎn)生[6]:啟動條件、停止條件、數(shù)據(jù)傳輸字節(jié)發(fā)送/接收、應(yīng)答發(fā)送、重復(fù)啟動、檢測到總線沖突事件。 這些條件完成時產(chǎn)生的中斷入口只有一個, 所以IIC 中斷服務(wù)程序只有一個,在中斷服務(wù)程序中對這些狀態(tài)完成集中處理。
單片機IIC 模塊向24LC512 寫數(shù)據(jù)子程序設(shè)計,考慮到可能遇到的跨頁寫入問題,設(shè)定一次連續(xù)寫入的字節(jié)個數(shù)不大于128,這樣每次寫操作最多進行一次跨頁操作。若實際寫地址的范圍跨度超出128 個字節(jié)范圍,可以將空間劃分為若干個128 字節(jié)段和最后一個不大于128 個字節(jié)段來分別調(diào)用24LC512 寫數(shù)據(jù)子程序即可解決跨頁寫入數(shù)據(jù)問題。
具體設(shè)計寫數(shù)據(jù)子程序時,首先要判斷此次寫入的地址范圍(最大不超過128 個字節(jié))是否需要跨越地址頁。 如果不需跨越地址頁則在本頁執(zhí)行一次頁寫入操作即可完成,否則將會在寫入數(shù)據(jù)的首地址所處的本頁執(zhí)行頁操作至本頁最后一個地址單元,然后在連續(xù)的下一頁第一個地址單元開始寫入剩下的數(shù)據(jù)字節(jié)數(shù)量完成本次寫入操作。 由于向24LC512 寫入數(shù)據(jù)的正確序列是唯一且確定的,見圖4。第一次中斷在IIC 啟動條件完成時產(chǎn)生。 每次寫入一個字節(jié)的命令或地址或數(shù)據(jù),接收器件產(chǎn)生應(yīng)答信號,因而還會產(chǎn)生中斷,用戶要確定每次進入中斷時,寫數(shù)據(jù)序列所進行到的確切位置,這樣才能在中斷程序中做出正確的處理,并為下次中斷做以準備,最后一次中斷發(fā)生在IIC 停止條件完成時。
單片機IIC 模塊從24LC512 讀取數(shù)據(jù)子程序設(shè)計,考慮作。 從24LC512 讀出數(shù)據(jù)的正確序列是唯一且確定的,見圖7。 第一次中斷在IIC 啟動條件完成時產(chǎn)生。 每次在IIC 總線上寫入或讀取數(shù)據(jù),接收數(shù)據(jù)一方都會產(chǎn)生應(yīng)答信號,產(chǎn)生中斷, 用戶要確定每次進入中斷時讀取數(shù)據(jù)序列所處的位置,這樣才能在中斷服務(wù)程序中做出合理的處理,并為下次中斷做以準備。 最后一次中斷發(fā)生在IIC 停止條件完成時。
在設(shè)計中斷服務(wù)程序時同時考慮到寫入數(shù)據(jù)過程和讀取數(shù)據(jù)過程中所產(chǎn)生的中斷,為了便于編程,設(shè)置一個標志位來分辨寫入過程中斷和讀取過程中斷, 且每次進入中斷后, 根據(jù)程序在發(fā)送和讀取序列中所進行的具體位置的差異,給此標志位賦以不同的值,為下次中斷操作做好準備。
中斷服務(wù)程序設(shè)計的基本框圖,如圖8 所示。
圖8 IIC 中斷服務(wù)程序流程圖Fig. 8 Flow chart of IIC interrupt service program
圖8 中,進入中斷服務(wù)程序后可以由標志位值的不同判斷是24LC512 寫數(shù)據(jù)操作還是讀取數(shù)據(jù)操作還是其他。從圖中可以看出,左邊部分為讀取數(shù)據(jù)基本流程圖,右邊為寫入數(shù)據(jù)基本流程圖。 每次進入中斷都需要根據(jù)標志位的值進行相應(yīng)處理,并且依據(jù)下次進入中斷服務(wù)程序的狀態(tài)對標志位進行賦值便于下次操作。 可見,借助標志位的設(shè)置和判斷,使得編程更加簡便。
對單片機系統(tǒng)測量的數(shù)據(jù)進行于海明編碼,然后將大量數(shù)據(jù)存儲在以單片機IIC 模塊為核心擴展的8 片24LC512存儲芯片構(gòu)成的4Mbit 數(shù)據(jù)存儲空間內(nèi)。測試表明,經(jīng)過利用海明碼編碼的數(shù)據(jù)傳輸?shù)恼`碼率低于百萬分之一。 現(xiàn)場應(yīng)用證明,系統(tǒng)運行穩(wěn)定,數(shù)據(jù)存取可靠,滿足設(shè)計需求,具有很好的工程應(yīng)用價值。
[1] 姚亞峰,陳建文,黃載祿. 嵌入式系統(tǒng)中EEPROM接口及控制電路設(shè)計[J].半導(dǎo)體技術(shù),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單元結(jié)構(gòu)的變革及發(fā)展方向[J].固體電子學(xué)研究與進展,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] 汪海山,康劍冰,馬騁. 漢明碼在大型傳感器網(wǎng)絡(luò)中的應(yīng)用研究[J].計算機應(yīng)用研究,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.