關 閉

        新聞中心

        EEPW首頁 > 工控自動化 > 設計應用 > 利用I2C總線實現ATmega88的在應用編程

        利用I2C總線實現ATmega88的在應用編程

        作者: 時間:2012-12-05 來源:網絡 收藏

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

        本文引用地址:http://www.104case.com/article/159653.htm

        d.JPG


        每條Hex記錄都是以“:”開頭的,表1中所述的每個字節在記錄中是由兩個ASCII碼表示的,這樣的兩個十六進制數為一個字節;長度表示的是記錄中數據項的長度;地址為數據項在Flash中的起始地址;記錄的類型總共有6種,分別為數據記錄(00)、文件結束記錄(01)、擴展段地址記錄(01)、開始段地址記錄(03)、擴展線性地址記錄(04)、開始線性地址記錄(05)。數據是與記錄類型相對應的可變長度的數據組。校驗字節計算如下:首先,將每條記錄中除記錄頭和校驗外所有ASCII碼以2個ASCII碼轉換為1個字節的形式轉換為二進制。然后計算上述二進制字節的累加和,最后將累加和的低字節取反加1即為校驗字節。
        ATmega88目標代碼的Hex文件由數據記錄和文件結束記錄兩種類型的記錄構成。上位機程序在解析過程中以行為單位讀取文件中的記錄,并根據上述記錄的格式進行解析,獲得Flash每一頁面的地址和相應的數據,遇到文件結束記錄后則停止解析。
        2.2 的PC機串口模擬
        PC機端的編程軟件是通過與ATmega88的Bootloader通信的,在微控制器中是廣泛存在的,一般的微控制器都集成了I2C總線控制模塊。但PC機基本沒有I2C總線接口,需要專用的USB轉I2C總線協議芯片或其他接口的I2C總線模塊才能實現PC機與微控制器之間的I2C總線通信。這種方法成本高且實現麻煩,本文給出了一種利用PC機串口的握手信號模擬I2C總線的方法,相比專用協議轉換芯片或模塊的方法,這種方法更加簡單、高效。為了實現PC機RS232串口與微控制器I2C總線的電平匹配,設計了如圖2所示的接口電路。

        a.JPG


        圖2中,PC機串口的RTS輸出用來模擬I2C總線的SCI,時鐘信號;DTR輸出模擬I2C總線的SDA輸出數據信號;CTS輸入用于接收SDA輸入數據。PC機串口的RS232的高電平為15 V,低電平為-15 V;I2C總線的高電平為+5 V,低電平為0 V。因此,將的握手信號轉換成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接口函數實現。

        b.JPG


        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總線實現的方法,包括Bootloader程序、I2C總線的模擬、上位機程序及相關的通信協議。該方法應用于四旋翼飛行器的無感無刷直流電機驅動板,成功通過I2C總線實現了4個的在線調試與升級。該方法經過少量針對具體微控制器的代碼修改后也可用于其他AVR系列微控制器的


        上一頁 1 2 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 汉源县| 钟祥市| 荃湾区| 青川县| 绥阳县| 汕头市| 承德市| 手游| 江永县| 唐海县| 集贤县| 惠东县| 宁武县| 永昌县| 迭部县| 鄂托克前旗| 新闻| 衡水市| 本溪| 宽甸| 绵竹市| 太康县| 庄河市| 弥渡县| 彭州市| 临泉县| 土默特左旗| 舟曲县| 公安县| 阿坝| 灯塔市| 白银市| 桂林市| 嘉荫县| 上林县| 贺州市| 丹凤县| 麻阳| 同心县| 台安县| 张家界市|