朱偉紅,孫師賢,馬英文,賈建波,韓耀圖
(1.中海油田服務(wù)股份有限公司,北京 101149;2.中海石油(中國)有限公司天津分公司,天津 300452)
定向鉆井是使井身沿著預(yù)先設(shè)定的方向和軌跡鉆達(dá)目的層的鉆井技術(shù)[1],而隨鉆測(cè)井系統(tǒng)是實(shí)現(xiàn)定向鉆井的關(guān)鍵技術(shù)[2]。中海油研發(fā)的隨鉆測(cè)井系統(tǒng)采用ADuC845型單片機(jī)采集井下的相關(guān)參數(shù)。
在實(shí)際使用中,為了完善設(shè)備功能,滿足用戶要求,需要不定期地對(duì)ADuC845程序進(jìn)行更新。目前,對(duì)單片機(jī)程序進(jìn)行更新,一般需要攜帶計(jì)算機(jī)到現(xiàn)場(chǎng)利用IAP軟件完成,并需要拆開設(shè)備箱體,露出電路板才能進(jìn)行操作[3]。這樣不僅操作繁瑣,而且需要將隨鉆測(cè)井系統(tǒng)從井下取出,影響生產(chǎn)。為此,必須設(shè)計(jì)一種新方法,能在不攜帶笨重的計(jì)算機(jī)和不影響生產(chǎn)的情況下對(duì)ADuC845的程序進(jìn)行更新。本文設(shè)計(jì)了一種基于485總線的便攜式單片機(jī)程序下載器,以解決上述問題。
基于485總線的便攜式單片機(jī)程序下載器的組成如圖1所示,主要包括電源模塊、U盤、控制模塊、485總線以及電池等部分。

圖1 裝置組成框圖
為了滿足便攜式的要求,該裝置由鋰電池供電,通過電源模塊將鋰電池輸出的12 V電壓轉(zhuǎn)換為5 V電壓向控制模塊供電。利用計(jì)算機(jī)將ADuC845程序轉(zhuǎn)換為標(biāo)準(zhǔn)的Intel HEX文件保存在U盤中。控制模塊的485接口直接與隨鉆測(cè)井系統(tǒng)的485接口相連。該485接口在隨鉆測(cè)井系統(tǒng)中通過485/UART轉(zhuǎn)換模塊與ADuC845單片機(jī)相連。工作時(shí),將U盤插入控制模塊的USB口,控制模塊讀取U盤中保存的HEX文件,按照規(guī)定的時(shí)序通過485總線傳輸給ADuC845單片機(jī)。
該裝置的硬件電路包括電源模塊和控制模塊兩部分。
為了滿足控制模塊供電和裝置長時(shí)間待機(jī)的要求,該裝置采用容量為10 Ah的12 V鋰電池供電。由于控制模塊需要5 V供電,因此選用電源模塊BSD12-12S05進(jìn)行電壓轉(zhuǎn)換。該模塊具有寬電壓輸入特性,可在9~18 V輸入下正常工作,輸出電壓為5 V,功率為12 W,轉(zhuǎn)換效率為80%,輸出電壓精度達(dá)到±1%,紋波小于50 mV,并具有短路保護(hù)功能[4]。電路如圖2所示。

圖2 電源電路原理圖
為了縮短開發(fā)時(shí)間,提高工作可靠性,本系統(tǒng)直接選用英創(chuàng)信息技術(shù)有限公司生產(chǎn)的EM9170嵌入式開發(fā)板。EM9170是一款面向工業(yè)自動(dòng)化領(lǐng)域的高性價(jià)比嵌入式主板,以FreeScale的iMX257為硬件核心,并帶有多種標(biāo)準(zhǔn)接口,如以太網(wǎng)接口、CAN總線接口、485接口、USB高速主控接口USBOTG接口、及GPIO[5]。該開發(fā)板的USB接口可直接連接U盤,485接口與隨鉆測(cè)井系統(tǒng)的485接口相連。此外,該開發(fā)板的GPIO0和GPIO1分別連接該裝置的啟動(dòng)按鍵與停止按鍵;GPIO2、GPIO3、GPIO4分別連接該裝置的就緒指示燈、傳輸指示燈和故障指示燈。
正常情況下,利用計(jì)算機(jī)通過Analog Devices公司開發(fā)的WSD(Windows Serial Downloader)軟件將編寫好的HEX文件寫入ADuC845單片機(jī)[6]。時(shí)序和總線指令由WSD軟件保證,用戶無須關(guān)心。但是,本裝置沒有使用計(jì)算機(jī),不能用WSD軟件,因此下載程序的時(shí)序和總線指令必須由控制模塊通過軟件編程實(shí)現(xiàn)。下面介紹ADuC845型單片機(jī)的總線指令系統(tǒng)。
3.1.1 總線指令的格式
為啟動(dòng)ADuC845單片機(jī)的某項(xiàng)特定操作,由控制模塊向單片機(jī)發(fā)出一條總線指令,即一個(gè)幀序列。一條總線指令可以由一個(gè)命令幀(CF)組成,也可以由一個(gè)命令幀和多個(gè)數(shù)據(jù)幀(DF)組成,但總是以一個(gè)命令幀為起始幀??偩€指令格式如圖3所示。

