利用I2C總線實現ATmega88的在應用編程
2 PC端編程軟件設計
2.1 Intel Hex文件格式
ATmega88微控制器的目標程序代碼是采用IntelHex文件格式保存的。Intel Hex文件包含了目標代碼及相應的地址信息,這些實現在應用編程必需的信息由PC機端的上位機程序提取,并重新以頁面為單位裝幀后發送給Bootloader便可實現Flash的編程。
Intel Hex文件格式將二進制的目標機器代碼以ASCII碼的文本形式記錄,在文件中,每一行都是一個由十六進制機器碼或數據常量組成的Hex記錄。記錄格式如表1所列。本文引用地址:http://www.104case.com/article/159653.htm
每條Hex記錄都是以“:”開頭的,表1中所述的每個字節在記錄中是由兩個ASCII碼表示的,這樣的兩個十六進制數為一個字節;長度表示的是記錄中數據項的長度;地址為數據項在Flash中的起始地址;記錄的類型總共有6種,分別為數據記錄(00)、文件結束記錄(01)、擴展段地址記錄(01)、開始段地址記錄(03)、擴展線性地址記錄(04)、開始線性地址記錄(05)。數據是與記錄類型相對應的可變長度的數據組。校驗字節計算如下:首先,將每條記錄中除記錄頭和校驗外所有ASCII碼以2個ASCII碼轉換為1個字節的形式轉換為二進制。然后計算上述二進制字節的累加和,最后將累加和的低字節取反加1即為校驗字節。
ATmega88目標代碼的Hex文件由數據記錄和文件結束記錄兩種類型的記錄構成。上位機程序在解析過程中以行為單位讀取文件中的記錄,并根據上述記錄的格式進行解析,獲得Flash每一頁面的地址和相應的數據,遇到文件結束記錄后則停止解析。
2.2 I2C總線的PC機串口模擬
PC機端的編程軟件是通過I2C總線與ATmega88的Bootloader通信的,I2C總線在微控制器中是廣泛存在的,一般的微控制器都集成了I2C總線控制模塊。但PC機基本沒有I2C總線接口,需要專用的USB轉I2C總線協議芯片或其他接口的I2C總線模塊才能實現PC機與微控制器之間的I2C總線通信。這種方法成本高且實現麻煩,本文給出了一種利用PC機串口的握手信號模擬I2C總線的方法,相比專用協議轉換芯片或模塊的方法,這種方法更加簡單、高效。為了實現PC機RS232串口與微控制器I2C總線的電平匹配,設計了如圖2所示的接口電路。
圖2中,PC機串口的RTS輸出用來模擬I2C總線的SCI,時鐘信號;DTR輸出模擬I2C總線的SDA輸出數據信號;CTS輸入用于接收SDA輸入數據。PC機串口的RS232的高電平為15 V,低電平為-15 V;I2C總線的高電平為+5 V,低電平為0 V。因此,將PC串口的握手信號轉換成I2C總線信號時需要進行相應的電平轉換,PC機串口RS232電平與I2C總線FTL電平之間的轉換是由電阻R1、R2和5.1V穩壓管D1、D2實現的。
當RTS輸出+15 V高電平時,由于電阻和穩壓管的作用,SCL端電平被穩定在+5.1 V;而當RTS輸出-15 V低電平時,由于二極管D2導通,SCL電平被鉗位在-0.7 V。這樣,便實現了±15 V的RS232電平到0~5 V CMOS電平的轉換;電阻同時也起著限流作用。DTR輸出到SDA信號的電平轉換也是同樣的原理,而當SDA處于輸入狀態時,由于CMOS電平可以滿足RS232電平的輸入容限,因此無需進行電平轉換。
由于用PC機串口模擬I2C總線時僅僅用到了串口的握手信號,而沒有用到串口的波特率、數據長度、奇偶校驗等設置功能及輸入/輸出緩沖區的管理功能,本文直接采用Windows提供的API函數實現串口編程。串口的打開和關閉分別采用CreateFile函數和CloseHandle函數實現。RTS和DTR信號高低電平的控制由EscapeCommFunction函數將串口作為文件操作實現,調用該函數后程序要有一定時間的延時以實現通信波特率的控制。CTS的電平狀態則由GetCommModemStatus函數查詢得到。
在實現了RTS、DTR的電平控制與CTS電平狀態的獲取后,借鑒單片機用I/O口模擬I2C總線的方法,可以通過控制RTS、DTR電平與查詢CTS狀態來模擬I2C總線。在總線的時序處理與讀寫操作方面,兩種方法的唯一不同在于;用單片機I/O口模擬I2C總線時,I2C總線的SDA信號由輸出模式轉換到輸入模式是通過將單片機I/O口從輸出轉換為輸入實現的;由于串口握手信號無法實現雙向通信,因此,SDA信號的輸入功能是通過將DTR置高電平后讀取CTS狀態實現的,之所以將DTR置高電平是因為微控制器端的I2C總線的集電極開漏輸出結構需要DTR置高后才能輸出高電平,這類似于I2C總線上拉電阻的功能。
2.3 上位機程序設計
PC端上位機程序的主要功能為:解析應用程序的Hex格式文件,并從中提取Flash中每一頁面的地址與數據信息;設置串口號與所需升級的ATmega88的I2C總線地址,利用串口的握手信號模擬I2C總線通信,將Hex文件中的程序代碼準確無誤地發送給相應地址的Bootloader以實現應用程序的在線更新。
根據上述功能設計了如圖3所示的上位機程序界面,開發環境采用Borland C++builder 5.0,串口操作通過Windows API接口函數實現。
I2C總線通信的波特率設置為10 kbps,這是通過每次EscapeCommFunction函數調用后運行相應時間的延時函數實現的,這樣也可以使RTS和DTR信號在改變電平后有足夠的穩定時間。點擊“燒錄程序”按鈕后,上位機程序通過I2C總線向相應地址的ATmega88發送復位命令,然后循環發送Flash第一頁的數據幀;ATmega88接收到復位命令利用看門狗復位或人工上電復位后,跳轉運行Bootloader程序,開始接收數據幀并對相應的Flash頁面進行編程。Bootloader接收到一幀數據后將I2C總線拉低,使總線處于忙狀態,此時上位機一直查詢SDA狀態直到SDA恢復高電平后再操作I2C總線,這樣便實現了有效的通信流量控制。Bootloader對數據幀進行校驗后對flag進行標記,上位機發送完數據幀等I2C總線空閑后,讀取flag并根據其狀態重發數據幀或發送下一幀數據,這樣便實現了通信的差錯控制,保證寫入程序代碼的正確性。所有Flash頁面編程完畢后,上位機程序關閉串口,Bootloader在2 s內接收不到數據幀后,就能跳轉去運行升級后的應用程序。
結語
本文給出了一套完整的利用I2C總線實現ATmega88微控制器在應用編程的方法,包括Bootloader程序、I2C總線的PC串口模擬、上位機程序及相關的通信協議。該方法應用于四旋翼飛行器的無感無刷直流電機驅動板,成功通過I2C總線實現了4個ATmega88微控制器的在線調試與升級。該方法經過少量針對具體微控制器的代碼修改后也可用于其他AVR系列微控制器的在應用編程。
評論