關(guān) 閉

新聞中心

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

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

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

摘要:提出了一種利用實現(xiàn)的方法,詳述了Bootloader程序及與其相應(yīng)的上位機(jī)程序設(shè)計,以及利用PC機(jī)串口握手信號模擬的方法。實踐證明,該方法可成功實現(xiàn)上多個的在線調(diào)試與升級,也可用于其他AVR系列微控制器的
關(guān)鍵詞:I2C總線;;;

引言
隨著嵌入式系統(tǒng)技術(shù)的發(fā)展,電可擦除的Flash存儲器由于具有容量大、成本低、編程方便等優(yōu)點,在微控制器領(lǐng)域得到了廣泛的應(yīng)用Flash微控制器在正常運行前必須將Flash寫入用戶應(yīng)用程序,目前對微控制器的Flash程序存儲器進(jìn)行編程的方法主要有出廠固化、編程器編程、在系統(tǒng)編程(In System Programming,ISP)和在應(yīng)用編程(In Application programming,IAP)4種。
其中,出廠固化和編程器編程方法都要求微控制器在焊接前將程序?qū)懭耄@顯然不滿足開發(fā)階段的調(diào)試和日后升級的需要。目前比較普及的是在板可編程的ISP和IAP方法。ISP是通過微控制器的串行編程寫入應(yīng)用程序,需要少量的外部電路輔助實現(xiàn);IAP將Flash映射為用戶程序和Bootloader兩個存儲區(qū),Bootloader可通過系統(tǒng)已有的USB、串口、SPI、I2C總線等各種通信接口,對用戶程序進(jìn)行更新而不需要外部電路輔助,實現(xiàn)更加靈活,可方便地實現(xiàn)程序的在線及遠(yuǎn)程升級。
在利用ATmega88微控制器開發(fā)四旋翼飛行器的無感無刷直流電機(jī)驅(qū)動器時,由于定時器PWM輸出口與SPI接口存在引腳共用問題,用SPI口進(jìn)行ISP編程時會使MOS管誤導(dǎo)通而燒毀。由于驅(qū)動器中的4個ATmega88微控制器是通過I2C總線通信的,為了調(diào)試和升級方便,提出并實現(xiàn)了通過I2C總線對AVR微控制器進(jìn)行在應(yīng)用編程的方法,包括Bootloader程序、I2C總線的PC機(jī)串口模擬、上位機(jī)程序及相關(guān)的通信協(xié)議。實踐證明,該方法可成功實現(xiàn)I2C總線上多個ATmega88微控制器的在線升級。

1 ATmega88微控制器的Bootloader設(shè)計
ATmega88是一款基于AVR增強(qiáng)RISC體系結(jié)構(gòu)的CMOS低功耗8位微處理器,它通過執(zhí)行強(qiáng)大的單周期指令,達(dá)到接近1 MIPS/MHz的運算效率。ATmega88的Flash被分為128個大小為64字節(jié)的頁面,F(xiàn)lash的編程操作都是以頁面為單位進(jìn)行的。為了用戶程序的安全性,以及用戶的ISP和IAP編程需要,ATmega88的Flash存儲空間被分為引導(dǎo)程序區(qū)(Bootloader Section)和應(yīng)用程序區(qū)(Application Program Section)兩部分。
引導(dǎo)程序區(qū)為非同時讀寫區(qū),應(yīng)用程序區(qū)為同時讀寫區(qū)。在非同時讀寫區(qū)內(nèi)執(zhí)行的代碼可以對同時讀寫區(qū)內(nèi)的頁面進(jìn)行編程操作,根據(jù)這一機(jī)制我們可以編制Bootloader程序并將其存儲于引導(dǎo)程序區(qū)內(nèi),以實現(xiàn)應(yīng)用程序區(qū)代碼的在線與遠(yuǎn)程升級。
由于ATmega88分配給引導(dǎo)程序區(qū)的空間大小有限(最大2 KB),Bootloader程序一定要簡潔而高效,圖1給出了以I2C總線為通信接口的Bootloader程序流程圖。

本文引用地址:http://butianyuan.cn/article/159653.htm

c.JPG


