賈振月,馬志剛,楊釧釧
(西安電子科技大學(xué)電子工程學(xué)院,陜西西安 710071)
隨著DSP技術(shù)的發(fā)展,其功能越來越強,類型也越來越多。由于DSP內(nèi)部結(jié)構(gòu)的特點,其算法程序一般都存儲在外部的非易失性存儲器中,在系統(tǒng)上電后,要將算法程序從外部存儲器加載到DSP中,再進行相應(yīng)的數(shù)據(jù)算法處理,這就需要動態(tài)地加載DSP運行程序。加載就是將存儲在外部設(shè)備中的應(yīng)用程序代碼或數(shù)據(jù)加載到處理器內(nèi)部的過程。為了充分利用DSP數(shù)據(jù)處理速度快的優(yōu)點,通常希望程序能在DSP中高速運行,這就需要運用DSP的引導(dǎo)功能實現(xiàn)對DSP的快速引導(dǎo)。當(dāng)電路板尺寸有限時,采用傳統(tǒng)的并行EEPROM引導(dǎo)就比較困難。文中提出一種基于SPI Flash的引導(dǎo)方法,以ADSP-BF533為例,它是一款支持SPI接口引導(dǎo)功能的DSP,M25P16是一款串行的Flash,體積小、容量大、操作方便,用它做DSP的外部Flash ROM來實現(xiàn)BF533處理器的程序加載。
ADSP-BF533(簡稱BF533)處理器是一款主頻高達600 MHz的高性能的Blackfin系列處理器,其結(jié)構(gòu)采用數(shù)據(jù)總線和程序總線分離的哈佛結(jié)構(gòu),比傳統(tǒng)的馮·諾依曼結(jié)構(gòu)有更快的指令執(zhí)行速度,同時具備簡潔的RISC指令集結(jié)構(gòu)。其內(nèi)部指令處理采用流水線技術(shù),并集成有乘累加單元(MAC)和算術(shù)邏輯單元(ALU)[1]。
BF533集成了豐富的外設(shè)接口,其中包括并行外設(shè)接口(PPI)、串口(SPORT)、串行外設(shè)接口(SPI)等。在該系統(tǒng)中使用SPI接口與M25P16連接實現(xiàn)程序的加載,并用可編程標(biāo)志(PF)的PF2口作為M25P16的片選信號。
M25P16是一款帶有先進寫保護機制和高速SPI總線訪問的2 MB串行Flash存儲器,該存儲器主要特點:2 MB的存儲空間,分32個扇區(qū),每個扇區(qū)256頁,每頁256 Byte;寫入1頁數(shù)據(jù)所需時間為1.4 ms(典型值);能單塊擦除和整塊擦除,SPI總線和50 MHz數(shù)據(jù)傳輸時鐘頻率。該芯片有一個狀態(tài)寄存器,通過對其編程可實現(xiàn)芯片存儲空間的保護以及芯片的寫使能等操作。該狀態(tài)寄存器中具有BUSY狀態(tài)位,通過該狀態(tài)位可查詢芯片的當(dāng)前狀態(tài),并進行相應(yīng)的讀、寫、擦除等命令[2]。M25P16的讀操作時序如圖1所示。
圖1 M25P16的讀寫時序
M25P16寫入一個字節(jié)數(shù)據(jù)需寫使能(WREN)和寫入(PP)指令。采用這兩個指令實現(xiàn)單頁編程。對于某個單字節(jié)空間的操作,在使用PP指令之前需要對其擦除(FFh)。擦除操作可通過單塊擦除指令(SE)和整塊擦除(BE)來完成。擦除之前需要先執(zhí)行WREN指令。當(dāng)片選S信號為低電平,則選中該器件,此時處于有效電源模式;當(dāng)片選S信號為高電平,器件未被選中,但能在所有內(nèi)部指令周期完成前保持有效電源模式。指令周期完成則進入備用電源模式。通過特殊指令來讀取或設(shè)置狀態(tài)寄存器內(nèi)的狀態(tài)位和控制位,實現(xiàn)相應(yīng)操作。
Flash M25P16芯片具有與工業(yè)標(biāo)準(zhǔn)的SPI接口兼容的外部引腳,文中使用的BF533也具有同樣的SPI接口,因此,只需將兩個芯片的SPI引腳對應(yīng)連接即可,這就大幅節(jié)省了DSP芯片的外部接口資源。圖2給出了BF533與M25P16的連接關(guān)系。
圖2 BF533與M25P16的SPI連接
SPI通信有主機和從機兩種工作模式,在該系統(tǒng)中DSP芯片工作在主模式,F(xiàn)lash芯片工作在從模式,相應(yīng)地 M25P16的 MISO、MOSI分別對應(yīng) BF533的MOSI和MISO引腳。建立好DSP和Flash的連接關(guān)系后,還需要注意DSP加載模式的硬件設(shè)置。BF533有兩個模式選擇引腳 BMODE[1]和 BMODE[0],通過設(shè)置這兩個信號就可以選擇DSP的不同的加載模式,如表1所示。在本例中,設(shè)置 BMODE[1]和 BMODE[0]均為高電平,此時DSP的加載模式為SPI主模式加載。
表1 BF533引導(dǎo)模式選擇
從SPI Flash中加載程序,必須要把文件編譯鏈接得到的.ldr文件寫入到 Flash存儲器中,然后對M25P16進行擦除,寫數(shù)據(jù)等操作,注意在擦除M25P16之后,寫使能被自動禁止,因此,在繼續(xù)寫數(shù)據(jù)之前,必須重新設(shè)置存儲器的狀態(tài)寄存器。
DSP上電或復(fù)位后,處理器就會在BOOT ROM中執(zhí)行自舉引導(dǎo)程序,本文設(shè)置的是SPI主機模式引導(dǎo),程序轉(zhuǎn)入到SPI引導(dǎo)程序的入口,通過SPI口向Flash發(fā)送讀命令,讀取標(biāo)志位,然后引導(dǎo)數(shù)據(jù)塊的傳遞,完成整個 SPI引導(dǎo)過程。當(dāng)程序指針跳轉(zhuǎn)到0xFFA00000就可以執(zhí)行引導(dǎo)進來的用戶程序了。引導(dǎo)過程的流程圖如圖3所示。
圖3 BF533 SPI引導(dǎo)流程圖
在整個引導(dǎo)過程中,M25P16作為從機,ADSPBF533作為主機。從M25P16的讀寫時序圖可以看出,當(dāng)BF533上電或者復(fù)位后,M25P16的片選信號從高電平變?yōu)榈碗娖?,選通該芯片。BF533通過給SPI口的發(fā)送緩沖寄存器SPI_TDBR發(fā)送READ指令來激活傳輸,從M25P16的指令時序圖和SI引腳時序可以看出,之后發(fā)送的是16 bit的地址,以確定從M25P16的那個地址開始讀數(shù)據(jù)。這時,M25P16將從起始地址未開始的存儲空間讀數(shù)據(jù)到SO口上,經(jīng)過BF533的MISO引腳傳輸?shù)浇邮站彌_寄存器SPI_RDBR中,當(dāng)接收緩沖器滿時,DMA將自動地從其中讀取數(shù)據(jù),完成數(shù)據(jù)的傳輸和引導(dǎo)。
要順利實現(xiàn)程序加載還要在Visual DSP++環(huán)境里對程序進行相應(yīng)的設(shè)置,將文件類型改為Loader file,同時在Load選項里將加載模式選擇為SPI Flash,文件格式選擇Hex格式,數(shù)據(jù)寬度選擇8 bit,另外還要在工程選項的Load選項中的Initialization里添加一個系統(tǒng)的初始化程序[3],具體程序的編寫參考BF533的硬件手冊。設(shè)置完成后經(jīng)過編譯就會生成加載需要的ldr文件。圖4給出了程序加載的流程圖。
圖4 BF533程序加載流程
當(dāng)系統(tǒng)的硬件和軟件設(shè)計完成后,就要利用已經(jīng)設(shè)計好的硬件平臺將相應(yīng)的軟件加載程序進行正確的設(shè)置,然后,下載到Flash中,再利用引導(dǎo)程序往BF533中加載,這樣DSP每次上電復(fù)位或手動復(fù)位后,程序就會自動加載進來,實現(xiàn)程序的自啟動[4-5]。
具體的實現(xiàn)過程為:首先在Visual DSP++里打開Programmer,先將引導(dǎo)程序下載到Flash中,如圖5所示,點擊Load Driver加載引導(dǎo)程序,如果成功的話就會返回正確的設(shè)備信息,即制造商0x20,設(shè)備0x15等,右面的信息欄中也會出現(xiàn)加載成功的信息。另外,右面區(qū)域會顯示M25P16的所有存儲區(qū),每段存儲區(qū)都是未知狀態(tài),在加載程序之前首先要對M25P16進行擦除操作。
圖5 BF533加載引導(dǎo)程序
加載引導(dǎo)程序成功后即開始加載用戶程序,點擊Programming,就會出現(xiàn)加載用戶程序的界面,如圖6所示,選擇擦除方式,一般選擇Erase affected,因為一般的程序很小,占用的空間較小,不必將Flash全部擦除,接著選擇文件的格式為Hex即可。然后將編譯生成的ldr文件添加進來,即可進行加載。右面對應(yīng)的是Flash存儲塊占用情況和程序加載的信息,如果成功就會顯示Success,出錯時話也會出現(xiàn)相應(yīng)的錯誤信息。
另外需要注意幾個問題:一是在對M25P16編程時,需要注意一次寫入的數(shù)據(jù)量大小,這是由存儲區(qū)每塊的容量決定的,當(dāng)一次寫入的數(shù)據(jù)量超過該容量時就會導(dǎo)致數(shù)據(jù)覆蓋,從而導(dǎo)致系統(tǒng)錯誤。二是在對Flash芯片進行擦除或者寫入操作時,在操作完成后必須讀取該芯片的狀態(tài)寄存器,根據(jù)狀態(tài)寄存器中某些狀態(tài)位判斷操作是否完成。
圖6 BF533加載用用戶程序
加載完成后,將軟件關(guān)閉重啟系統(tǒng),或者手動復(fù)位DSP,即可觀察到程序所預(yù)期的結(jié)果,這說明加載成功,每次上電或復(fù)位時用戶程序可以被自動執(zhí)行,實現(xiàn)由外部SPI Flash的準(zhǔn)確加載。
介紹了一種基于SPI Flash的BF53x系列DSP的程序加載方法,即以BF533為例用M25P16實現(xiàn)對它的SPI串行加載,該方法具有靈活性高,節(jié)約板級資源的優(yōu)點,具有較強的實用性。
[1]Analog Devices Inc.Blackfin@embedded processor ADSP -BF533[M].USA:Analog Devices Inc,2006.
[2]ST Microelectronics.M25P16_www.ic37.com[M].USA:STMicro-electronics group of compa-nies,2004.
[3]Analog Devices Inc.Running programs from Flash on ADSP-BF533 blackfin processors[M].USA:Analog Devices Inc,2006.
[4]廖柏林,王星勝,林坤,等.基于DSP正弦信號發(fā)生器設(shè)計[J].電子科技,2011,24(2):21 -23,29.
[5]吳進.一種基于總線令牌的多DSP并行信號處理系統(tǒng)[J].西安郵電學(xué)院學(xué)報,2009(1):125 -127,141.