TMS320VC5416并行自舉的巧妙實(shí)現(xiàn)
1 DSP和FLASH構(gòu)成的自舉系統(tǒng) DSP在自舉過程中,是將外部的存儲區(qū)當(dāng)作數(shù)據(jù)存儲區(qū)來訪問的。因此在設(shè)計(jì)時,雖然FLASH內(nèi)部存儲的是代碼,但對于DSP而言依然是數(shù)據(jù)。由于TMS320VC5416的數(shù)據(jù)總線是16位的,所以選用16位總線接口的FLASH存儲器。數(shù)據(jù)區(qū)中的0x0000~0x7FFF對應(yīng)為DSP內(nèi)存的RAM區(qū),所以DSP要對外部的FLASH操作只能訪問0x8000~0xFFF的32K字存儲區(qū)。 DSP自舉系統(tǒng)的基本連接如圖1所示。自舉系統(tǒng)中的選用的FLASH為SST公司的SS39VF200,該FLASH存儲器為128K字容量,16位總線接口。為了簡化起見,圖中沒有對FLASH進(jìn)行分頁處理,僅僅是把它當(dāng)成外部數(shù)據(jù)存儲區(qū)來處理。由于SS39VF200的讀信號OE和寫信號WE是分開的,且寫信號的優(yōu)先級高于讀信號,而DSP的讀寫共用一個引腳,所以將DSP的讀寫信號與FLASH的寫信號相連接,而將其讀信號OE直接接地,F(xiàn)LASH的片選信號CE直接與DSP的數(shù)據(jù)區(qū)選擇信號OE相連接,這表明將FLASH作為DSP的數(shù)據(jù)存儲區(qū)進(jìn)行訪問。如上所述,DSP只能訪問外部數(shù)據(jù)區(qū)的0x8000~0xFFF區(qū)域的數(shù)據(jù),因此對于39VF200而言,可以將最高位地址A16直接接地。對于上述電路連接方法,39VF200存儲器從0x0000開始的32K的空間是無法訪問的。 2 TMS320VC5416對SST39VF200的在系統(tǒng)編程 2.1 SS39VF200芯片介紹 SST39VF200的操作不像一般的RAM和ROM,除了讀數(shù)據(jù)的過程一樣外,其它的操作都不相同,必須按照一定的順序來執(zhí)行。 2.2 TMS320VC5416對SST39VF200的編程操作 通常,在對FLASH進(jìn)行編程之前,必須將FLASH中待寫的區(qū)域進(jìn)行擦除,然后才能進(jìn)行編程操作。需要注意的是,每次對FLASH發(fā)出操作命令后,必須等到FLASH完成本次操作才能發(fā)送下一個操作命令。判斷FLASH執(zhí)行命令完畢的方式有兩種,一是利用數(shù)據(jù)位D7判斷,如果FLASH尚未完成操作,則讀該位總是為低,完成操作后該位變成高;二是利用數(shù)據(jù)位D6判斷,如果FLASH尚未完成操作,則相鄰兩次讀到的D6位的值不同。當(dāng)兩次讀到的D6位的值都是一樣的,表明FLASH完成了本次操作。 下面以數(shù)據(jù)位D6判斷操作完成與否,說明TMS320VC5416對SST39VF200寫操作的具體過程,其它操作過程與該過程基本相同。 Void Word_Program(uint * Ad,uint DQ) //Ad為編程地址,DQ為編程數(shù)據(jù) { uint *Ad_Temp,Temp1,Temp2; //定義臨時地址指針和數(shù)據(jù)變量 Ad_Temp=(uint *)(0x55555); //第一個寫周期 *Ad_Temp=0x5555; //給地址0x5555,寫數(shù)據(jù)0x00AA Ad_Temp=(uint *)(0x2AAA); //第二個寫周期 *Ad_Temp=0x0055; //給地址0x2AAA,寫數(shù)據(jù)0x0055 Ad_Temp=(uint *)(0x5555); //第三個寫周期 *Ad_Temp=0x00A0; //給地址0x5555寫數(shù)據(jù)0x00A0 *Ad=DQ; //給編程地址寫編程數(shù)據(jù) Again;Temp1=*Ad %26;amp; 0x0040; //兩次讀D6(Toggle Bit) Temp2=*Ad %26;amp; 0x0040; If(Temp1!=Temp2) //判斷是否命令執(zhí)行結(jié)束,否則繼續(xù)讀Toggle Bit goto Again; }圖23 TMS320VC5416的并行自舉 通過在系統(tǒng)編程可以實(shí)現(xiàn)將執(zhí)行代碼寫入FLASH。如果確定FLASH中用戶程序代碼的存儲格式并正確自舉以實(shí)現(xiàn)脫機(jī)運(yùn)行是整個在系統(tǒng)編程的重點(diǎn)。 3.1 自舉表 在介紹DSP并行自舉過程之前,必須對DSP的自舉表加以說明。必須對DSP的自舉表加以說明。自舉表需按照TI公司規(guī)定的格式來創(chuàng)建。該表中存放在DSP初始化時要用到的特殊寄存器如SWWSR、BSCR等的值、程序入口地址、各段的目標(biāo)首地址和長度以及要執(zhí)行的代碼。 3.2 并知自舉過程 完整的并行自舉的流程圖如圖2所示。 SST39VF200 FLASH存儲器是16位的,所以實(shí)際采用的是16位并行自舉,DSP內(nèi)部的引導(dǎo)程序從數(shù)據(jù)空間地址0xFFFF讀取自舉表首地址,最后從自舉表中將可執(zhí)行代碼搬移到DSP對應(yīng)的RAM中。 3.3 "兩次下載法"實(shí)現(xiàn)并行自舉 如何按照規(guī)定的自舉表格式將表中的各項(xiàng)內(nèi)容寫入到外掛的FLASH中去?普通的做法是利用hex200.exe文件將*.out文件轉(zhuǎn)換后*.hex格式,然后讀取*.hex文件,將其寫入FLASH。這里采用一種更簡便的“兩次下載法”將自舉表寫入FLASH,整個過程無需文件轉(zhuǎn)換和文件讀取,并且完成此過程的代碼很小,幾乎不占用DSP內(nèi)部的存儲空間。 所謂的“兩次下載法”就是通過仿真器對DSP進(jìn)行兩次加載來完成自舉表的建立。第一次加載用戶希望自舉的可執(zhí)行代碼,稱為代碼1,加載完后不運(yùn)行此代碼;緊接著加載建立自舉表的代碼,稱為代碼2。代碼1是DSP脫機(jī)運(yùn)行時的代碼,代碼2僅僅是把代碼1按照自舉表的格式寫入到外部FLASH中的代碼。需要注意的是,代碼1和代碼2在分配程序存儲空間時不可以重疊,而且代碼2的數(shù)據(jù)空間必須包含代碼1和外部FLASH共同占用的空間,因?yàn)樗汛a1按訪問數(shù)據(jù)的方法寫到外部FLASH中。由于下載完代碼1后并沒有運(yùn)行,而是緊接著下載代碼2,兩者的程序存儲區(qū)又不重疊,因此下載完碼2后,先前下載的代碼1仍舊在DSP中,只是被代碼2看成數(shù)據(jù)而已。“兩次下載法”的具體操作步驟如下: (1)將DSP的MP/MC引腳置高,讓DSP工作在微處理器方式。 (2)將代碼1通過仿真器下載到DSP中,但不運(yùn)行該代碼。 (3)將代碼2通過仿真器下載到DSP中,運(yùn)行此代碼。 (4)代碼2運(yùn)行結(jié)束后,去掉仿真器,并將MP/MC引腳置低,讓DSP工作在微型計(jì)算機(jī)方式。 (5)復(fù)位DSP,觀察程序運(yùn)行的結(jié)果是否正常。 “兩次下載法”中兩次代碼的存儲區(qū)分配情況如圖3所示。
圖中,代碼1中的數(shù)據(jù)段起始地址為0xA,數(shù)據(jù)段結(jié)束地址這0xB,代碼段起始地址為0xC,代碼段結(jié)束地址為0xD,其中0xB和0xC可以是同一地址,也可是不同地址;代碼2中的數(shù)據(jù)段起始地址為0xG,數(shù)據(jù)段結(jié)束地址為0xFFFF,代碼段起始地址為0xE,代碼段結(jié)束地址為0xF,其中0xF和0xG可以是同一地址,也可以是不同地址。對TMS320VC5416而言,因其0x0000~0x7FFF對應(yīng)的是內(nèi)部的32K字空間,所以兩個表中的地址大小關(guān)系為0xG<0xC<0xD<0x8000。 基于上述思想,假設(shè)代碼1的程序段為0x4000~0x7FFF,數(shù)據(jù)段為0x3000~0x3FFF,代碼2的程序段為0x2000~0x2FFF,數(shù)據(jù)段為0x3000~0xFF7F(需要注意的是,代碼2的數(shù)據(jù)段必須包含代碼1的代碼段和FLASH所占據(jù)的地址空間,代碼2的代碼段絕對不能與代碼1的代碼段有重疊),外部FLASH占據(jù)的地址空間為0x8000~0xFF7F,自舉表的首地址從0x8000開始,并且SWWSR和BSCR的值分別為0x0E38和0x8806,程序入口地址為0x004089,代碼1長度為16K字,代碼1的存放起始地址為0x004000,那么代碼2在FLASH中建立自舉表的程序如下: UINT I; //定義臨時變量 UINT *Addr1,*Addr2; //定義臨時地址指針變量 Addr1=(uint *)0xffff; Word_Program(Addr1,0x8000); //在數(shù)據(jù)空間0xffff地址寫自舉表起始地址0x8000 Addr1=(uint *)0x8000; //自舉表首地址 Word_Program(Addr1,0x10AA); //自舉總線寬度為16位,即第一個字為0x10AA Addr1++; //累為地址 Word_Program(Addr1,0x0E38); //SWWSR的值 Addr1++; //累加地址 Word_Program(Addr1,0x8806); //BRSC的值 Addr1++; //累加地址 Word_Program(Addr1,0); //程序入口地址XPC為0 Addr1++; //累加地址 Word_Program(Addr1,0x4089); //程序入口地址PC為0x4089 Addr1++; //累加地址 Word_Program(Addr1,0x4000); //代碼長度為0x4000 Addr1++; //累加地址 Word_Program(Addr1,0); //目標(biāo)程序入口地址XPC為0 Addr1++; Word_Program(Addr1,0x4000); //目標(biāo)程序入口地址PC為0x4000 Addr1+; //累加地址 Addr2=(uint *)0x4000 //代碼1起始地址 for(I=0;I<0x4000;I++) //寫代碼1到FLASH,長度為16K字 Word_Program(Addr1++,*(Addr1++)); Word_Program(Addr1,0x0000); //自舉表結(jié)尾的一個字寫入0x0000,自舉表建立結(jié)束 代碼2除了上面的自舉表的建立外還包括FLASH的擦除和自舉表數(shù)據(jù)的校驗(yàn)。需要注意的是,在對FLASH進(jìn)行寫操作之前,必須對其進(jìn)行擦除,擦除部分的程序可參考前面的Word_Program()子函數(shù)。 這樣,通過簡單的“兩次下載法”,利用代碼2將要脫機(jī)運(yùn)行的代碼1以自舉表的格式寫到FLASH存儲器中,校驗(yàn)正確后DSP即可脫機(jī)工作了。 采用“兩次下載法”利用DSP自身對FLASH進(jìn)行編程,可實(shí)現(xiàn)DSP的并行自舉。這種在系統(tǒng)編程的DSP自舉實(shí)現(xiàn)方式簡單靈活。文中給出的硬件電路僅適用于程序代碼小于32K字的系統(tǒng)中。在一般DSP系統(tǒng)中,都會有FPGA等可編程器件,利用它們可以靈活地對FLASH進(jìn)行分頁操作。這樣,在程序量超過32K字的情況下,此方法也適用。












評論