為了能夠執(zhí)行Bootloader程序,ATmega88熔絲位中的BOOTRST應(yīng)設(shè)為零,這樣在系統(tǒng)上電或應(yīng)用程序接收到升級命令利用看門狗復(fù)位后,系統(tǒng)就能從引導(dǎo)程序區(qū)運行Bootloader程序。Bootloader程序中維持了一個溢出時間為2 s的定時器,該定時器利用TIM1以查詢的方式實現(xiàn)。沒有程序更新或程序更新完畢,程序在2 s內(nèi)沒有從I2C總線接收到數(shù)據(jù)幀時則利用(*((void(*)(void))(0x0000)))()函數(shù)跳轉(zhuǎn)到應(yīng)用程序區(qū)執(zhí)行應(yīng)用程序,在2s內(nèi)接收到數(shù)據(jù)幀后,則將定時器重置,以繼續(xù)接收數(shù)據(jù)幀更新應(yīng)用程序。
在Bootloader實現(xiàn)中,ATmega88的I2C總線工作在從模式,上位機(jī)的I2C總線工作在主模式。上位機(jī)發(fā)送的數(shù)據(jù)幀由2字節(jié)的Flash頁面地址、64字節(jié)的頁面數(shù)據(jù)、1字節(jié)的密碼和1字節(jié)的異或校驗和構(gòu)成。Bootloader接收到數(shù)據(jù)幀后會用數(shù)據(jù)長度、密碼、異或校驗和對數(shù)據(jù)幀進(jìn)行校驗,校驗正確的話則根據(jù)數(shù)據(jù)幀中Flash的頁面地址和數(shù)據(jù)相應(yīng)的Flash頁面進(jìn)行編程,并將flag置1;校驗錯誤的話,則丟棄數(shù)據(jù)幀等待重發(fā)的數(shù)據(jù)幀。
上位機(jī)在發(fā)送數(shù)據(jù)幀后讀取flag,并根據(jù)其狀態(tài)重發(fā)數(shù)據(jù)幀或發(fā)送下一頁面的數(shù)據(jù)幀。flag被讀取后Bootloader程序?qū)⑵淝辶?,這樣就形成了一個簡潔而有效的差錯控制機(jī)制。Flash中頁面的編程由頁擦除和頁編程兩個過程組成,頁擦除由AVR庫函數(shù)中的boot_page_erase(addr)函數(shù)實現(xiàn),addr為相應(yīng)頁面中的字節(jié)地址。
ATmega88的Flash是以頁為單位進(jìn)行擦除和寫入操作的,因此在進(jìn)行Flash頁面寫入前,要多次調(diào)用boot_page_fill(addr,data)函數(shù)將整頁的程序代碼寫入臨時緩沖區(qū),其中addr為指令所要寫入的字節(jié)地址,data為相應(yīng)的由2個字節(jié)構(gòu)成的16位程序指令。Flash頁面的寫入由boot_page_write(addr)函數(shù)實現(xiàn),addr為相應(yīng)頁面中的字節(jié)地址。
為了程序安全,F(xiàn)lash執(zhí)行頁擦除和編程操作時要求CPU處于等待狀態(tài),因此Flash的頁擦除和寫入函數(shù)執(zhí)行后都要調(diào)用boot_spm_busy_ wait()函數(shù)等待操作完成。此時,I2C總線也處于掛起狀態(tài),等所有操作完成后才能將總線釋放。上位機(jī)軟件在發(fā)送完數(shù)據(jù)幀后就一直監(jiān)聽總線狀態(tài),等總線釋放后再讀取flag狀態(tài),并決定是重發(fā)還是發(fā)送下一幀,這樣就實現(xiàn)了有效的通信流量控制。
整個Bootloader程序編譯完成后,大小為506字節(jié)。因此,熔絲位中的BOOTSZI和BOOTSZ0應(yīng)設(shè)為1和0,將引導(dǎo)程序區(qū)設(shè)置為地址0x1E00~0x1FFF、大小為512字節(jié)的區(qū)域。為了使Bootloader程序能正確寫入到該區(qū)域,程序編譯時要將程序起始地址設(shè)定在0x1E00,在WinAVR中可以通過在Makefile中添加“LDFLAGS+=-W1,——section—start=.text=0x1E00”實現(xiàn)。編譯完成的Bootloader可以在ATmega88確定PCB前,通過編程器或ISP寫入到Flash中。


上一頁 1 2 下一頁

評論


相關(guān)推薦

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

關(guān)閉