<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

          EEPW首頁 > 工控自動化 > 設(shè)計(jì)應(yīng)用 > 利用I2C總線實(shí)現(xiàn)ATmega88的在應(yīng)用編程

          利用I2C總線實(shí)現(xiàn)ATmega88的在應(yīng)用編程

          作者: 時間:2012-12-05 來源:網(wǎng)絡(luò) 收藏

          2 PC端編程軟件設(shè)計(jì)
          2.1 Intel Hex文件格式
          的目標(biāo)程序代碼是采用IntelHex文件格式保存的。Intel Hex文件包含了目標(biāo)代碼及相應(yīng)的地址信息,這些實(shí)現(xiàn)必需的信息由PC機(jī)端的上位機(jī)程序提取,并重新以頁面為單位裝幀后發(fā)送給Bootloader便可實(shí)現(xiàn)Flash的編程。
          Intel Hex文件格式將二進(jìn)制的目標(biāo)機(jī)器代碼以ASCII碼的文本形式記錄,在文件中,每一行都是一個由十六進(jìn)制機(jī)器碼或數(shù)據(jù)常量組成的Hex記錄。記錄格式如表1所列。

          本文引用地址:http://www.ex-cimer.com/article/159653.htm

          d.JPG


          每條Hex記錄都是以“:”開頭的,表1中所述的每個字節(jié)在記錄中是由兩個ASCII碼表示的,這樣的兩個十六進(jìn)制數(shù)為一個字節(jié);長度表示的是記錄中數(shù)據(jù)項(xiàng)的長度;地址為數(shù)據(jù)項(xiàng)在Flash中的起始地址;記錄的類型總共有6種,分別為數(shù)據(jù)記錄(00)、文件結(jié)束記錄(01)、擴(kuò)展段地址記錄(01)、開始段地址記錄(03)、擴(kuò)展線性地址記錄(04)、開始線性地址記錄(05)。數(shù)據(jù)是與記錄類型相對應(yīng)的可變長度的數(shù)據(jù)組。校驗(yàn)字節(jié)計(jì)算如下:首先,將每條記錄中除記錄頭和校驗(yàn)外所有ASCII碼以2個ASCII碼轉(zhuǎn)換為1個字節(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 的PC機(jī)串口模擬
          PC機(jī)端的編程軟件是通過與ATmega88的Bootloader通信的,在微控制器中是廣泛存在的,一般的微控制器都集成了I2C總線控制模塊。但PC機(jī)基本沒有I2C總線接口,需要專用的USB轉(zhuǎn)I2C總線協(xié)議芯片或其他接口的I2C總線模塊才能實(shí)現(xiàn)PC機(jī)與微控制器之間的I2C總線通信。這種方法成本高且實(shí)現(xiàn)麻煩,本文給出了一種利用PC機(jī)串口的握手信號模擬I2C總線的方法,相比專用協(xié)議轉(zhuǎn)換芯片或模塊的方法,這種方法更加簡單、高效。為了實(shí)現(xiàn)PC機(jī)RS232串口與微控制器I2C總線的電平匹配,設(shè)計(jì)了如圖2所示的接口電路。

          a.JPG


          圖2中,PC機(jī)串口的RTS輸出用來模擬I2C總線的SCI,時鐘信號;DTR輸出模擬I2C總線的SDA輸出數(shù)據(jù)信號;CTS輸入用于接收SDA輸入數(shù)據(jù)。PC機(jī)串口的RS232的高電平為15 V,低電平為-15 V;I2C總線的高電平為+5 V,低電平為0 V。因此,將的握手信號轉(zhuǎn)換成I2C總線信號時需要進(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高電平時,由于電阻和穩(wěn)壓管的作用,SCL端電平被穩(wěn)定在+5.1 V;而當(dāng)RTS輸出-15 V低電平時,由于二極管D2導(dǎo)通,SCL電平被鉗位在-0.7 V。這樣,便實(shí)現(xiàn)了±15 V的RS232電平到0~5 V CMOS電平的轉(zhuǎn)換;電阻同時也起著限流作用。DTR輸出到SDA信號的電平轉(zhuǎn)換也是同樣的原理,而當(dāng)SDA處于輸入狀態(tài)時,由于CMOS電平可以滿足RS232電平的輸入容限,因此無需進(jìn)行電平轉(zhuǎn)換。
          由于用PC機(jī)串口模擬I2C總線時僅僅用到了串口的握手信號,而沒有用到串口的波特率、數(shù)據(jù)長度、奇偶校驗(yàn)等設(shè)置功能及輸入/輸出緩沖區(qū)的管理功能,本文直接采用Windows提供的API函數(shù)實(shí)現(xiàn)串口編程。串口的打開和關(guān)閉分別采用CreateFile函數(shù)和CloseHandle函數(shù)實(shí)現(xiàn)。RTS和DTR信號高低電平的控制由EscapeCommFunction函數(shù)將串口作為文件操作實(shí)現(xiàn),調(diào)用該函數(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總線。在總線的時序處理與讀寫操作方面,兩種方法的唯一不同在于;用單片機(jī)I/O口模擬I2C總線時,I2C總線的SDA信號由輸出模式轉(zhuǎn)換到輸入模式是通過將單片機(jī)I/O口從輸出轉(zhuǎn)換為輸入實(shí)現(xiàn)的;由于串口握手信號無法實(shí)現(xiàn)雙向通信,因此,SDA信號的輸入功能是通過將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è)置串口號與所需升級的ATmega88的I2C總線地址,利用串口的握手信號模擬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)。

          b.JPG


          I2C總線通信的波特率設(shè)置為10 kbps,這是通過每次EscapeCommFunction函數(shù)調(diào)用后運(yùn)行相應(yīng)時間的延時函數(shù)實(shí)現(xiàn)的,這樣也可以使RTS和DTR信號在改變電平后有足夠的穩(wěn)定時間。點(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ù)幀并對相應(yīng)的Flash頁面進(jìn)行編程。Bootloader接收到一幀數(shù)據(jù)后將I2C總線拉低,使總線處于忙狀態(tài),此時上位機(jī)一直查詢SDA狀態(tài)直到SDA恢復(fù)高電平后再操作I2C總線,這樣便實(shí)現(xiàn)了有效的通信流量控制。Bootloader對數(shù)據(jù)幀進(jìn)行校驗(yàn)后對flag進(jìn)行標(biāo)記,上位機(jī)發(fā)送完數(shù)據(jù)幀等I2C總線空閑后,讀取flag并根據(jù)其狀態(tài)重發(fā)數(shù)據(jù)幀或發(fā)送下一幀數(shù)據(jù),這樣便實(shí)現(xiàn)了通信的差錯控制,保證寫入程序代碼的正確性。所有Flash頁面編程完畢后,上位機(jī)程序關(guān)閉串口,Bootloader在2 s內(nèi)接收不到數(shù)據(jù)幀后,就能跳轉(zhuǎn)去運(yùn)行升級后的應(yīng)用程序。

          結(jié)語
          本文給出了一套完整的利用I2C總線實(shí)現(xiàn)的方法,包括Bootloader程序、I2C總線的模擬、上位機(jī)程序及相關(guān)的通信協(xié)議。該方法應(yīng)用于四旋翼飛行器的無感無刷直流電機(jī)驅(qū)動板,成功通過I2C總線實(shí)現(xiàn)了4個的在線調(diào)試與升級。該方法經(jīng)過少量針對具體微控制器的代碼修改后也可用于其他AVR系列微控制器的


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();