圖3 總線指令格式
總線指令系統(tǒng)中,CF為十六進(jìn)制數(shù)據(jù),一個(gè)字節(jié);DF為十六進(jìn)制數(shù),兩個(gè)字節(jié)。
總線應(yīng)答指令也有兩種基本組成,分別為單DF形式和多DF形式,與總線指令類似。
3.1.2 主要總線指令
(1)切換進(jìn)入Bootloader指令。單片機(jī)中的Bootloader程序通常含有通信端口初始化程序、監(jiān)控程序、更新服務(wù)程序和跳轉(zhuǎn)指令,用來判斷進(jìn)行程序升級(jí)服務(wù)還是將控制權(quán)交給正常功能程序[7],因此ADuC845必須具有切換進(jìn)入Bootloader的指令。
SET_BOOTLOADER指令負(fù)責(zé)控制程序由User Code切換到Bootloader程序,進(jìn)入程序在線更新狀態(tài)。該指令應(yīng)用在User Code狀態(tài)。
PUSHTOBOOTLOADER指令控制程序在不能正常由UserApp切換到Bootloader程序時(shí)使用。此指令需要在目標(biāo)單片機(jī)啟動(dòng)后3 s內(nèi)發(fā)送,確認(rèn)回傳數(shù)據(jù)正確后,會(huì)強(qiáng)制目標(biāo)單片機(jī)進(jìn)入Bootloading狀態(tài)。
(2)切換進(jìn)入U(xiǎn)ser Code指令。固件寫入正確執(zhí)行命令后,發(fā)送切換進(jìn)入U(xiǎn)ser Code命令SWITCHTOUSERAPP,控制程序從UserApp程序入口,即0x0000開始執(zhí)行。
(3)握手命令。SHAKE_HAND命令為一般測(cè)試命令,通過該命令確定是否能夠與Bootloading下的單片機(jī)進(jìn)行通信。該指令應(yīng)用在Bootloading狀態(tài)。
(4)擦除命令。系統(tǒng)進(jìn)入Bootloader模式,當(dāng)正確接收擦除指令即ERASE指令后,將擦除ADuC845單片機(jī)的56 kB用戶應(yīng)用程序區(qū),擦除完成后發(fā)出響應(yīng)。該指令應(yīng)用在Bootloading狀態(tài)。
(5)固件寫入指令。WFM固件寫入指令需要將標(biāo)準(zhǔn)的Intel HEX文件轉(zhuǎn)換成協(xié)議格式發(fā)送。每條命令一次發(fā)送256 B數(shù)據(jù)。該指令用在Bootloading狀態(tài)。
(6)通信測(cè)試指令。RST_ECHO通信測(cè)試指令,用于測(cè)試目標(biāo)單片機(jī)在UserApp狀態(tài)下的通信質(zhì)量。發(fā)送此指令,回復(fù)正確,表明當(dāng)前單片機(jī)工作于UserApp狀態(tài)。
3.1.3 Intel HEX文件格式簡(jiǎn)介
Intel HEX文件是記錄文本行的ASCII文本文件。在Intel HEX文件中,每一行是一條HEX記錄,即由十六進(jìn)制數(shù)組成的機(jī)器碼或者靜態(tài)數(shù)據(jù)[8]。一個(gè)Intel HEX文件可以包含多條十六進(jìn)制記錄,每條記錄有5個(gè)區(qū),如下所示:
:AABBBBCC[DD…DD]EE
每個(gè)字符為一個(gè)十六進(jìn)制數(shù)字,兩個(gè)字符是一個(gè)字節(jié),每組字符是一個(gè)區(qū),每個(gè)區(qū)至少由2個(gè)十六進(jìn)制數(shù)組成,各區(qū)的含義如下:
:表示該行記錄的開始;AA表示本行包含的數(shù)據(jù)長度,即DD字節(jié)的個(gè)數(shù);BBBB表示數(shù)據(jù)存儲(chǔ)的起始地址;CC表示數(shù)據(jù)的類型,00表示數(shù)據(jù)記錄,01表示文件結(jié)束記錄,01表示擴(kuò)展段地址記錄,04表示擴(kuò)展線性地址記錄;DD表示數(shù)據(jù),每?jī)蓚€(gè)字符表示一個(gè)字節(jié)數(shù)據(jù),字節(jié)數(shù)量與AA一致;EE表示校驗(yàn)碼。
利用計(jì)算機(jī)的編程軟件生成HEX文件存入U(xiǎn)盤,將U盤插入控制模塊的USB口,控制模塊讀取HEX文件,再按照下列步驟對(duì)ADuC845進(jìn)行程序更新。
第一,單片機(jī)加電后,首先判斷單片機(jī)是否進(jìn)入U(xiǎn)serApp狀態(tài),即發(fā)送RST_ECHO通信測(cè)試指令,判斷單片機(jī)是否回復(fù)正確。如果回復(fù)正確,表明單片機(jī)處于UserApp狀態(tài),再向單片機(jī)發(fā)送SET_BOOTLOADER指令,設(shè)置單片機(jī)處于Bootloading狀態(tài);如果回復(fù)錯(cuò)誤,則單片機(jī)不處于UserApp狀態(tài),再重啟單片機(jī),并在3 s內(nèi)發(fā)送強(qiáng)制切換到Bootloading狀態(tài)的指令,即PUSHTOBOOTLOADER指令。
第二,向單片機(jī)發(fā)送SHAKE_HAND握手指令,判斷能否與Bootloading狀態(tài)下的單片機(jī)通信,如果回復(fù)正確,執(zhí)行下一步;如果回復(fù)錯(cuò)誤,再次發(fā)送握手指令,當(dāng)次數(shù)超過3次,顯示通信錯(cuò)誤標(biāo)志,并重新利用PUSHTOBOOTLOADER指令將單片機(jī)設(shè)置為Bootloading狀態(tài)。
第三,向單片機(jī)發(fā)送ERASE擦除指令,擦除56 kB的用戶應(yīng)用程序區(qū),如果回復(fù)正確,執(zhí)行下一步;如果回復(fù)錯(cuò)誤,再次執(zhí)行ERASE指令,直至回復(fù)正確為止。
第四,向單片機(jī)發(fā)送WFM固件寫入指令。將HEX文件轉(zhuǎn)換為協(xié)議格式發(fā)送,每次發(fā)送256 B數(shù)據(jù),如果在寫入數(shù)據(jù)過程中,回復(fù)錯(cuò)誤,重新執(zhí)行ERASE和WFM指令。如果回復(fù)錯(cuò)誤次數(shù)超過2次,顯示下載錯(cuò)誤標(biāo)志,終止執(zhí)行。多次執(zhí)行WFM指令,直至程序下載完成為止,再執(zhí)行下一步。
第五,向單片機(jī)發(fā)送SWITCHTOUSERAPP指令,將單片機(jī)切換到User Code狀態(tài),如果回復(fù)正確,程序下載結(jié)束;如果回復(fù)錯(cuò)誤,再次執(zhí)行SWITCHTOUSERAPP指令,直至回復(fù)正確為止。
程序下載流程圖如圖4所示。

圖4 程序下載流程圖
基于485總線的便攜式單片機(jī)程序下載器具有結(jié)構(gòu)簡(jiǎn)單、操作方便、待機(jī)時(shí)間長以及可對(duì)單片機(jī)程序進(jìn)行遠(yuǎn)程更新等優(yōu)點(diǎn)。目前,該裝置已經(jīng)應(yīng)用于中海油服的隨鉆測(cè)井系統(tǒng),并取得了良好的應(yīng)用效果。