摘 要: 介紹了I2C總線的結(jié)構(gòu)、工作原理和數(shù)據(jù)傳輸方式,詳細(xì)討論了基于I2C總線的大幅面高速彩色噴繪機(jī)軟硬件設(shè)計。經(jīng)研究測試,系統(tǒng)能夠噴繪出高精度彩色圖像,達(dá)到了預(yù)期要求。
關(guān)鍵詞: I2C總線;噴繪機(jī);ATmega8;EEPROM;SAA1064
隨著大型噴繪機(jī)應(yīng)用領(lǐng)域的拓展與普及,人們對噴繪產(chǎn)品的質(zhì)量要求也越來越高。為了提高噴繪產(chǎn)品的清晰度,本系統(tǒng)采用分組噴頭,每組6色或者8色,共3組~6組可選??紤]到通信效率和電路的簡化設(shè)計,采用簡單實(shí)用的I2C總線實(shí)現(xiàn)主控制系統(tǒng)與多噴頭之間的數(shù)據(jù)傳輸,同時基于I2C總線與SAA1064驅(qū)動芯片擴(kuò)展了4個數(shù)碼管用于顯示和校驗(yàn)。
1 I2C總線的概念
I2C總線是Philips公司推出的芯片間串行數(shù)據(jù)傳輸總線,軟硬件協(xié)議十分巧妙,用兩根線(SDA、SCL)即可實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳輸,能夠十分方便地構(gòu)成單主機(jī)系統(tǒng)或者多主機(jī)系統(tǒng)[1]。任何一個具有I2C接口的器件,不論其功能差別有多大,都能通過串行數(shù)據(jù)線SDA和串行時鐘線SCL連接到I2C總線上[2]。從而簡化了系統(tǒng)設(shè)計的復(fù)雜性,提高了系統(tǒng)的抗干擾能力,給用戶設(shè)計應(yīng)用系統(tǒng)帶來了極大地方便。
在I2C總線上的每一個器件都有一個唯一的識別地址,器件之間的通信采用主從方式,主機(jī)與從機(jī)之間的通信是相互的,但主從關(guān)系并不持久,由數(shù)據(jù)傳輸?shù)姆较驔Q定。發(fā)送并控制數(shù)據(jù)傳輸?shù)钠骷Q為主機(jī),此時在I2C總線上任何被尋址的器件都稱為從機(jī)。一般主機(jī)負(fù)責(zé)起始和終止信號的產(chǎn)生,當(dāng)主機(jī)發(fā)送了起始信號(SCL為高電平時,SDA產(chǎn)生一個下降沿)后,再發(fā)送從機(jī)地址來選擇需要通信的器件。從機(jī)地址有7位和10位兩種,本文僅介紹7位地址的尋址方式。尋址信號由一個字節(jié)組成,高7位為器件的地址,最低位為方向位,用來表明數(shù)據(jù)傳輸?shù)姆较?。?dāng)方向位為“0”時表明主機(jī)對從機(jī)的寫操作;為“1”時表明主機(jī)對從機(jī)的讀操作。
每一個從機(jī)在收到尋址信號后都與自己的器件地址進(jìn)行匹配,匹配成功后要向主機(jī)發(fā)送一個應(yīng)答信號(ACK),主機(jī)收到應(yīng)答信號后將按照一定的時序開始與從機(jī)通信。若從機(jī)不能響應(yīng)尋址或需要終止傳輸過程,從機(jī)必須在SDA上輸出高電平。主機(jī)檢測到異常情況后產(chǎn)生一個終止信號或者起始信號。
2 基于I2C總線的硬件設(shè)計
本噴繪機(jī)系統(tǒng)采用的是主控制系統(tǒng)板(ARM板)級聯(lián)多個噴頭控制板的結(jié)構(gòu)。由于各噴頭的參數(shù)和各顏色油墨的參數(shù)不同,在系統(tǒng)初始化時要靠I2C總線逐個配置噴頭的容積電壓和油墨的溫度電壓補(bǔ)償表(T-V表) [3]。
噴頭的驅(qū)動電壓取決于噴頭的容積電壓和當(dāng)前噴頭的溫度,噴頭溫度的變化影響著所盛油墨的粘滯度。為了實(shí)現(xiàn)穩(wěn)定點(diǎn)火,使噴頭所噴出的墨點(diǎn)大小一致,達(dá)到提高噴繪產(chǎn)品的精度,需要隨著溫度的變化及油墨溫度電壓補(bǔ)償表實(shí)時改變噴頭的驅(qū)動電壓。綜合多方面的考慮,使用支持I2C總線的ATmega8來驅(qū)動噴頭。
在噴繪機(jī)的研發(fā)和使用過程中,設(shè)置一個可視模塊不僅提高研發(fā)的速度而且給用戶的使用帶來了方便。為了進(jìn)一步簡化電路設(shè)計,采用SAA1064芯片驅(qū)動數(shù)碼管。SAA1064是一種支持I2C協(xié)議的數(shù)碼管驅(qū)動芯片,在采用動態(tài)模式狀態(tài)下,最多可以支持4只數(shù)碼管同時顯示?;贗2C通信的整體結(jié)構(gòu)如圖1所示。
I2C總線支持尋址工作,需要為每個噴頭控制板設(shè)定唯一的地址??梢酝ㄟ^軟件編程的方法設(shè)置噴頭板的地址,考慮到噴繪機(jī)的批量生產(chǎn),不可能為每一個噴頭控制板燒寫不同的程序,采用電路焊接的方式為噴頭板設(shè)置唯一的地址,在ATmega8上留出3個引腳,通過選擇是否焊接0 Ω電阻來區(qū)分地址。焊接為輸入0,不焊接為輸入1。其中000為公用I2C地址,地址111留作備用,這樣一組噴頭中有001~110共6個從機(jī)地址可選,能夠滿足系統(tǒng)需要。
數(shù)碼管驅(qū)動芯片SAA1064的器件從地址由高四位固定地址和低四位可編程地址組成。其中高四位器件地址固定為0111,低四位可編程地址由芯片引腳ADR的不同連接方式和讀/寫位決定[4]。在SAA1064中有5個寄存器單元,分別為1個控制寄存器和4個顯示寄存器,其中控制寄存器控制數(shù)碼管的亮度,動、靜態(tài)模式及位亮、暗顯示;4個顯示寄存器存儲要顯示的數(shù)據(jù)。
作為I2C總線器件,SAA1064的數(shù)據(jù)操作遵循I2C協(xié)議的要求。其數(shù)據(jù)操作格式如圖2所示。
表中S表示起始信號,P表示終止信號,A表示應(yīng)答信號。SLAWR為SAA1064在寫模式時的器件地址,SUBADR為器件控制寄存器地址,COM為控制命令。由于SAA1064內(nèi)部有一個增量控制器,在通過SDA線向其發(fā)送控制寄存器地址后,控制命令字和要顯示的數(shù)據(jù)可依次寫入相應(yīng)的寄存器中[5]。
3 基于I2C總線的軟件設(shè)計
系統(tǒng)上電初始化期間,主控制系統(tǒng)根據(jù)噴頭所盛油墨顏色將油墨的溫度電壓補(bǔ)償表和噴頭容積電壓等一系列參數(shù)下載到噴頭控制板上,存儲在ATmega8內(nèi)部512 B的EEPROM中。在EEPROM中數(shù)據(jù)的存儲格式規(guī)定為:在地址0處存儲油墨的顏色;地址1處存儲噴頭的型號;地址2~3處存儲噴頭的容積電壓;地址4~5處存儲噴頭偏移電壓;地址6~7處存儲A/D電壓調(diào)整標(biāo)準(zhǔn)值Vset;地址8~9處存儲A/D電壓調(diào)整值A(chǔ)Dset;地址10~400存儲溫度電壓補(bǔ)償表。EEPROM的地址是A/D轉(zhuǎn)換值減去300,地址內(nèi)存儲的是A/D對應(yīng)電壓偏差值的10倍,其中以8位補(bǔ)碼進(jìn)行表示。例如,地址為100的內(nèi)存里存儲的是FF,地址為105的內(nèi)存存儲的值是0F,其表示的是A/D轉(zhuǎn)換值為400時對應(yīng)的電壓偏差值為-0.1 V,A/D轉(zhuǎn)換值為405時對應(yīng)的電壓偏差值為+1.5 V;地址401~507留作備用;地址508~509存儲A/D校驗(yàn)0 V電壓;地址510~511存儲A/D校驗(yàn)1.23 V電壓。
3.1 噴頭通信模塊
ATmega8提供了實(shí)現(xiàn)標(biāo)準(zhǔn)兩線串行通信的硬件接口TWI(即I2C總線,以下稱為I2C),支持主機(jī)/從機(jī)模式,數(shù)據(jù)傳輸率最高可達(dá)400 kHz。其I2C接口是面向字節(jié)和基于中斷的,在所有總線事件后,如收到一個字節(jié)或發(fā)送了一個起始信號等,都將產(chǎn)生一個I2C中斷。由于I2C接口基于中斷,因此I2C接口在字節(jié)傳送和接收過程中,不需要應(yīng)用程序的干擾,由其內(nèi)部寄存器自動控制。在ATmega8中有5個I2C寄存器:(1)TWBR是I2C波特率寄存器用于產(chǎn)生和提供SCL引腳上的時鐘信號;(2)TWCR是I2C的控制寄存器,負(fù)責(zé)產(chǎn)生I2C的應(yīng)答、起始、終止信號和控制中斷等;(3)TWSR是I2C的狀態(tài)寄存器,反映了I2C的邏輯狀態(tài)和總線狀態(tài);(4)TWDR是I2C的數(shù)據(jù)寄存器,用于存儲要發(fā)送的數(shù)據(jù)或接收到的數(shù)據(jù);(5)TWAR是I2C的地址寄存器存放需要通信的從機(jī)地址[6]。
I2C中斷服務(wù)程序負(fù)責(zé)與主程序進(jìn)行通信。在每次噴頭溫度變化后,I2C中斷服務(wù)程序都要將溫度變化值傳給主程序,主程序以此查找溫度電壓補(bǔ)償表來獲取補(bǔ)償電壓。此中斷服務(wù)包括從地址+寫、從地址+讀、收到數(shù)據(jù)、數(shù)據(jù)發(fā)送成功、接收到起始條件或停止條件等。由于從地址的匹配由硬件負(fù)責(zé),中斷服務(wù)程序僅負(fù)責(zé)將收到的數(shù)據(jù)送到接收緩沖區(qū)Rbuf及將發(fā)送的數(shù)據(jù)從發(fā)送緩沖區(qū)中取出并發(fā)送出去。I2C中斷服務(wù)流程如圖3所示。
中斷服務(wù)程序在接收到從機(jī)地址寫命令(TWSR=0x60)時表示主機(jī)要求寫數(shù)據(jù)到從機(jī)地址中,因此要準(zhǔn)備好接收緩沖區(qū)的指針RbufP,并向主程序發(fā)出開始接收信號即將開始接受標(biāo)志位bI2Cin置1,隨后應(yīng)該是收到數(shù)據(jù)中斷(TWSR=0x80),將收到的數(shù)據(jù)放入接收緩沖區(qū)中并增量接收緩沖區(qū)指針,如此反復(fù)直到接收到停止條件(TWSR=0xB8,STA=0),這時將數(shù)據(jù)幀完成標(biāo)志bI2Cend置位。若接收到主機(jī)從機(jī)地址讀命令(TWSR=0xA8)時,要復(fù)位發(fā)送緩沖寄存器SbufP指針,并將發(fā)送寄存器中的第一個字節(jié)發(fā)送出去,在數(shù)據(jù)發(fā)送成功后(TWSR=0xB8),將后續(xù)的數(shù)據(jù)發(fā)送出去,并增量發(fā)送緩沖區(qū)指針,直到接收到停止條件。
無論是從機(jī)地址寫命令、從機(jī)地址讀命令,收到數(shù)據(jù)還是數(shù)據(jù)發(fā)送成功,I2C的傳送過程都沒有完成,因此在返回時需要置位TWINT(TWI中斷標(biāo)志),以便繼續(xù)下一步的I2C通信。但在收到停止條件后,表示一次完整的I2C通信完成,此時需要主程序?qū)偛臝2C通信的數(shù)據(jù)進(jìn)行處理,因此這時不能復(fù)位TWINT,要暫時停止I2C動作,同時向主程序發(fā)送標(biāo)記bI2Cend,通知主程序進(jìn)行數(shù)據(jù)處理。為保證下一次I2C通信能夠正常進(jìn)行,主程序在處理完I2C數(shù)據(jù)后要將TWINT置位,以便開啟下一次的I2C傳送。
I2C數(shù)據(jù)處理程序處于主程序的循環(huán)中,當(dāng)主程序發(fā)現(xiàn)數(shù)據(jù)接收就緒標(biāo)志bI2Cend置位時進(jìn)入本處理程序中。首先從緩沖區(qū)Rbuf的第一個單元中取出命令和地址A8。然后對命令進(jìn)行判斷,如果是寫EEPROM地址命令(Command=0000001),則將Rbuf的第二個字節(jié)與前面獲得的A8合并構(gòu)成9位地址,等待EEPROM允許讀寫標(biāo)志EEWE變?yōu)榈碗娖胶?,?位地址寫入EEPROM地址寄存器EEAR中。然后復(fù)位TWINT,開始下一幀的傳輸。EEWE變?yōu)榈碗娖奖硎旧弦淮蜤EPROM結(jié)束,若上一次EEPROM讀寫沒有結(jié)束就變更地址可能會發(fā)生錯誤。
若是EEPROM寫操作命令(Command=0000010),則將Rbuf的第二個字節(jié)取出寫入EEPROM數(shù)據(jù)寄存器EEDR中,并置位EEPROM開始寫標(biāo)志EEMWE和EEWE,開始EEPROM的寫操作。最后復(fù)位TWINT,開始下一幀的傳輸。 如果是EEPROM讀操作命令(Command=0000100),則置位EEPROM讀標(biāo)志EERE,然后從EEDR中讀出數(shù)據(jù)寫入發(fā)送緩沖區(qū)Sbuf中。真正的發(fā)送操作是當(dāng)I2C中斷發(fā)生,且I2C狀態(tài)是從機(jī)地址讀時,由I2C中斷服務(wù)程序直接將Sbuf的內(nèi)容寫入TWDR中完成寫操作。復(fù)位TWINT后,開始下一幀的傳輸。
其他命令作為備用,可進(jìn)行對應(yīng)的操作,但在結(jié)束后都必須復(fù)位TWINT,以便開始下一次I2C通信。對錯誤的命令或無法識別的命令,通過數(shù)碼管進(jìn)行顯示以便及時排除故障。再復(fù)位TWINT,開始下一次的傳送。
3.2 數(shù)碼管顯示模塊
數(shù)碼管僅用于顯示數(shù)據(jù),在一般情況下I2C總線上的驅(qū)動芯片SAA1064只作為從機(jī),接收主機(jī)的數(shù)據(jù)。本系統(tǒng)中用數(shù)碼管顯示EEPROM的非法操作、噴頭溫度以及初始化時的校準(zhǔn)值。
MCU主程序主要有兩個狀態(tài),系統(tǒng)啟動后首先進(jìn)入初始化校準(zhǔn)狀態(tài),校準(zhǔn)正確后進(jìn)入正常工作狀態(tài)。校準(zhǔn)狀態(tài)負(fù)責(zé)校準(zhǔn)各A/D轉(zhuǎn)換電路中因分壓電阻精度產(chǎn)生的誤差,并將校準(zhǔn)值顯示在數(shù)碼管上以便快速設(shè)置。進(jìn)入正常工作狀態(tài)后,數(shù)碼管顯示用于顯示噴頭的溫度,當(dāng)非法操作EEPROM時還可以顯示錯誤類型。噴頭控制板上有兩路A/D,A/D0用于電壓調(diào)整器的輸出采樣;A/D1用于噴頭的溫度采樣。其A/D0的校準(zhǔn)顯示流程如圖4所示。
系統(tǒng)初始化開始后,設(shè)AD0為查詢模式、關(guān)閉AD0中斷隨后啟動AD0,經(jīng)過一段時間,停止AD0并讀取AD0采樣值。經(jīng)轉(zhuǎn)換得到電壓值,經(jīng)I2C總線顯示在數(shù)碼管上,判斷是否是需要的電壓輸出值,若不是則不斷調(diào)整ADset來獲得需求值,若顯示正確就將ADset和需求的電壓輸出值Vcur保存到EEPROM中,完成校準(zhǔn)工作并返回到主程序中。
每個噴頭控制板作為從機(jī)與主控制系統(tǒng)進(jìn)行多對一的雙向數(shù)據(jù)通信,使得系統(tǒng)布線簡捷,傳輸效率高,降低了系統(tǒng)復(fù)雜度和成本。經(jīng)過試驗(yàn)測試,達(dá)到了預(yù)期的噴繪效果。本文的方法經(jīng)簡單修改也可應(yīng)用于其他類似場合,值得推廣使用。
參考文獻(xiàn)
[1] 何立民.I2C總線應(yīng)用系統(tǒng)設(shè)計[M].北京:北京航空航天大學(xué)出版社,1995.
[2] 梁建華,肖伸平.基于S3C44B0X的I2C總線設(shè)計[J],微計算機(jī)信息,2006,22(5):142-144.
[3] 張秋風(fēng),劉晉.基于計算機(jī)平臺的多噴頭噴繪機(jī)控制系統(tǒng)的設(shè)計與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2010,29(24):93-95.
[4] 孫世君,宋強(qiáng).4位LED驅(qū)動芯片SAA1064的原理與應(yīng)用[J],丹東紡專學(xué)報,2004,11(3):4-7.
[5] 周劍利,梁延貴.具有I2C總線接口的發(fā)光二極管驅(qū)動控制器[J],電子元器件應(yīng)用,2003,5(11):22-23.
[6] 馬潮,詹衛(wèi)前,耿德根.ATmega8原理及應(yīng)用手冊[M],北京:清華大學(xué)出版社,2003.