1.引言
Flash是一種可在線進行電擦寫,掉電后數據不丟失的EEPROM存儲器。它具有功耗低、容量大、燒寫和擦除速度快等優點,并且內部嵌入算法完成對芯片的操作,簡化了軟件的工作量,因而在數字信號處理系統中得到了廣泛的應用。DSP是一種高速數字信號處理器。它具有高穩定性、可重復性、可大規模集成,特別是易編程性和易于實現自處理等特點,使得信號處理手段更靈活、功能更復雜、運算速度更快,在數字信號處理領域得到廣泛地應用。本文通過完整的實例,介紹以TMS320VC33\\(簡稱VC33\\)為嵌入式系統對AM29LV400B Flash存儲器進行燒寫和擦除的實現方法。
2.AMD公司AM29LV400B Flash存儲器
AM29LV400B是AMD公司推出的Flash存儲器,它是4兆位\\(8×512K/16×256K位\\)的CMOS工藝扇區擦除、字節編程的電可擦除只讀存儲器EEPROM。它的主要特點包括如下幾個方面:3.3V單電壓供電;內部嵌入編程、擦除操作算法,只需向命令寄存器寫入標準的微處理器指令,并且可通過查詢特定的引腳或數據線來監控操作是否完成;對任一扇區進行燒寫擦除操作時不影響其它的扇區數據;可進行100000次的燒寫擦除操作,數據保存10年以上。
本文中Flash的數據映射到DSP的0x0400000空間,Flash的一個字節對應一個DSP的低8位數據,高24位為無效數據,可以直接按字節進行讀寫操作。
3.Flash存儲器的基本操作命令以及程序設計流程
Flash存儲器AM29LV400B的基地址為0x400000,每個偏移地址乘以4是因為Flash字節僅占用DSP空間低8位,而DSP的地址是字節地址,所以地址增量為4。
3.1 Flash存儲器的操作結束檢測
Flash AM29LV400B內部的編程或擦除算法可自動完成相應操作,但必須了解其內部的操作檢測機制,以便知道操作是否完成或正確。常用的檢測方法有兩種:跳變位\\(DQ6 \\)檢測法、數據檢測位\\(DQ7\\)檢測法。本文中用的是第1種方法,即檢測跳變位DQ6。DQ6指的是當前操作地址的D6位,在Flash寫操作過程中,對相應地址的連續讀均引起DQ6的“0”、“1”跳變,只有當寫操作結束的時候,DQ6才會停止跳變,此時說明Flash內部操作成功結束,程序代碼如下:
對讀回的DQ6的數值做0x7fffff次比較,如果在所有的比較里該位都產生跳變,則說明Flash內部操作失??;如果DQ6停止跳變,flag標志寫1,跳出while循環,Flash操作成功結束。
3.2 Flash存儲器擦寫操作命令
Flash存儲器的擦寫操作命令通常是啟動Flash設備的存儲器操作函數,由內嵌的算法完成具體的編程和擦除操作,所以向Flash的特定地址寫入操作命令和數據,就可以對Flash存儲器進行編程和擦除。表1介紹了Flash擦寫命令的具體操作地址和命令代碼。
在CC3000開發系統下,實現Flash擦寫操作命令的C代碼如下所示:
執行寫上述操作時,應注意以下事項:計算要擦除扇區的開始地址時,默認為Flash的開始地址\\(第一個扇區\\)。由于編程指令不能使“0”寫成“1”,只能使“1”寫成“0”,而擦除指令可使“0”寫成“1”,所以寫數據之前要先擦除完成后再編程燒寫。
4.燒寫Flash存儲器
一般情況下,Flash是通過編程器把以文件形式存儲的數據\\(比如生成的DSP引導程序代碼bin二進制文件\\)燒寫到Flash中,但這種方法燒寫速度慢,并且需要把Flash芯片放到編程器上,調試過程中頻繁的插拔Flash芯片會降低芯片壽命,因此選擇在開發系統下通過JTAG接口和仿真器將比較大的數據文件燒寫到Flash的指定存儲區域中。下面具體介紹在CC3000開發系統下實現軟件打開文件并將文件數據燒寫到Flash中的實現過程。
5.開發系統CC3000以及編譯鏈接環境的設置
選用TI的CC3000作為DSP的集成開發工具,它支持標準C和C++語言,并且能夠嵌入匯編語言。編譯程序之前,應先對CC3000的編譯鏈接選項進行設置,并編寫命令鏈接文件\\(.cmd文件\\),為程序和數據分配存儲空間。
5.1 命令鏈接文件\\(.cmd文件\\)的編寫
命令鏈接文件定義了DSP存儲空間分配情況,用于在程序鏈接加載過程中將編譯生成的各個代碼段定位到DSP程序和數據存儲區上,以本文的項目為例,cmd文件如下:
MEMORY命令完成DSP存儲空間的分配。本文中將DSP的存儲空間分成九部分:ROM區域表示4K的內部ROM區;EXT0區域表示外部存儲區;Flash表示的是Flash存儲區;VECTOR區域表示存放中斷向量表的存儲區。
SECTIONS命令說明編譯生成的各個輸出段如何定位到存儲器。由于在CC3000開發系統下燒寫文件到Flash涉及對文件的打開與讀寫操作與動態存儲分配操作,所以應該在SECTIONS里定義.sysmem和.cio兩個段,而一般情況下這兩個段在編譯過程中是不產生的。.sysmem段是提供動態存儲分配空間的數據區,主要由malloc、calloc和realloc等動態分配函數所使用,這些函數封裝在CC3000提供的系統庫函數rts30.lib中。.cio是有關文件IO操作的段,程序中涉及到對文件的打開讀寫等操作的時候編譯才會生成該段。這兩個段都是作為程序的數據定義到RAM數據存儲器里。
5.2 燒寫文件數據到Flash的實現
在CC3000下打開文件,讀取文件數據,并將數據通過VC33寫到Flash。下面以小于64K文件的燒寫為例,說明在CC3000下燒寫Flash的過程,程序代碼如下:
在CC3000開發系統下,根據文件大小計算將文件數據分成多少個64K大小的塊和最后一塊小于64K塊的長度,并對DSP進行初始化;然后以"rb"為參數調用fopen函數,即已只讀的二進制文件格式打開制定的文件,如果fopen參數里沒有寫出文件的路徑,系統默認為與CC3000生成的.out格式文件在同一個目錄下,如果打開成功,獲得文件句柄fp;按照塊的順序,依次以字節大小讀取文件數據到0x0803000~0x0808000,并調用寫Flash函數flash_write\\(\\),依次將數據寫到Flash存儲器\\(注意每次寫操作結束后,Flash地址應該相應的增加\\);最后關閉文件,退出程序,操作完成。
6.結束語
用軟件方式,在CC3000開發系統下,由VC33控制Flash寫操作,從而實現了文件數據到Flash存儲器的下載過程。與編程器寫Flash的方式相比,其軟件燒寫Flash速度快,而且無需卸下Flash芯片放在編程器上,便于調試。通過上述方法可完成VC33對AM29LV400B的燒寫。其他型號Flash芯片也可按此類方法燒寫。