一. SST89C54/58性能簡介 二. SST89C54/58功能圖 兼容于INTEL公司的P87C54/58 , 擴(kuò)展了IAP及4K E2PROM。
三. SST89C54/58程序空間 在動態(tài)修改Block0程序的問題上,應(yīng)當(dāng)確保將要加載的程序正確無誤,至少做到進(jìn)入Block1塊入口程序的正確性,否則就只有借助編程器來燒錄自舉程序了。但這樣就失去IAP的意義,不可不察。 在本公司的LOG2001 USB DEMO KIT開發(fā)系統(tǒng)上,需要完全更新Block0塊的內(nèi)容,讓用戶真實(shí)擁有P87C54/58的全部功能。這樣,當(dāng)用戶在開發(fā)USB時(shí),就不需要用定位器或者匯編語言來混合編程。只需象平時(shí)那樣操作自己熟悉的C51開發(fā)環(huán)境。 LOG2001 USB DEMO KIT開發(fā)系統(tǒng)使用UART來傳送Firmware,其默認(rèn)Buadrate為9600bps。除了確保自舉程序入口正常以外,串口的Buadrate在當(dāng)次也要相符。改動Buadrate只有在裝載成功以后才有效。 一般來說,在完全掌握IAP及232口以前,而身邊又缺乏編程器的情況下,應(yīng)謹(jǐn)慎對待與之相關(guān)的程序語句。在本公司的LOG2001 USB DEMO KIT開發(fā)系統(tǒng)上,還預(yù)備有最后一種自舉能力:硬件自舉!
四. IAP編程模式
SST89C54/58除了提供IAP編程模式以外,也可以借助外力(如編程器)強(qiáng)行將程序灌入,就象寫Flash ROM一樣。其實(shí)自舉程序就唯有通過這種方式載入。稱之為“外主編程模式”。 外主編程模式對于大多數(shù)程序員而言意義不大,有興趣的話參閱SST89C54/58的 Datesheet,下面介紹IAP模式。 IAP模式就是CPU一邊在某個Block 中運(yùn)行,同時(shí)對另一個Block進(jìn)行擦空,寫入,校驗(yàn)等操作。注意,同一個Block內(nèi)不允許Program。被Program的Block整個兒處于“忙”狀態(tài),其代碼不可見。 IAP命令見下表:(略) 與此相關(guān)的特殊功能寄存器定義如下: 1.SFST 其中,SECDx為加密表,不同的加密級別將決定被加密單位對外的透明度,具體見下表: 2.SFCF 3.SFCM 4.SFDT 5.SFAL 6.SFAH
IAP程序設(shè)計(jì): 對照上述介紹,很容易編寫出IAP燒錄函數(shù),下面給出幾個事例: 1. 塊擦除: void block_erase (unsigned char block) { unsigned int timeout = 0xA555; SFCF = 0xC0; SFAH = block; SFDT = 0x55; SFCM = 0x0D;
while (--timeout){ if (Busy = = 0) return; } } 2. 字節(jié)編程: void byte_program (unsigned char laddr,unsigned char haddr,unsigned char udata) { unsigned char timeout = 0xFF; SFCF = 0xC0; SFAH = haddr; SFAL = laddr; SFDT = udata; SFCM = 0x0E;
while (--timeout){ if ( Busy = = 0) return; } } 對于只需要Download Firmware來說,上述兩個函數(shù)已經(jīng)夠用。完整的IAP匯編子程序請參閱:http://www.ssti.com/ 采用C語言編寫IAP函數(shù)需要一定的技巧,它關(guān)系到定位并訪問絕對地址等問題,而且這些函數(shù)只是應(yīng)用系統(tǒng)中的一小部分,雖然嵌匯編或者純匯編更便于處理絕對地址,但卻不利于整個大系統(tǒng),有點(diǎn)丟西瓜的味道。 LOG2001 USB DEMO KIT開發(fā)系統(tǒng)的自舉程序使用純C語言編寫,而且也適用于低價(jià)位的SST89F54/58(和Philips的價(jià)位比大概二比一吧)。 如何拿IAP來當(dāng)I2C使用,以便節(jié)省24LCxx或93Cxx呢。Sector的概念在這里尤為重要,因?yàn)楦膭訑?shù)據(jù)不能影響程序,故而要求在小范圍內(nèi)操作。下面是關(guān)于Sector的函數(shù): void sector_erase (unsigned int sector) { unsigned int timeout = 0xA555; SFCF = 0xC0; SFAH = sector /256; SFAL = sector; SFCM = 0x0B;
while (--timeout){ if (Busy == 0) return; } } 如果僅僅要修改某一兩個Byte,可將該Sector內(nèi)的數(shù)據(jù)全部保存于RAM中,改好后再全部回送Sector。 一般來說,數(shù)據(jù)Sector應(yīng)設(shè)置在Block1的高端,這樣才不會和CODE競爭。
五. SST89C54/58發(fā)展系統(tǒng)
前面說過,SST89C54/58兼容于INTEL的P87C54/58,故而其編譯環(huán)境毋須作大的改動,如果不打算使用IAP功能,干脆一點(diǎn)也不改。 擴(kuò)展IAP功能,對于匯編語言來說,只是在源文件開頭用EQU或DATA偽指令定義那六個新增加的SFR地址即可。而C語言也同樣在頭文件中增加定義的SFR地址。本公司網(wǎng)站(www.usb11.com)上有SST89C58.h供Download。可將其直接替代<<reg51.h>>。 因?yàn)槭荌AP,仿真器不太重要,其實(shí)目前也沒有專門針對SST89C54/58的仿真器。即便有也沒市場,IAP應(yīng)用最多的地方也就是當(dāng)仿真器!
六. IAP應(yīng)用場合
第一,IAP很方便,在網(wǎng)絡(luò)高速發(fā)展的今天,具備遠(yuǎn)程升級軟件的產(chǎn)品無疑將受到歡迎。 第二,在編譯代碼的時(shí)候,對于稍稍多出來的一些程序代碼,可將其定位到Block1,從而避免購買更高容量的IC。 第三,在需要保存過程數(shù)據(jù)的系統(tǒng),可將原先的外部存儲器去掉,直接拿Block1當(dāng)成外部E2PROM。此時(shí),Block1等同于24LC32,而且操作速度要比24LC32快幾十上百倍。 第四,IAP在線軟件更新,沒有死角,包括自舉程序本身也可以重來,且毋須借助任何外力。仿真器的一大特點(diǎn)不就是編譯裝載嗎!沒錯,很多地方就拿它來當(dāng)仿真器使用。 若要觀察程序變量,IAP的解決辦法是通過UART輸出調(diào)試信息。LOG2001 USB DEMO KIT就是采用這一調(diào)試技術(shù)。一點(diǎn)也不遜色于仿真器,特別在USB枚舉的過程中,仿真器特有的單步,中斷功能不可用,此時(shí)唯有UART可以信賴。詳情請見《USB枚舉步驟》。 IAP當(dāng)仿真器的另一買點(diǎn)就是價(jià)廉物美,區(qū)區(qū)幾十元RMB的材料錢就可搞定。特別適合于單片機(jī)初學(xué)者。 傳統(tǒng)的仿真器在電氣性能方面,還無法做到和應(yīng)用系統(tǒng)完全一致,這就是常見的“仿真通過,燒片不行”的毛病。IAP雖說是仿真,其實(shí)就是實(shí)際應(yīng)用,不存在電氣性能或者物理接口方面的問題。 第五,產(chǎn)品小型化。一般地說,SMD只適合于大批量的生產(chǎn)廠家,因?yàn)镾MD測試工具也是一筆不小的投資。如果商家在出售SST89C54/58以前,預(yù)先導(dǎo)入自舉程序,則用戶拿了SMD之后,可以先裝配,再燒錄,管它大封裝,小封裝還是微封裝呢! 關(guān)于LOG2001 USB DEMO KIT自舉程序的入口及入口參數(shù)設(shè)置,在本文附錄中給出。
附錄 LOG2001 USB DEMO KIT自舉程序入口參數(shù)
下列參數(shù)要求通過UART輸入: 1. “h”:選擇Download INTEL格式文件*。hex; 2. “b”:選擇Download 誠通格式文件*。Rom,它和*。Hex區(qū)別是將ASIC碼轉(zhuǎn)換成bin數(shù)據(jù),并去掉“0D,0A”等控制信息。數(shù)據(jù)量壓縮一倍,節(jié)省時(shí)間; 3. 輸入第一次“h”或者“b”之后,自舉程序?qū)⒎祷匾粋確認(rèn)符0x20(空格),如果再次肯定要改寫Firmware,第二次輸入“h”或者“b”才啟動擦除和寫入。否則不改變原來的Firmware; 4. 輸入其它代碼,則系統(tǒng)提示錯誤后復(fù)位系統(tǒng); 5. 自舉程序入口地址:0xF8DD,不帶任何參數(shù),只需置好Buadrate; 下面給出入口事例函數(shù),可將其嵌入任何用戶系統(tǒng),實(shí)際上, LOG2001 USB DEMO KIT開發(fā)系統(tǒng)就是使用如下語句: if (RI) { switch ( _getkey() ) { case 'p': (( void (code *)(void) ) &hard_reload[0] )(); break; default:break; } } // if reload firmware 當(dāng)然,在進(jìn)入自舉程序以前,還要設(shè)置好Buadrate等等一系列參數(shù)。自舉程序?qū)⒉捎眠@些設(shè)置而不作任何修改。 下面是自舉程序: switch (_getkey()) { case 'h': sst_send232 (' ');
if ( _getkey() != 'h') goto nError;
sst_block_erase (0x00); while ( read_write_hex_line (0x00) ); break;
case 'b': sst_send232 (' ');
if ( _getkey() != 'b') goto nError;
sst_block_erase (0x00); while ( read_write_bin_line (0x00) ); break;
nError: default : printf ("\nError!\n"); printf ("\n'h':for (*.hex);\n"); printf ("\n'b':for (*.rom);\n"); (( void (code *) (void) ) &reset_0x0000 [0]) (); break; } Download文件最大可達(dá)32K,裝載完成之后,采用20秒鐘倒記時(shí),自動復(fù)位運(yùn)行剛剛Download的程序,毋須任何機(jī)械動作。 由于某種原因而破壞入口函數(shù),則只有通過編程器來恢復(fù)。在燒寫入口函數(shù)的時(shí)候,請先限制DEVICER Buffer Size在0x8000之內(nèi),以免連鎖破壞自舉程序。 為了便于調(diào)試USB及其裝載IAP不會出錯,本公司特推出“USB集成化開發(fā)環(huán)境”,它具有如下功能: 1. USB功能調(diào)試,詳情請參閱《USB集成化開發(fā)環(huán)境》; 2. 串口精靈,可任意設(shè)置串口參數(shù),收發(fā)單個數(shù)據(jù)或者文件,接受單片機(jī)C語言的人機(jī)信息(printf,scanf, _getkey()等等); 3. IAP程序下載。IAP不須要任何機(jī)械動作,可以直接全面而徹底更新firmware,稍微操作不當(dāng)就會影響到自舉程序!禪SB集成化開發(fā)環(huán)境》有多重查驗(yàn)措施,用戶只需全神關(guān)心自己的源文件就是了; 4. 自動疊加硬件自舉功能,不管用戶如何修改Firmware,即便死機(jī),或者是由于前次IAP時(shí)中途停電而造成程序飛跑,仍然可通過該功能下載程序。具體是:P2.0=P2.1à“h”à“ h”à*.hex。 5. C51編譯(可選),建立好開發(fā)環(huán)境也是件十分重要工作,尤其是初學(xué)者
|