胡小玉,劉國輝
(武漢郵電科學(xué)研究院研究生院光纖通信技術(shù)和網(wǎng)絡(luò)國家重點實驗室,湖北 武漢 430074)
在MSAP(多業(yè)務(wù)接入平臺)系統(tǒng)中,要對位于基站中的設(shè)備進(jìn)行升級,就必須安排工程人員去現(xiàn)場,這種升級方式浪費了大量的人力和物力,增加了后期的設(shè)備維護(hù)成本。
單片機(In Application Programming,IAP)技術(shù)的出現(xiàn),有效地簡化了應(yīng)用程序的升級過程,降低了后期維護(hù)的成本。本文根據(jù)IAP原理,研究并給出了該方案在嵌入式微控制器SST89E516RD2中的詳細(xì)實現(xiàn)技術(shù)和程序流程。該實現(xiàn)技術(shù)在SSDX公司的MSAP系統(tǒng)嵌入式程序的修改和升級中得到了應(yīng)用和驗證,具有簡單、便捷、可靠、成本低等優(yōu)點。
SST89E516RD2芯片是基于51內(nèi)核的8位單片機,它包含1 kbyte的片內(nèi)RAM和72 kbyte的片內(nèi)ROM[1]。片內(nèi)ROM分為2個存儲塊,主存儲塊Block 0占用64 kbyte,次存儲塊Block 1占用8 kbyte。整個內(nèi)部程序空間被限制為64 kbyte,SFCF[1∶0]用于控制存儲塊的切換,如圖1 所示。
圖1 SST89E516RD2片內(nèi)ROM空間配置圖
SST89E516RD2允許駐留于某一個存儲塊中的IAP程序?qū)α硪粔K存儲塊進(jìn)行重編程操作,而絕不允許對同一個存儲塊中的任意地址進(jìn)行重編程操作。要實現(xiàn)在線升級的功能,必須用支持在線升級的IAP程序替換原來的ISP程序,用來引導(dǎo)在線升級程序。
升級系統(tǒng)主要組成部分是網(wǎng)管中心、傳輸網(wǎng)絡(luò)和MSAP設(shè)備。傳輸網(wǎng)絡(luò)可以是PSTN(公共電話交換網(wǎng))、互聯(lián)網(wǎng)等傳輸網(wǎng)絡(luò),用來承載中心機房到設(shè)備傳輸?shù)臄?shù)據(jù)。MSAP系統(tǒng)由網(wǎng)管設(shè)備和終端設(shè)備構(gòu)成,網(wǎng)管設(shè)備用于接收網(wǎng)管中心發(fā)送來的升級程序,終端設(shè)備即為要升級程序的對象,升級系統(tǒng)如圖2所示。
圖2 遠(yuǎn)程升級系統(tǒng)框圖
SST89E516RD2單片機自帶高速異步串行口,支持IAP下的并行操作,所以本系統(tǒng)硬件組成較簡單。除單片機之外,只需要擴展1片F(xiàn)lash用來存儲升級的程序文件,單片機其他外圍電路按照設(shè)備功能需求設(shè)計,單片機與片外Flash的連接方式如圖3所示。片外Flash采用SST25VF080B芯片[2],它的存儲空間為1 Mbyte,最小擦除塊的容量為4 kbyte。單片機與片外Flash采用SPI總線進(jìn)行通信,對片外Flash的讀寫、擦除等操作只需要使用相應(yīng)的命令字即可,SST25VF080B常用功能表如圖4所示。
圖3 連接圖
圖4 SST25VF080B常用功能表
片外Flash首地址00000H~01000H存儲升級保護(hù)標(biāo)志。地址01000H~5F000H分配給出廠時的配置和用戶最近一次的配置。隔離區(qū)用于保證存儲文件的獨立性。地址60000H~80000H分配給應(yīng)用程序文件存儲區(qū),其中程序文件A存儲出廠程序,程序文件B存儲接收到的升級程序[3-4]。根據(jù)以上分析,將外部Flash做如圖5所示的邏輯劃分。
圖5 SST25VF080B內(nèi)存分配
2.3.1 遠(yuǎn)程升級流程
PC網(wǎng)管軟件選擇一個子業(yè)務(wù)卡進(jìn)行遠(yuǎn)程升級,通過FTP協(xié)議發(fā)送升級數(shù)據(jù)包給網(wǎng)管盤,網(wǎng)管盤將接收到的升級數(shù)據(jù)包校驗OK后存儲至ARM的Flash中。網(wǎng)管盤發(fā)送復(fù)位指令將子業(yè)務(wù)卡的MCU復(fù)位,單片機復(fù)位啟動后進(jìn)入IAP引導(dǎo)程序模式,準(zhǔn)備進(jìn)行升級。
2.3.2 單片機IAP程序流程
1)單片機IAP程序主循環(huán)處理流程
單片機復(fù)位后,從Block 1中運行IAP程序。當(dāng)單片機運行IAP程序時,先判斷保護(hù)標(biāo)志是否有效,如果該標(biāo)志有效,表示上一次升級過程中遇到故障(斷電等異常情況),則單片機自動將程序恢復(fù)至出廠程序。否則單片機主程序待機15 s,等待單片機處理串口中斷接收到的數(shù)據(jù),判斷是否有升級任務(wù)。如果有升級任務(wù),則將單片機升級標(biāo)志置為有效,如果該標(biāo)志有效,則單片機IAP主程序待機15 min,等待在線升級完成。升級完成后,開啟看門狗等待單片機復(fù)位。單片機IAP程序主循環(huán)運行如圖6所示。
2)單片機IAP程序中斷處理流程
圖6 單片機IAP程序流程圖
網(wǎng)管盤收到文件傳輸命令后,發(fā)送一幀文件傳輸開始的指令,將待升級的應(yīng)用程序包分解成適合本系統(tǒng)私有協(xié)議傳輸?shù)男《?,按照文件塊序號逐段發(fā)送給子業(yè)務(wù)卡,子業(yè)務(wù)卡收到數(shù)據(jù)包,CRC校驗無誤后將單片機升級標(biāo)志置為有效,并開始擦除片外Flash文件B部分的塊。程序文件傳輸中,MCU開始接收數(shù)據(jù),此時單片機將接收到的程序文件寫入片外Flash從文件B部分的塊;程序傳輸結(jié)束時,MCU將升級文件的文件名、文件長度和文件CRC16的校驗和寫入片外Flash從7FFFFH~80000H部分的扇區(qū),共4 kbyte,單片機對接收到的文件整體校驗,發(fā)送應(yīng)答幀通知網(wǎng)管盤校驗結(jié)果。
網(wǎng)管盤收到執(zhí)行升級命令后,通知子業(yè)務(wù)卡準(zhǔn)備執(zhí)行升級。單片機會先運行Block 1的IAP程序,校驗升級的應(yīng)用程序文件,如果校驗通過,將保護(hù)標(biāo)志置為有效。然后開始擦除單片機片內(nèi)ROM整個Block 0的塊,當(dāng)SFST寄存器的標(biāo)志位置位后,表示擦除完成。接著,單片機將片外Flash存儲區(qū)B中的升級文件讀出并寫入到單片機片內(nèi)ROM的Block 0塊中,開啟看門狗,等待單片機復(fù)位,整個升級程序完成。
當(dāng)開門狗溢出后,單片機復(fù)位令升級標(biāo)志也復(fù)位,單片機程序跳轉(zhuǎn)到Block 0起始位置運行。單片機程序正常運行后將保護(hù)標(biāo)志復(fù)位。執(zhí)行程序升級模塊如圖7所示。
圖7 單片機IAP程序中斷處理流程
2.3.3 網(wǎng)管盤與子業(yè)務(wù)卡的通信設(shè)計
網(wǎng)管盤與子業(yè)務(wù)卡之間的SPI通信采用SSDX私有協(xié)議,該協(xié)議具有一定的糾錯機制和異常處理機制。在網(wǎng)管盤ARM與子業(yè)務(wù)卡MCU通信中采用發(fā)送一幀數(shù)據(jù),確認(rèn)一幀數(shù)據(jù),收到錯幀,請求重發(fā)的通信形式[5]。SSDX私有協(xié)議設(shè)計的SPI通信幀最大幀長不超過500 byte,接收程序可以通過文件塊序號n在終端進(jìn)行文件整理組合,單片機發(fā)送應(yīng)答幀給網(wǎng)管盤通知文件塊n接收OK,否則網(wǎng)管盤重傳文件塊5次,如果5次以內(nèi)傳送失敗,則標(biāo)志此次升級失敗。SSDX私有協(xié)議數(shù)據(jù)幀格式如圖8所示。
圖8 SSDX私有協(xié)議幀格式
幀頭:表示數(shù)據(jù)包的開始,固定為0xFE,0xFA 2個字節(jié)。
子卡地址:表示子卡在1個MSAP網(wǎng)元中的位置。
命令字:文件傳輸命令還是執(zhí)行升級命令。
指令值:命令字的子命令。如果命令字是文件傳輸命令,則指令值有傳輸開始、傳輸中、傳輸結(jié)束3個指令;如果命令字是升級命令,則指令值就是執(zhí)行在線升級指令。
文件塊序號:表示升級程序所分割的報文所處的序號。
文件塊內(nèi)容:程序內(nèi)容字節(jié)。
CRC16校驗和:一幀數(shù)據(jù)的校驗和,采用CRC16校驗。
2.3.4 單片機IAP主要函數(shù)代碼
單片機在進(jìn)行升級過程中,對片內(nèi)ROM主要進(jìn)行塊擦除和字節(jié)編程操作,該操作的程序代碼如下所示:
//單片機片內(nèi)ROM塊擦除函數(shù)
Void block Erase(void)
{
SFCF|=0x40; //IAP功能使能
SFAH=0x00; //擦除的塊為Block 0
SFDT=0x55;
SFCM=0x0D;
SFCF=SFCF& ~0x40;//IAP功能禁止
}
//單片機片內(nèi)ROM字節(jié)編程函數(shù)
Void SST_byte_program(unsigned short dataAddr,
unsigned char dataByte)
{
SFCF=SFCF|0x40;//IAP功能使能
SFAH=dataAddr> >8;
SFAL=dataAddr;//裝入地址SFDT=dataByte;//填入數(shù)據(jù)
SFCM=0x0D; //填入字節(jié)編程命令
while(SFST&0x40){;}
SFCF=SFCF& ~0x40;//IAP功能禁止
return;
}
單片機對片外Flash的操作主要用到擦除片外Flash塊函數(shù)和讀片外Flash數(shù)據(jù)函數(shù)[6],通過單片機與片外Flash的SPI讀指令(spi_SendByte)和寫指令(spi_Read-Byte)向SST25VF080B發(fā)送相應(yīng)的命令字,各常用功能命令字如圖3所示。它們的程序源代碼如下所示:
//擦除以Dst為起始地址大小為64 k的塊
void FlashBlock_Erase(unsigned long Dst)
{
spi_SendByte(0xD8);//一次擦除64 k的塊
spi_SendByte(((Dst&0xFFFFFF)>>16));
spi_SendByte(((Dst&0xFFFF)>>8));
spi_SendByte(Dst&0xFF);
Wait_Busy();
}
//讀取地址Dst的數(shù)據(jù)
unsigned char FlashRead(unsigned long Dst)
{
spi_SendByte(0x03);//讀命令
spi_SendByte(((Dst&0xFFFFFF)>>16));
spi_SendByte(((Dst&0xFFFF)>>8));
spi_SendByte(Dst&0xFF);
return(Spi_ReadByte());//返回值
}
按照上述的升級系統(tǒng)搭建好測試環(huán)境后,將MCU的IAP程序下載到Block 1中,通過PC網(wǎng)管對終端設(shè)備進(jìn)行遠(yuǎn)程升級。測試結(jié)果證明子業(yè)務(wù)卡的軟件版本能夠成功地進(jìn)行更新,如圖9所示。在遇到異常情況時,如升級的過程中出現(xiàn)斷電故障,子業(yè)務(wù)卡能自動恢復(fù)到出廠程序運行,等待再次響應(yīng)網(wǎng)管中心下達(dá)升級命令,直至升級成功。
圖9 升級前后版本對比圖(截圖)
本方案以SST89E516RD2芯片的IAP功能為基礎(chǔ),利用擴展的Flash存儲分區(qū),提供了一種MSAP系統(tǒng)遠(yuǎn)程在線升級的方法,有效地降低了后期設(shè)備的維護(hù)成本。本方案在SSDX的MSAP系統(tǒng)中已得到廣泛應(yīng)用,在實際應(yīng)用中得到了用戶很高的評價,大大增加了產(chǎn)品的競爭力。
[1]SST89E516RD2[EB/OL].[2012-05-25].http://wenku.baidu.com/view/d542fc0cf12d 2af90242e6ba.html.
[2]SST25VF080B[EB/OL].[2012-05-25].http://wenku.baidu.com/view/e5b7a579168884868762d6aa.html.
[3]趙炯,賈培源,李中山,等.嵌入式設(shè)備遠(yuǎn)程在線升級技術(shù)[J].計算機工程,2010,36(12):262-264.
[4]曾浩,呂華,王銘偉.IPTV機頂盒升級方案的設(shè)計與實現(xiàn)[J].電視技術(shù),2010,34(5):54-56.
[5]鄧中亮,孫靜.嵌入式設(shè)備在線系統(tǒng)升級的設(shè)計與實現(xiàn)[J].計算機工程與設(shè)計,2009,30(13):3085-3087.
[6]邵貝貝.單片機嵌入式應(yīng)用的在線開發(fā)方法[M].北京:機械工業(yè)出版社,2004.