一. SST89C54/58性能簡介 二. SST89C54/58功能圖 兼容于INTEL公司的P87C54/58 , 擴展了IAP及4K E2PROM。
三. SST89C54/58程序空間 在動態(tài)修改Block0程序的問題上,應當確保將要加載的程序正確無誤,至少做到進入Block1塊入口程序的正確性,否則就只有借助編程器來燒錄自舉程序了。但這樣就失去IAP的意義,不可不察。 在本公司的LOG2001 USB DEMO KIT開發(fā)系統(tǒng)上,需要完全更新Block0塊的內(nèi)容,讓用戶真實擁有P87C54/58的全部功能。這樣,當用戶在開發(fā)USB時,就不需要用定位器或者匯編語言來混合編程。只需象平時那樣操作自己熟悉的C51開發(fā)環(huán)境。 LOG2001 USB DEMO KIT開發(fā)系統(tǒng)使用UART來傳送Firmware,其默認Buadrate為9600bps。除了確保自舉程序入口正常以外,串口的Buadrate在當次也要相符。改動Buadrate只有在裝載成功以后才有效。 一般來說,在完全掌握IAP及232口以前,而身邊又缺乏編程器的情況下,應謹慎對待與之相關(guān)的程序語句。在本公司的LOG2001 USB DEMO KIT開發(fā)系統(tǒng)上,還預備有最后一種自舉能力:硬件自舉!
四. IAP編程模式
SST89C54/58除了提供IAP編程模式以外,也可以借助外力(如編程器)強行將程序灌入,就象寫Flash ROM一樣。其實自舉程序就唯有通過這種方式載入。稱之為“外主編程模式”。 外主編程模式對于大多數(shù)程序員而言意義不大,有興趣的話參閱SST89C54/58的 Datesheet,下面介紹IAP模式。 IAP模式就是CPU一邊在某個Block 中運行,同時對另一個Block進行擦空,寫入,校驗等操作。注意,同一個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程序設計: 對照上述介紹,很容易編寫出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ù)只是應用系統(tǒng)中的一小部分,雖然嵌匯編或者純匯編更便于處理絕對地址,但卻不利于整個大系統(tǒng),有點丟西瓜的味道。 LOG2001 USB DEMO KIT開發(fā)系統(tǒng)的自舉程序使用純C語言編寫,而且也適用于低價位的SST89F54/58(和Philips的價位比大概二比一吧)。 如何拿IAP來當I2C使用,以便節(jié)省24LCxx或93Cxx呢。Sector的概念在這里尤為重要,因為改動數(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應設置在Block1的高端,這樣才不會和CODE競爭。
五. SST89C54/58發(fā)展系統(tǒng)
前面說過,SST89C54/58兼容于INTEL的P87C54/58,故而其編譯環(huán)境毋須作大的改動,如果不打算使用IAP功能,干脆一點也不改。 擴展IAP功能,對于匯編語言來說,只是在源文件開頭用EQU或DATA偽指令定義那六個新增加的SFR地址即可。而C語言也同樣在頭文件中增加定義的SFR地址。本公司網(wǎng)站(www.usb11.com)上有SST89C58.h供Download?蓪⑵渲苯犹娲<<reg51.h>>。 因為是IAP,仿真器不太重要,其實目前也沒有專門針對SST89C54/58的仿真器。即便有也沒市場,IAP應用最多的地方也就是當仿真器!
六. IAP應用場合
第一,IAP很方便,在網(wǎng)絡高速發(fā)展的今天,具備遠程升級軟件的產(chǎn)品無疑將受到歡迎。 第二,在編譯代碼的時候,對于稍稍多出來的一些程序代碼,可將其定位到Block1,從而避免購買更高容量的IC。 第三,在需要保存過程數(shù)據(jù)的系統(tǒng),可將原先的外部存儲器去掉,直接拿Block1當成外部E2PROM。此時,Block1等同于24LC32,而且操作速度要比24LC32快幾十上百倍。 第四,IAP在線軟件更新,沒有死角,包括自舉程序本身也可以重來,且毋須借助任何外力。仿真器的一大特點不就是編譯裝載嗎!沒錯,很多地方就拿它來當仿真器使用。 若要觀察程序變量,IAP的解決辦法是通過UART輸出調(diào)試信息。LOG2001 USB DEMO KIT就是采用這一調(diào)試技術(shù)。一點也不遜色于仿真器,特別在USB枚舉的過程中,仿真器特有的單步,中斷功能不可用,此時唯有UART可以信賴。詳情請見《USB枚舉步驟》。 IAP當仿真器的另一買點就是價廉物美,區(qū)區(qū)幾十元RMB的材料錢就可搞定。特別適合于單片機初學者。 傳統(tǒng)的仿真器在電氣性能方面,還無法做到和應用系統(tǒng)完全一致,這就是常見的“仿真通過,燒片不行”的毛病。IAP雖說是仿真,其實就是實際應用,不存在電氣性能或者物理接口方面的問題。 第五,產(chǎn)品小型化。一般地說,SMD只適合于大批量的生產(chǎn)廠家,因為SMD測試工具也是一筆不小的投資。如果商家在出售SST89C54/58以前,預先導入自舉程序,則用戶拿了SMD之后,可以先裝配,再燒錄,管它大封裝,小封裝還是微封裝呢! 關(guān)于LOG2001 USB DEMO KIT自舉程序的入口及入口參數(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é)省時間; 3. 輸入第一次“h”或者“b”之后,自舉程序?qū)⒎祷匾粋確認符0x20(空格),如果再次肯定要改寫Firmware,第二次輸入“h”或者“b”才啟動擦除和寫入。否則不改變原來的Firmware; 4. 輸入其它代碼,則系統(tǒng)提示錯誤后復位系統(tǒng); 5. 自舉程序入口地址:0xF8DD,不帶任何參數(shù),只需置好Buadrate; 下面給出入口事例函數(shù),可將其嵌入任何用戶系統(tǒng),實際上, 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 當然,在進入自舉程序以前,還要設置好Buadrate等等一系列參數(shù)。自舉程序?qū)⒉捎眠@些設置而不作任何修改。 下面是自舉程序: 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文件最大可達32K,裝載完成之后,采用20秒鐘倒記時,自動復位運行剛剛Download的程序,毋須任何機械動作。 由于某種原因而破壞入口函數(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ù),收發(fā)單個數(shù)據(jù)或者文件,接受單片機C語言的人機信息(printf,scanf, _getkey()等等); 3. IAP程序下載。IAP不須要任何機械動作,可以直接全面而徹底更新firmware,稍微操作不當就會影響到自舉程序。《USB集成化開發(fā)環(huán)境》有多重查驗措施,用戶只需全神關(guān)心自己的源文件就是了; 4. 自動疊加硬件自舉功能,不管用戶如何修改Firmware,即便死機,或者是由于前次IAP時中途停電而造成程序飛跑,仍然可通過該功能下載程序。具體是:P2.0=P2.1à“h”à“ h”à*.hex。 5. C51編譯(可選),建立好開發(fā)環(huán)境也是件十分重要工作,尤其是初學者
|