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

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

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

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

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