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