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

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

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

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

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