P89LPC922自編ISP代碼的研究
隨著微控制器應(yīng)用領(lǐng)域的不斷擴(kuò)展和深入,對其各方面性能的要求也逐漸提高。目前,越來越多種類的微控制器具有ISP(In System Programrning)即在系統(tǒng)編程功能。ISP編程時不需要將微控制器從目標(biāo)系統(tǒng)中移出,并且只需要有限的幾個引腳與外界相連,最大限度減少了額外的元件開銷和電路板面積,使微控制器產(chǎn)品的開發(fā)和具體應(yīng)用相當(dāng)方便。本文將分析P89LPC922預(yù)設(shè)ISP代碼的優(yōu)缺點(diǎn),進(jìn)一步結(jié)合應(yīng)用的實(shí)際情況,研究自編ISP代碼的方案,并給出具體的實(shí)現(xiàn)方法,對于由Ps9LPC922構(gòu)成的微控制器系統(tǒng)具有很強(qiáng)的實(shí)用價值。
1 P89LPC922預(yù)設(shè)ISP代碼功能分析
P89LPC922是一款由Philips公司生產(chǎn)的單片封裝的微控制器。它采用高性能的處理器結(jié)構(gòu),集成了包括ISP功能在內(nèi)的許多系統(tǒng)級功能,適合于許多要求高集成度、低成本的場合,可以滿足多方面的性能要求。
P69LPC922在出廠時,用戶代碼空間的高512字節(jié)包含了一個串行ISP子程序,允許器件在電路中通過串行口進(jìn)行編程。應(yīng)用ISP功能時,需要使用芯片的5個引腳(Vdd、Vss、TxD、RxD、RST),并且需要一個連接器與計(jì)算機(jī)串口相連。
為了使器件進(jìn)入ISP狀態(tài),必須在上電時給復(fù)位引腳3個準(zhǔn)確定時的低電平脈沖。脈沖數(shù)目只能是3個,少于或多于3個脈沖都會導(dǎo)致器件無法進(jìn)入ISP模式。另外一種進(jìn)入ISP模式的方法是利用串口間隔檢測功能使芯片復(fù)位,并使器件強(qiáng)制進(jìn)入ISP模式。但這種方法需要在用戶程序中進(jìn)行相應(yīng)的功能設(shè)置,而P89LPC922預(yù)設(shè)的ISP代碼并不支持這種方式。
進(jìn)入ISP模式后,雖然可以對接收到的特定字符進(jìn)行波特率的自動設(shè)定,但這個波特率的設(shè)定參數(shù)只有1個字節(jié),波特率的范圍受到一定的限制。另外,ISP串口工作在模式1狀態(tài),波特率設(shè)定后只接收Intel-Hex格式的記錄。
由上述分析可知,P89LPC922預(yù)設(shè)ISP功能雖然比較完善,可以滿足芯片開發(fā)階段的應(yīng)用,但如果產(chǎn)品定型后,特別是在將其做為聯(lián)網(wǎng)系統(tǒng)中下位機(jī)的實(shí)際現(xiàn)場,要進(jìn)行用戶程序代碼的更新下載將很不方便,有些功能甚至根本不能實(shí)現(xiàn)。這主要體現(xiàn)在以下幾個方面:
◇必須在上電時才能進(jìn)入ISP模式,不適合遠(yuǎn)程控制;
◇需要使用復(fù)位引腳,且相應(yīng)控制時序嚴(yán)格;
◇波特率范圍有一定限制;
◇無地址選項(xiàng),不支持系統(tǒng)聯(lián)網(wǎng);
◇只支持Intel-Hex格式,通信效率較低。
2 自編ISP代碼方案
P89LPC922具有非常完善的硬件系統(tǒng),給使用者編寫自己的ISP代碼提供了相當(dāng)大的自由度。下面以P89LPC922組成的485總線聯(lián)網(wǎng)系統(tǒng)為例,給出自編ISP代碼的功能要求:
◇硬件上不使用復(fù)位引腳,只用串口收發(fā)兩線連接即可;
◇不必上下電,隨時都可使器件進(jìn)入ISP模式;
◇自動判斷設(shè)定通信波特率,波特率應(yīng)有十種;
◇器件有地址,并且這個地址可隨時查詢、修改;
◇可實(shí)現(xiàn)用戶代碼的擦除、寫、校驗(yàn)、加密的功能。
其中,485總線聯(lián)網(wǎng)系統(tǒng)的上位機(jī)為計(jì)算機(jī),下位機(jī)為P89LPC922。
為了實(shí)現(xiàn)上述功能,必須解決以下幾個問題:
◇代碼存儲區(qū)如何分配;
◇芯片地址的規(guī)劃及處理;
◇進(jìn)ISP方法;
◇自動判定波特率方法;
◇串口工作方式及通信協(xié)議的確定;
◇ISP代碼加密及配置字確定。
2.1 代碼存儲區(qū)的分配
為了不影響用戶的程序代碼編寫,自編ISP代碼應(yīng)用于程序存儲區(qū)的高端。當(dāng)然,不同的自編ISP代碼需要不同大小的存儲空間。這里規(guī)定自編ISP代碼的地址空間為1COOH~lFFFH,共l KB,即第7扇區(qū)的全部。其中ISP入口地址為1FOOH。
2.2 芯片地址的規(guī)劃及處理
因P89LPC922的程序存儲空間可做為數(shù)據(jù)存儲器使用,那么即可將第6扇區(qū)的最后16字節(jié)倣為ISP與用戶程序共用的數(shù)據(jù)空間,地址為1BFOH~1BFFU。其中,地址lBFAH存放芯片地址,地址1BFBH存放芯片地址取反。例如,芯片地址為0lH,則(1BFAH)=01H,(1BFBH)=0FEH。地址取反后再存放是為了用戶程序讀出時判斷地址合法性使用,從而增加可靠性。
2.3 進(jìn)入ISP方法
因功能要求不能利用復(fù)位引腳方式進(jìn)入ISP模式,所以只能將引導(dǎo)狀態(tài)設(shè)為l,引導(dǎo)向量設(shè)為lFH。這樣,每次上電復(fù)位或其他復(fù)位時,程序固定從lF00H地址開始執(zhí)行,即復(fù)位后芯片首先進(jìn)入ISP模式,執(zhí)行ISP代碼。在執(zhí)行完ISP過程或在規(guī)定的時間(如2s)內(nèi)沒有進(jìn)行任何ISP操作,程序都將轉(zhuǎn)到地址O去執(zhí)行用戶程序代碼。在轉(zhuǎn)到地址O即執(zhí)行用戶程序代碼之前,將串口間隔檢測功能設(shè)置完畢,這樣,在執(zhí)行用戶程序代碼時即可通過串口間隔檢測功能,使芯片復(fù)位后進(jìn)入ISP模式。下面為串口間隔檢測功能設(shè)置的相關(guān)程序。
ANL SSTAT,#OFAH ;清除BR位,SSTAT.2
MOV BRGCON,#00H ;關(guān)波特串發(fā)生器
ORL AUXRl,#40H ;置位EBRR位,當(dāng)檢測到UART ;間隔信號時即進(jìn)行復(fù)位
MOV SCON,#50H ;設(shè)置串口為工作方式1(也可為;方式2或方式3),允許串口接收
MOV BRGRl,#05H ;設(shè)置串口波特率4800(也可為;其他值)
MOV BRGRO,#0fOH
MOV BRGCON,#03H ;打開并使用串口波特率發(fā)生器
由上述程序可知,ISP代碼并不影響用戶程序?qū)Υ诘氖褂?,用戶程序可以對串口工作方式及波特率進(jìn)行重新設(shè)定,同時用戶程序也不會影響利用串口喑隔檢測功能進(jìn)入ISP模式。實(shí)際使用中,上位機(jī)發(fā)送0信號0.5s,然后恢復(fù)為1信號,即可使串口檢測到間隔信號,從而使芯片復(fù)位后進(jìn)入ISP代碼程序。
2.4自動判定波特率
下位機(jī)(即P89LPC922)復(fù)位后,在規(guī)定的時間(如2s內(nèi),上位機(jī)按照用戶設(shè)定的波特串向下位機(jī)發(fā)送l字節(jié)址幀,此地址幀為85(十六進(jìn)制為55H)。下位機(jī)根據(jù)此地址幀判定設(shè)置自己的波特率。
首先,設(shè)置定時器Tl為模式l,設(shè)置16位計(jì)數(shù)器并將其清零。然后判斷接收引腳RXD是否為低電平,如為低電平繼續(xù)判斷等待RXD為高電平。實(shí)際這一過程為判斷上位機(jī)發(fā)送地址幀的起始位,同時也是一種防干擾的措施。接下來在RXD的下降沿啟動定時器Tl,在RXD的下一個下降沿關(guān)閉定時器T1。這時定時器Tl的16位計(jì)數(shù)器的值即為以當(dāng)前波特率發(fā)送2位數(shù)據(jù)的時間。固定時器的時鐘源為獨(dú)立的波特率發(fā)生器時鐘源的二分頻,因而此時定時器Tl的16位計(jì)數(shù)器的值即為波特率發(fā)生器速率寄存器BRGRl、BRGR0的值加上16。
當(dāng)然,根據(jù)這種方法所得到的16位計(jì)數(shù)器的值與理論上的波特率所確定的值存在微小偏差。為了使所設(shè)定的波特率與理論值完全相同,可以根據(jù)功能要求的十種波恃串計(jì)算出理論值,再與16位計(jì)數(shù)器的值進(jìn)行比較,然后將理論值寫入寄存器BRGR1及BRGR0,從而使設(shè)定的波特率百分之百準(zhǔn)確。
2.5 串口工作方式及通信協(xié)議的確定
對于聯(lián)網(wǎng)系統(tǒng),串口需要設(shè)為模式3狀態(tài)。上位機(jī)與下位機(jī)的每一次通信都按照“命令一響應(yīng)”方式進(jìn)行,上位機(jī)發(fā)出“命令”,下位機(jī)以“響應(yīng)”方式進(jìn)行應(yīng)答。
單個數(shù)據(jù)幀由11位組成,格式如下:
1個起始位+8個數(shù)據(jù)位+1個標(biāo)識位+1個停止位
其中,標(biāo)識位=l表示此幀為地址幀,標(biāo)識位=0表示此幀為數(shù)據(jù)幀。
通信開始時,下位機(jī)處于地址幀接收模式,上位機(jī)發(fā)送l字節(jié)地址幀做為點(diǎn)名包命令,點(diǎn)名地址幀范圍即下位機(jī)地址范圍為1~255;下位機(jī)接收到點(diǎn)名包后與自己的地址進(jìn)行比較,如相符,則把地址幀接收模式改為地址幀和數(shù)據(jù)幀都可以接收的模式,并將自己的地址做為1字節(jié)數(shù)據(jù)幀應(yīng)答發(fā)送給上位機(jī)。上位機(jī)收到后判斷與所發(fā)送的地址一致、上位機(jī)則開始以數(shù)據(jù)幀模式發(fā)送各種命令,與下位機(jī)進(jìn)行通信。下位機(jī)進(jìn)入ISP狀態(tài)后,如收到與自己地址不相符的地址幀,而且此地址不等于0,則轉(zhuǎn)到地址0去執(zhí)行用戶程序代碼。如果地址等于0,下位機(jī)則把地址幀接收模式改為地址幀和數(shù)據(jù)幀都可以接收的模式,并將自己的當(dāng)前地址做為l字節(jié)數(shù)據(jù)幀應(yīng)答發(fā)送給上位機(jī),從而完成下位機(jī)地址查詢功能。
注意,上位機(jī)發(fā)送O地址時只能連接一臺下位機(jī)。
根據(jù)功能要求,上位機(jī)發(fā)送給下位機(jī)的命令應(yīng)有地址修改、扇區(qū)擦除、寫用戶程序代碼、讀用戶程序代碼、扇區(qū)加密和程序下載完畢六種。其中,上位機(jī)執(zhí)行下載完畢命令,下位機(jī)返回下載完畢響應(yīng)后,下位機(jī)轉(zhuǎn)到地址0去執(zhí)行用戶程序代碼。
至于命令包格式,可由用戶自己編寫。這里給出一種典型的命令包格式:
包標(biāo)識+包地址+包命令+包長度+包數(shù)據(jù)+包校驗(yàn)。另外,ISP代碼文件推薦為二進(jìn)制格式文件,這樣可以減少相應(yīng)程序的復(fù)雜程度。
2.6 ISP代碼加密及配置字確定
ISP代碼編寫完畢后,需要由編程器寫入P89LPC922。在編程前需要進(jìn)行相關(guān)配置字的設(shè)定,包括用戶配置字節(jié),用戶保密字節(jié),引導(dǎo)向量及引導(dǎo)狀態(tài)。
其中,引導(dǎo)向量為1FH,引導(dǎo)狀態(tài)為01H。為了防止用戶擦除或改寫ISP代碼,用戶保密字節(jié)的7扇區(qū)應(yīng)為07H,即禁止對ISP代碼進(jìn)行擦除和讀寫操作.其他扇區(qū)的用戶保密字節(jié)可為OOH,即不設(shè)保密狀態(tài),而由用戶通過通信協(xié)議的扇區(qū)加密命令自由設(shè)定。用戶配置字節(jié)為0A3H,即看門狗復(fù)位功能使能,掉電檢測使能,復(fù)位引腳做為輸入引腳,使用內(nèi)部RC振蕩器。
綜上所述,完全可以利用P89LPC922完善的硬件資源,編寫出適合具體應(yīng)用環(huán)境的ISP代碼程序。這將給這款芯片的實(shí)際使用帶來極大的方便,尤其在需要更新下載用戶程序時更會顯得得心應(yīng)手。當(dāng)然,具體應(yīng)用時如果在上位機(jī)與下位機(jī)的通信過程中加入一些加密處理,那么將加強(qiáng)整個自編ISP代碼程序的可靠性、安全性,同時也使具體的應(yīng)用系統(tǒng)更加完善。
評論