利用I2C總線實(shí)現(xiàn)ATmega88的在應(yīng)用編程
摘要:提出了一種利用I2C總線實(shí)現(xiàn)ATmega88微控制器在應(yīng)用編程的方法,詳述了Bootloader程序及與其相應(yīng)的上位機(jī)程序設(shè)計(jì),以及利用PC機(jī)串口握手信號(hào)模擬I2C總線的方法。實(shí)踐證明,該方法可成功實(shí)現(xiàn)I2C總線上多個(gè)ATmega88微控制器的在線調(diào)試與升級(jí),也可用于其他AVR系列微控制器的在應(yīng)用編程。
關(guān)鍵詞:I2C總線;ATmega88微控制器;在應(yīng)用編程;PC串口
引言
隨著嵌入式系統(tǒng)技術(shù)的發(fā)展,電可擦除的Flash存儲(chǔ)器由于具有容量大、成本低、編程方便等優(yōu)點(diǎn),在微控制器領(lǐng)域得到了廣泛的應(yīng)用Flash微控制器在正常運(yùn)行前必須將Flash寫入用戶應(yīng)用程序,目前對(duì)微控制器的Flash程序存儲(chǔ)器進(jìn)行編程的方法主要有出廠固化、編程器編程、在系統(tǒng)編程(In System Programming,ISP)和在應(yīng)用編程(In Application programming,IAP)4種。
其中,出廠固化和編程器編程方法都要求微控制器在焊接前將程序?qū)懭?,這顯然不滿足開發(fā)階段的調(diào)試和日后升級(jí)的需要。目前比較普及的是在板可編程的ISP和IAP方法。ISP是通過微控制器的串行編程寫入應(yīng)用程序,需要少量的外部電路輔助實(shí)現(xiàn);IAP將Flash映射為用戶程序和Bootloader兩個(gè)存儲(chǔ)區(qū),Bootloader可通過系統(tǒng)已有的USB、串口、SPI、I2C總線等各種通信接口,對(duì)用戶程序進(jìn)行更新而不需要外部電路輔助,實(shí)現(xiàn)更加靈活,可方便地實(shí)現(xiàn)程序的在線及遠(yuǎn)程升級(jí)。
在利用ATmega88微控制器開發(fā)四旋翼飛行器的無感無刷直流電機(jī)驅(qū)動(dòng)器時(shí),由于定時(shí)器PWM輸出口與SPI接口存在引腳共用問題,用SPI口進(jìn)行ISP編程時(shí)會(huì)使MOS管誤導(dǎo)通而燒毀。由于驅(qū)動(dòng)器中的4個(gè)ATmega88微控制器是通過I2C總線通信的,為了調(diào)試和升級(jí)方便,提出并實(shí)現(xiàn)了通過I2C總線對(duì)AVR微控制器進(jìn)行在應(yīng)用編程的方法,包括Bootloader程序、I2C總線的PC機(jī)串口模擬、上位機(jī)程序及相關(guān)的通信協(xié)議。實(shí)踐證明,該方法可成功實(shí)現(xiàn)I2C總線上多個(gè)ATmega88微控制器的在線升級(jí)。
1 ATmega88微控制器的Bootloader設(shè)計(jì)
ATmega88是一款基于AVR增強(qiáng)RISC體系結(jié)構(gòu)的CMOS低功耗8位微處理器,它通過執(zhí)行強(qiáng)大的單周期指令,達(dá)到接近1 MIPS/MHz的運(yùn)算效率。ATmega88的Flash被分為128個(gè)大小為64字節(jié)的頁面,F(xiàn)lash的編程操作都是以頁面為單位進(jìn)行的。為了用戶程序的安全性,以及用戶的ISP和IAP編程需要,ATmega88的Flash存儲(chǔ)空間被分為引導(dǎo)程序區(qū)(Bootloader Section)和應(yīng)用程序區(qū)(Application Program Section)兩部分。
引導(dǎo)程序區(qū)為非同時(shí)讀寫區(qū),應(yīng)用程序區(qū)為同時(shí)讀寫區(qū)。在非同時(shí)讀寫區(qū)內(nèi)執(zhí)行的代碼可以對(duì)同時(shí)讀寫區(qū)內(nèi)的頁面進(jìn)行編程操作,根據(jù)這一機(jī)制我們可以編制Bootloader程序并將其存儲(chǔ)于引導(dǎo)程序區(qū)內(nèi),以實(shí)現(xiàn)應(yīng)用程序區(qū)代碼的在線與遠(yuǎn)程升級(jí)。
由于ATmega88分配給引導(dǎo)程序區(qū)的空間大小有限(最大2 KB),Bootloader程序一定要簡(jiǎn)潔而高效,圖1給出了以I2C總線為通信接口的Bootloader程序流程圖。
為了能夠執(zhí)行Bootloader程序,ATmega88熔絲位中的BOOTRST應(yīng)設(shè)為零,這樣在系統(tǒng)上電或應(yīng)用程序接收到升級(jí)命令利用看門狗復(fù)位后,系統(tǒng)就能從引導(dǎo)程序區(qū)運(yùn)行Bootloader程序。Bootloader程序中維持了一個(gè)溢出時(shí)間為2 s的定時(shí)器,該定時(shí)器利用TIM1以查詢的方式實(shí)現(xiàn)。沒有程序更新或程序更新完畢,程序在2 s內(nèi)沒有從I2C總線接收到數(shù)據(jù)幀時(shí)則利用(*((void(*)(void))(0x0000)))()函數(shù)跳轉(zhuǎn)到應(yīng)用程序區(qū)執(zhí)行應(yīng)用程序,在2s內(nèi)接收到數(shù)據(jù)幀后,則將定時(shí)器重置,以繼續(xù)接收數(shù)據(jù)幀更新應(yīng)用程序。
在Bootloader實(shí)現(xiàn)中,ATmega88的I2C總線工作在從模式,上位機(jī)的I2C總線工作在主模式。上位機(jī)發(fā)送的數(shù)據(jù)幀由2字節(jié)的Flash頁面地址、64字節(jié)的頁面數(shù)據(jù)、1字節(jié)的密碼和1字節(jié)的異或校驗(yàn)和構(gòu)成。Bootloader接收到數(shù)據(jù)幀后會(huì)用數(shù)據(jù)長(zhǎng)度、密碼、異或校驗(yàn)和對(duì)數(shù)據(jù)幀進(jìn)行校驗(yàn),校驗(yàn)正確的話則根據(jù)數(shù)據(jù)幀中Flash的頁面地址和數(shù)據(jù)相應(yīng)的Flash頁面進(jìn)行編程,并將flag置1;校驗(yàn)錯(cuò)誤的話,則丟棄數(shù)據(jù)幀等待重發(fā)的數(shù)據(jù)幀。
上位機(jī)在發(fā)送數(shù)據(jù)幀后讀取flag,并根據(jù)其狀態(tài)重發(fā)數(shù)據(jù)幀或發(fā)送下一頁面的數(shù)據(jù)幀。flag被讀取后Bootloader程序?qū)⑵淝辶悖@樣就形成了一個(gè)簡(jiǎn)潔而有效的差錯(cuò)控制機(jī)制。Flash中頁面的編程由頁擦除和頁編程兩個(gè)過程組成,頁擦除由AVR庫函數(shù)中的boot_page_erase(addr)函數(shù)實(shí)現(xiàn),addr為相應(yīng)頁面中的字節(jié)地址。
ATmega88的Flash是以頁為單位進(jìn)行擦除和寫入操作的,因此在進(jìn)行Flash頁面寫入前,要多次調(diào)用boot_page_fill(addr,data)函數(shù)將整頁的程序代碼寫入臨時(shí)緩沖區(qū),其中addr為指令所要寫入的字節(jié)地址,data為相應(yīng)的由2個(gè)字節(jié)構(gòu)成的16位程序指令。Flash頁面的寫入由boot_page_write(addr)函數(shù)實(shí)現(xiàn),addr為相應(yīng)頁面中的字節(jié)地址。
為了程序安全,F(xiàn)lash執(zhí)行頁擦除和編程操作時(shí)要求CPU處于等待狀態(tài),因此Flash的頁擦除和寫入函數(shù)執(zhí)行后都要調(diào)用boot_spm_busy_ wait()函數(shù)等待操作完成。此時(shí),I2C總線也處于掛起狀態(tài),等所有操作完成后才能將總線釋放。上位機(jī)軟件在發(fā)送完數(shù)據(jù)幀后就一直監(jiān)聽總線狀態(tài),等總線釋放后再讀取flag狀態(tài),并決定是重發(fā)還是發(fā)送下一幀,這樣就實(shí)現(xiàn)了有效的通信流量控制。
整個(gè)Bootloader程序編譯完成后,大小為506字節(jié)。因此,熔絲位中的BOOTSZI和BOOTSZ0應(yīng)設(shè)為1和0,將引導(dǎo)程序區(qū)設(shè)置為地址0x1E00~0x1FFF、大小為512字節(jié)的區(qū)域。為了使Bootloader程序能正確寫入到該區(qū)域,程序編譯時(shí)要將程序起始地址設(shè)定在0x1E00,在WinAVR中可以通過在Makefile中添加“LDFLAGS+=-W1,——section—start=.text=0x1E00”實(shí)現(xiàn)。編譯完成的Bootloader可以在ATmega88確定PCB前,通過編程器或ISP寫入到Flash中。
評(píng)論