董 毅,朱 磊,任 靜,郭 力
(1.西安工程大學(xué) 電子信息學(xué)院,陜西 西安 710048;2.西安理工大學(xué) 科技處,陜西 西安 710048)
TMS320VC54x系列DSP應(yīng)用廣泛,但是這類DSP處理器掉電后易丟失用戶程序代碼,所以要對(duì)這類DSP處理器的電子系統(tǒng)進(jìn)行自舉設(shè)計(jì).“自舉”是指DSP系統(tǒng)上電時(shí),將放在外部低速ROM中的用戶程序代碼加載到高速的RAM中,以便快速取址、譯址和執(zhí)行用戶應(yīng)用程序.
自舉模塊是TMS320VC54x系列DSP應(yīng)用電子系統(tǒng)中不可或缺的重要組成部分.DSP自舉加載方式多樣,模塊多變.目前的DSP自舉模塊按照存儲(chǔ)代碼器件類型不同可分為兩類:一類是基于靜態(tài)存儲(chǔ)器的自舉模塊[1-3],一類是基于處理器的自舉模塊[4-5].基于靜態(tài)存儲(chǔ)器EEPROM的自舉模塊[1-2],具有電路簡(jiǎn)單,需要擴(kuò)展的器件少、成本較低等優(yōu)點(diǎn),而基于靜態(tài)存儲(chǔ)器FLASH的自舉模塊[3],相比EEPROM自舉模塊,自舉文件容量得到一定提高,基于處理器的自舉模塊[4-5]成本和復(fù)雜度提高,且更容易控制自舉流程.然而,上述兩類模塊都存在DSP程序代碼轉(zhuǎn)換復(fù)雜,DSP用戶應(yīng)用程序代碼大小受限和更新升級(jí)不便等問題.為解決這些問題,本文提出了一種基于SD卡的DSP自舉模塊的設(shè)計(jì)方案,該模塊以LabVIEW程序執(zhí)行代碼轉(zhuǎn)換,自舉模塊利用更多的CPU程序空間,方便快速地將用戶程序代碼加載到DSP片內(nèi)RAM.
設(shè)計(jì)分為用于代碼轉(zhuǎn)換的GUI軟件和用于標(biāo)準(zhǔn)串行自舉[6-7]的單片機(jī)子模塊兩部分.自舉模塊系統(tǒng)框圖如圖1所示,通過GUI軟件將DSP用戶應(yīng)用程序轉(zhuǎn)換成.dat格式,用個(gè)人計(jì)算機(jī)將程序載入到自舉模塊中的SD卡,然后單片機(jī)子模塊的單片機(jī)通過SPI總線[8]讀取SD卡內(nèi)程序,并控制DSP目標(biāo)板進(jìn)行標(biāo)準(zhǔn)串行自舉.
GUI軟件完成DSP用戶應(yīng)用程序的格式轉(zhuǎn)換工作.DSP用戶應(yīng)用程序通過CCS編譯生成.out文件,然后需要.out轉(zhuǎn).hex,.hex轉(zhuǎn).dat等多步轉(zhuǎn)換,.dat格式文件才是最后要載入DSP的用戶應(yīng)用代碼.本方案的GUI軟件一鍵完成上面的文件轉(zhuǎn)換工作,再通過PC機(jī)將.dat文件寫入單片機(jī)子模塊的SD卡,DSP程序代碼轉(zhuǎn)換復(fù)雜的問題得到解決.然后,單片機(jī)子模塊使用znFAT文件系統(tǒng)讀取代碼,控制DSP進(jìn)行標(biāo)準(zhǔn)串行自舉.本方案單片機(jī)子模塊系統(tǒng)框圖如圖1,DSP自舉文件存入SD卡后,單片機(jī)通過文件系統(tǒng)[9]讀取存儲(chǔ)在SD卡內(nèi)的DSP用戶應(yīng)用代碼件,復(fù)位并握手DSP,將自舉程序加載到DSP片內(nèi)RAM.這樣既解決了DSP用戶應(yīng)用程序大小受限制的問題,又可直接通過計(jì)算機(jī)管理SD卡中的DSP用戶應(yīng)用程序?qū)崿F(xiàn)程序的更新升級(jí).另外本方案單片機(jī)子模塊采用標(biāo)準(zhǔn)串行自舉的方式,占用較少的DSP硬件資源.
圖2 自舉模塊硬件主要連接關(guān)系圖
本方案只有單片機(jī)子模塊需要硬件設(shè)計(jì),其硬件連接關(guān)系圖如圖2所示.硬件引腳連接比較簡(jiǎn)單,硬件設(shè)計(jì)主要包括SD卡與C8051F340的SPI通信,單片機(jī)與TMS320VC54x系列DSP復(fù)位與握手,單片機(jī)C8051F340與DSP目標(biāo)板自舉通信,圖2中各芯片的接地、電源、保護(hù)電路、穩(wěn)壓電路等均未畫出.
圖2虛線框1中單片機(jī)C8051F340與SD卡采用硬件SPI通信,SPI接口是一種高速、全雙工的同步通信總線,只占用芯片4個(gè)引腳.CLK為SPI時(shí)鐘引腳,MOSI為SPI從輸入/主輸出,MISO為從輸出/主輸入,NSS為從設(shè)備使能信號(hào).P0.0至P0.3管腳在單片機(jī)內(nèi)部已經(jīng)過弱上拉處理.圖2虛線框2中單片機(jī)C8051F340與TMS320VC54x系列DSP多通道緩沖串口McBSP的BCLKR0、BFSR0、BDR0引腳模擬3線制SPI,組成標(biāo)準(zhǔn)串行自舉總線,這3個(gè)接口設(shè)為推挽輸出模式,同時(shí)均已經(jīng)在單片機(jī)內(nèi)部通過弱上拉處理,通信時(shí)以單片機(jī)為主機(jī),DSP為從機(jī).圖2虛線框3為復(fù)位與握手通信,RS引腳接收單片機(jī)的復(fù)位信號(hào),低電平有效,DSP復(fù)位完畢后觸發(fā)INT0(XF)中斷與單片機(jī)進(jìn)行握手.
圖3 基于LabVIEW的GUI前面板
程序設(shè)計(jì)分兩部分,第一部分是PC機(jī)上的LabVIEW程序,用于代碼轉(zhuǎn)換;第二部分是單片機(jī)子模塊程序,讀取SD卡內(nèi)的DSP用戶應(yīng)用程序,進(jìn)行標(biāo)準(zhǔn)串行自舉加載到DSP.
LabVIEW程序設(shè)計(jì)的前面板包括有轉(zhuǎn)換文件的路徑選擇,文件轉(zhuǎn)換信息和轉(zhuǎn)換開關(guān)等;后面板需要完成文件轉(zhuǎn)換,轉(zhuǎn)換細(xì)節(jié)文本輸出和文件名更改等任務(wù).
圖3是基于LabVIEW的GUI前面板,前面板設(shè)計(jì)了2個(gè)輸入分別是.out文件路徑和轉(zhuǎn)換開并,3個(gè)輸出分別顯示文件轉(zhuǎn)換信息、DSP自舉代碼文件內(nèi)容和自舉代碼文件路徑.
圖4是基于LabVIEW的GUI后面板,使用了DOS批處理文件hex500.exe(該文件位于CCS軟件“CCStudio_v3.3C5400cgtoolsin”安裝目錄下)和hex-to-dat.exe文件(進(jìn)行.hex文件到.dat文件格式的轉(zhuǎn)換,其中.dat文件僅含有DSP的16進(jìn)制純機(jī)器代碼).在平鋪式順序結(jié)構(gòu)第一個(gè)子程序內(nèi)調(diào)用hex500.exe,它將.out文件轉(zhuǎn)換為.hex文件;平鋪式順序結(jié)構(gòu)第二個(gè)子程序內(nèi)調(diào)用hex-to-dat.exe,它將得到的.hex文件直接轉(zhuǎn)換成.dat文件.點(diǎn)擊布爾按鈕后GUI依次調(diào)用這兩個(gè)程序,將相關(guān)的轉(zhuǎn)換信息文本輸出到前面板,更改后綴名,并將得到的.dat文件存入.out相同目錄下.
使用hex500.exe之前,需要先生成應(yīng)用程序.out文件和引導(dǎo)表配置文件.cmd.DSP用戶應(yīng)用程序在CCS集成開發(fā)環(huán)境中編譯鏈接后便可生成應(yīng)用程序的.out文件,而描述文件轉(zhuǎn)換參數(shù)信息的.cmd文件需要手動(dòng)設(shè)置..cmd文件內(nèi)容如下;
圖5 單片機(jī)子模塊程序主流程圖
-bootloader.out//bootloader為文件名
-o bootloader.hex//輸出的HEX文件名
-map bootloader.map//輸出的MAP表
-boot//轉(zhuǎn)換成引導(dǎo)表的形式
-i//生成Intel格式
-e _c_int00//用戶程序的入口地址
-memwidth 16//目標(biāo)系統(tǒng)存儲(chǔ)器16位寬
-romwidth 16//16位存儲(chǔ)器位寬
-bootorg SERIAL//標(biāo)準(zhǔn)串行方式
單片機(jī)子模塊的主流程圖如圖5所示.從圖5可以看出,首先模塊初始化,然后讀取SD自舉文件,進(jìn)行標(biāo)準(zhǔn)串行自舉.為此設(shè)計(jì)了C8051F340單片機(jī)初始化等函數(shù),嵌入式文件系統(tǒng)znFAT的移植與SD卡的讀寫程序,C8051F340與TMS320VC54x系列DSP的SPI通信,DSP自舉函數(shù).
3.2.1 初始化函數(shù)設(shè)計(jì) 這部分包括單片機(jī)初始化、SD卡初始化、文件系統(tǒng)初始化等.其中單片機(jī)初始化又包括器件時(shí)鐘初始化(系統(tǒng)時(shí)鐘為48MHz),定時(shí)器初始化,I/O端口初始化將P0.0~P0.3配置為硬件SPI,XBR1=0x04,P1.0~P1.2設(shè)為推挽輸出、中斷初始化IE=0x81開啟.
SD卡初始化程序,先打開片選NSS=0,調(diào)用函數(shù)SD-Write-Cmd(CMD1)即向SD卡寫命令1(51單片機(jī)讀寫SD卡命令),其中CMD1為命令1的首地址,寫不成功或超時(shí)返回0x02,初始化失敗,繼續(xù)調(diào)用函數(shù)SD-Write-Cmd(CMD1)直至成功,關(guān)閉片選,按照SD卡的操作時(shí)序補(bǔ)8個(gè)時(shí)鐘,初始化成功返回.
編輯文件系統(tǒng)初始化函數(shù)需要了解文件系統(tǒng)與存儲(chǔ)卡,其實(shí)與文件系統(tǒng)及分區(qū)相關(guān)的參數(shù)信息都會(huì)被記錄在磁盤上專門的地方DBR(DOS 引導(dǎo)記錄),真正記錄這些參數(shù)的是一個(gè)被稱為BPB(BIOS 參數(shù)塊)的區(qū)域.文件系統(tǒng)初始化先定義一個(gè)bpb型指針(BPB),將數(shù)據(jù)緩沖區(qū)指針轉(zhuǎn)為bpb型指針,裝入設(shè)備號(hào)0(代表SD卡),調(diào)用znFAT_Find_DBR()找到BPB所在扇區(qū)號(hào),調(diào)用znFAT_ReadSector(pArg->BPB_Sector_No,znFAT_Buffer)讀取BPB扇區(qū)信息并賦值給znFAT_Buffer(數(shù)據(jù)緩沖區(qū)),然后向pArg(用于指針文件系統(tǒng)參數(shù)集合的指針)內(nèi)裝入BPB參數(shù)如FAT表占用扇區(qū)數(shù)、根目錄簇號(hào)、每扇區(qū)字節(jié)數(shù)、每簇扇區(qū)數(shù)、第一個(gè)FAT表扇區(qū)號(hào)、磁盤的總?cè)萘?單位是字節(jié))等信息.CISC的CPU通常是小端(低字節(jié)在前),所以znFAT也設(shè)計(jì)為小端,而單片機(jī)這種RISC的CPU,通常來說都是大端(高字節(jié)在前),所以裝入BPB時(shí)需要將小端轉(zhuǎn)大端,將字節(jié)的存放次序進(jìn)行調(diào)整,才能得到正確的數(shù)值.初始化最后調(diào)用Search_Last_Usable_Cluster()獲取最近一個(gè)空閑簇,文件系統(tǒng)初始化完畢.
3.2.2 znFAT文件系統(tǒng)的移植與SD卡的讀程序設(shè)計(jì) 圖5中第3步單片機(jī)打開讀取SD卡內(nèi)容;SD卡容量都較大,需要移植嵌入式Fat32文件系統(tǒng),其中znFAT系統(tǒng)擁有較為完備的功能,如文件打開、數(shù)據(jù)讀寫等.還有長(zhǎng)名、數(shù)據(jù)重定向等擴(kuò)展功能.在本自舉模塊中只要能對(duì)SD卡進(jìn)行查找文件,打開/關(guān)閉一個(gè)文件,讀文件等基本幾個(gè)文件操作與管理即可.
打開文件函數(shù)znFAT_Open_File(*pf,*filepath,item,is_file),pfi指針,用來裝載文件的參數(shù)信息例如文件的大小、文件的名稱、文件的開始簇等,以備后面使用.filepath是文件的路徑,支持任意層目錄例如“\dir1\dir2\dir3\…\test.tx”,變量item在文件名中有通配符*或?的情況下,實(shí)現(xiàn)與之匹配的文件并非一個(gè),item就是打開的文件的項(xiàng)數(shù),這里取0.該函數(shù)返回0說明成功,返回1說明文件不存在,返回2說明目錄不存在.
SD卡讀函數(shù)SD-Read-Sector(addr,buf)讀取addr扇區(qū)的512個(gè)字節(jié)到buffer指向的數(shù)據(jù)緩沖區(qū),addr為扇區(qū)地址,buffer為指向數(shù)據(jù)緩沖區(qū)的指針外部.調(diào)用成功,返回0x00;否則返回0x04.SD卡初始化成功后,讀寫扇區(qū)時(shí),盡量將SPI速度提上來,提高效率.
3.2.3 復(fù)位與握手程序設(shè)計(jì) 圖5標(biāo)準(zhǔn)串行自舉流程圖中4~5打開單片機(jī)外部中斷,復(fù)位DSP,等待握手信號(hào).因?yàn)镈SP復(fù)位比較慢,需要等待較長(zhǎng)時(shí)間,握手成功后才可進(jìn)行數(shù)據(jù)傳輸,DSP復(fù)位完成后XF引腳變?yōu)榈碗娖?觸發(fā)INT0中斷提示單片機(jī)復(fù)位完成,握手成功.如圖2自舉模塊引腳連接圖虛線框3.
3.2.4 標(biāo)準(zhǔn)串行自舉程序設(shè)計(jì) 圖5中第6步調(diào)用DSP自舉函數(shù)并發(fā)送代碼.單片機(jī)開始向DSP寫入SD卡內(nèi)的自舉文件,由于TI公司在TMS320VC5416內(nèi)掩膜了Boot Loader程序,該程序也包含了與單片機(jī)的通信協(xié)議,所以不用再單獨(dú)編寫自舉程序和通信協(xié)議.標(biāo)準(zhǔn)串行自舉正常工作的時(shí)序程序如下:Delay(20)代表延時(shí)20μs;P1.0,P1.1,P1.2是圖2虛線框2中單片機(jī)引腳,依次代表BDR0,BFSR0,BCLKR0,P1.0輸入無(wú)符號(hào)整型變量,P1.1為幀步信號(hào),P1.2輸出同步時(shí)鐘,組成標(biāo)準(zhǔn)串行自舉總線,時(shí)序圖如圖6所示.
znFAT_Read_File(&FileInfo_loaderFile,j*4,4,loader_ARRAY);//讀取SD卡內(nèi)自舉文件并賦值給loader_ARRAY
w=ASCII_Transform();//將loader_ARRAY中存放的直接從SD卡文件中讀取的ASCII字符數(shù)據(jù)轉(zhuǎn)換為相應(yīng)16進(jìn)制數(shù),w為16bit的unsigned int型變量,傳輸用戶應(yīng)用程序代碼
圖6 標(biāo)準(zhǔn)串行自舉時(shí)序圖
P1.2=1;
Delay(20);
P1.2=0;
P1.1=1;
Delay(20);
P1.2=1;
Delay(20);
P1.2=0;
Delay(20);
for(i=0;i<16;i++)
{
P1.0=(w & (0x8000 ? i)) >0;
P1.2=1;
P1.1=0;
Delay(20);
圖7 步驟一實(shí)驗(yàn)結(jié)果GUI的前面板
P1.2=0;
Delay(20);
}
自舉完畢后,單片機(jī)關(guān)閉SD的DSP應(yīng)用程序文件,此時(shí)自舉文件數(shù)據(jù)已經(jīng)載入到DSP,拔掉JTAG接口后DSP系統(tǒng)可以自啟動(dòng)了.
為驗(yàn)證本模塊存儲(chǔ)并更新DSP用戶應(yīng)用程序?qū)崿F(xiàn)自舉的有效性,測(cè)試分為兩步.第一步,LabVIEW程序代碼轉(zhuǎn)換,驗(yàn)證LabVIEW程序是否能夠?qū)崿F(xiàn)自舉文件.out到.dat的格式轉(zhuǎn)換;第二步單片機(jī)子模塊自舉,驗(yàn)證單片機(jī)子模塊是否能夠通過znFAT文件系統(tǒng)管理SD卡,是否能夠進(jìn)行TMS320VC54x系列DSP的標(biāo)準(zhǔn)串行自舉.
DSP用戶應(yīng)用程序是LCD顯示程序.在LabVIEW前面板找到并選定LCD顯示程序在CCS集成開發(fā)環(huán)境中編譯鏈接后生成的.out文件,然后運(yùn)行LabVIEW軟件點(diǎn)擊轉(zhuǎn)換按鈕,觀察3個(gè)輸出文本框.結(jié)果如圖7所示.實(shí)驗(yàn)成功完成代碼轉(zhuǎn)換,文件轉(zhuǎn)換信息由LabVIEW后面板的執(zhí)行系統(tǒng)指令hex500.exe產(chǎn)生,意思是將bootloader.out轉(zhuǎn)換成Intel Hex格式,其后綴名為.hex,DSP自舉代碼文件內(nèi)容由hex-to-dat.exe輸出,原來的.out文件變成16進(jìn)制數(shù),超級(jí)編輯器打開的.out,.hex,.dat文件內(nèi)容如圖8所示,DSP用戶應(yīng)用程序剔除了冗余,文件內(nèi)容減少,變成了16進(jìn)制純機(jī)器碼,自舉代碼文件路徑就是.dat文件的路徑,與.out文件在同一目錄下.
自舉模塊以TMS320VC5416為DSP目標(biāo)板,在步驟一中前面板的自舉代碼文件路徑下找到.dat文件并通過PC機(jī)載入到SD卡,再將SD卡插入自舉模塊,然后運(yùn)行調(diào)試自舉模塊的單片機(jī)程序,這時(shí)會(huì)看到LCD顯示內(nèi)容,如圖9所示.最后撤掉單片機(jī)仿真器,重啟自舉模塊電源,察看LCD顯示屏,實(shí)驗(yàn)結(jié)果如圖9所示.說明TMS320VC5416自舉成功,圖9中自舉模塊左下角接的是USB電源,沒有接任何仿真器,LCD顯示內(nèi)容與DSP接仿真器調(diào)試LCD顯示程序相同.該實(shí)驗(yàn)證明自舉模塊單片機(jī)能夠?qū)D卡內(nèi)文件進(jìn)行管理和DSP目標(biāo)板TMS320VC5416完成了標(biāo)準(zhǔn)串行自舉.
圖8 out,.hex,.dat文件 圖9 步驟二實(shí)驗(yàn)結(jié)果實(shí)物圖
設(shè)計(jì)了一種基于SD卡的DSP自舉模塊,該模塊用SD卡作為DSP的引導(dǎo)代碼文件存儲(chǔ)載體,使DSP的引導(dǎo)代碼存儲(chǔ)不受容量限制,SD卡形成文件系統(tǒng)存儲(chǔ)管理DSP用戶應(yīng)用程序代碼,使自舉代碼更新升級(jí)非常方便;通過GUI軟件將CCS生成的應(yīng)用程序文件直接轉(zhuǎn)換成為.dat的文件,使DSP應(yīng)用程序更新升級(jí)免去代碼轉(zhuǎn)換步驟.另外DSP標(biāo)準(zhǔn)串行引導(dǎo)的自舉方式占用DSP芯片較少的硬件資源.實(shí)驗(yàn)表明本文提出的自舉模塊合理可行.
參考文獻(xiàn):
[1] 陳孟奇,嚴(yán)新榮.TMS320VC5509A串行EEPROM自舉的方法研究[J].艦船電子工程,2012(6):73-75.
[2] 陳若珠,胡金平,李站明.TMS320VC5509在線燒寫Falsh并自興趣啟動(dòng)方法研究[J].軟件天地,2011(30):9-11.
[3] 張彪,方方,黃洪全,等.TMS320VC5502外擴(kuò)FLASH自舉引導(dǎo)方法的設(shè)計(jì)與實(shí)現(xiàn)[J].核電子學(xué)與探測(cè)技術(shù),2009,29(6):1303-1306.
[4] 鄒翼,曾文海,陳續(xù)喜.基于TMS320VC5402 DSP的HPI方式自舉的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2009,18(3):152-155.
[5] 李輝.C8051F023通過HPI對(duì)TMS320C5402自舉的實(shí)現(xiàn)[J].工程應(yīng)用,2005,35(3):35-37.
[6] 秦承虎.TMS320VC5416自舉技術(shù)[J].電子測(cè)量技術(shù),2005(5):48-49.
[7] 張喜平,梁書斌.TMS320VC54x系列DSP芯片自舉程序的優(yōu)化設(shè)計(jì)[J].自然科學(xué),2012,27(3):24-28.
[8] 朱廣斌,朱德明,孟小利.MCU與DSP的SPI通信設(shè)計(jì)[J].技術(shù)縱橫,2008(1):33-35.
[9] 李世奇,董浩斌,李榮生.基于FatFs文件系統(tǒng)的SD卡存儲(chǔ)器設(shè)計(jì)[J].測(cè)控技術(shù),2011,30(12):79-81.