實驗原理 1. 外部擴展程序存儲器 由于C54x內(nèi)部沒有Flash或EEPROM,掉電后程序不能保存下來,脫機使用時需要外接的Boot ROM在上電時將程序加載到內(nèi)部RAM中運行,因此必須為C54x DSP擴展一個非易失程序存儲器,用以存放待執(zhí)行的指令和執(zhí)行中所用的系數(shù)(常數(shù))。 C54xx有1~8M字的程序地址空間,其中程序地址空間的每16位地址空間的高32k(xx8000H-xxFFFFH)可以映射到外部存貯器。YK5000實驗儀的CPU板上集成了一片256k×16bit的Flash。由于外部地址空間有限,在YK5000實驗儀的設(shè)計中,外部程序存儲器的所有頁占用的是同一地址空間0x8000~0xFFFF,可尋址范圍為32k。當(dāng)外部存儲器容量大于32k時,就將存儲器空間以32k為單位分為多個存儲頁。例如, 256k的Flash以32k為一頁,共被分為256/32=8頁。 由于外部程序存儲器的存儲頁一般不同時使用,因此可由CPLD來控制切換?刂祈撁媲袚Q的寄存器被映射到IO地址0x8000,上電時默認(rèn)為0,此時Flash的第0頁有效,Flash的其他頁無法訪問,如需要訪問這些空間,在程序中寫0x1~0x7到IO端口0x8000就可以把地址空間0x8000~0xFFFF由Flash Page0映射到其他的存儲頁。 表2.2 YK5000外部存儲器映射 頁面寄存器 (IO端口地址0x8000) 外部存儲器(占用地址空間0x8000~0xFFFF) 說明 0x 0 Flash Page0 Flash程序存儲器的第0頁 0x 1 Flash Page 1 Flash程序存儲器的第1頁 0x 2 Flash Page 2 Flash程序存儲器的第2頁 0x 3 Flash Page 3 Flash程序存儲器的第3頁 0x 4 Flash Page 4 Flash程序存儲器的第4頁 0x 5 Flash Page 5 Flash程序存儲器的第5頁 0x 6 Flash Page 6 Flash程序存儲器的第6頁 0x 7 Flash Page 7 Flash程序存儲器的第7頁 上電時頁面寄存器的值可以由板上的撥動開關(guān)SWX2的狀態(tài)設(shè)定,用來選擇上電時默認(rèn)加載Flash中哪一個32k的存貯頁中的程序。 2.Flash芯片—SST39VF400A介紹 Flash是一種體積小,容量大的非易失性存貯器,可以反復(fù)燒寫十萬次。但其寫操作比較麻煩:一是先要擦除,后寫數(shù)據(jù);二是寫擦除/寫操作之前需要加上一定前導(dǎo)指令碼。 YK5000實驗儀板載Flash芯片型號為SST39VF400A,此芯片是Silicon Storage Technology生產(chǎn)的4M位(256k×16)FLASH存儲器。以下是SST39LF400A寫操作指令碼: 表9.1 SST39LF400A指令序列 指令序列 1 2 3 4 5 6 Addr D Addr D Addr D Addr D Addr D Addr D 寫數(shù)據(jù) 5555 AA 2AAA 55 5555 A0 WA Data 擦除扇區(qū) 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 SAX 30 擦除區(qū)塊 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 BAX 50 擦除整片 5555 AA 2AAA 55 5555 80 5555 AA 2AAA 55 5555 10 WA表示寫數(shù)據(jù)地址,SAX表示扇區(qū)地址,扇區(qū)大小是2k Word;BAX表示區(qū)塊地址,區(qū)塊大小是32k Word。 需要特別注意的是,Flash指令序列中的Addr格式是A14~A0,默認(rèn)其高位地址線為0。在YK5000實驗儀中,Flash被映射到DSP的高32k地址(0x8000~0xFFFF),因此,在DSP中訪問Flash空間的時候,寫地址Addr都需要加上基地址0x8000。 詳細內(nèi)容,請閱讀SST39LF400A的數(shù)據(jù)手冊。 實驗內(nèi)容 本小節(jié)的實驗內(nèi)容是在CCS里編寫一個擦除、燒寫YK5000實驗儀上Flash芯片的程序。 要求: 1. 擦除Flash的存儲區(qū); 2. 將Flash切換到第0頁; 3. 將數(shù)據(jù)0x0000~0x8000燒寫到第0頁存儲區(qū)內(nèi)。 在CCS的仿真、調(diào)試環(huán)境下,讀者可以實時的觀察到Flash中存儲區(qū)變化情況,掌握Flash讀寫操作的知識。 (1)整塊Flash的擦除 只要在相應(yīng)地址寫入表9.1所示的指令序列,就能對SST39LF400A進行各種擦除操作,下面是擦除整片F(xiàn)lash所用的函數(shù)形式: //定義指向地址0x8000的IO端口變量,用來控制Flash頁面切換 ioport unsigned port8000h; //擦除整塊Flash void EraseChip() { unsigned int i; *(volatile unsigned int *)(0x8000+0x5555) = 0xAA; delay(10); *(volatile unsigned int *)(0x8000+0x2AAA) = 0x55; delay(10); *(volatile unsigned int *)(0x8000+0x5555)= 0x80; delay(10); *(volatile unsigned int *)(0x8000+0x5555)= 0xAA; delay(10); *(volatile unsigned int *)(0x8000+0x2AAA)= 0x55; delay(10); *(volatile unsigned int *)(0x8000+0x5555)= 0x10; delay(10); //驗證 for( i=0x0; i<07FFF; i++ ) //在此僅驗證頁0擦除操作是否正確完成 while( *(volatile unsigned int *)(0x8000+i) != 0xffff ); } (2)為Flash寫入特定的數(shù)據(jù) 為了方便觀察起見,將數(shù)據(jù)0x0000~0x8000燒寫到Flash的第0頁存儲區(qū)內(nèi)。函數(shù)形式如下: //向Flash中寫數(shù)據(jù),依次為0x0000--0xFFFF void WriteChip() { unsigned int i; for( i=0; i<=0x7FFF; i++ ) { *(volatile unsigned int *)(0x8000+0x5555) = 0xAA; delay(PERIOD); *(volatile unsigned int *)(0x8000+0x2AAA) = 0x55; delay(PERIOD); *(volatile unsigned int *)(0x8000+0x5555)= 0xA0; delay(PERIOD); *(volatile unsigned int *)(0x8000+i) = i; delay(PERIOD); //在此僅驗證當(dāng)前字寫入操作是否正確完成 while( *(volatile unsigned int *)(0x8000+i) != i );
|