《電子技術(shù)應(yīng)用》
您所在的位置:首頁(yè) > 嵌入式技術(shù) > 設(shè)計(jì)應(yīng)用 > I2C總線(xiàn)在大幅面高速彩色噴繪機(jī)中的應(yīng)用
I2C總線(xiàn)在大幅面高速彩色噴繪機(jī)中的應(yīng)用
來(lái)源:微型機(jī)與應(yīng)用2011年第7期
靳祥陸,劉 晉,張 平,王政林,薛凱方
(遼寧師范大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院,遼寧 大連 116081)
摘要: 介紹了I2C總線(xiàn)的結(jié)構(gòu)、工作原理和數(shù)據(jù)傳輸方式,詳細(xì)討論了基于I2C總線(xiàn)的大幅面高速彩色噴繪機(jī)軟硬件設(shè)計(jì)。經(jīng)研究測(cè)試,系統(tǒng)能夠噴繪出高精度彩色圖像,達(dá)到了預(yù)期要求。
Abstract:
Key words :

摘  要: 介紹了I2C總線(xiàn)的結(jié)構(gòu)、工作原理和數(shù)據(jù)傳輸方式,詳細(xì)討論了基于I2C總線(xiàn)的大幅面高速彩色噴繪機(jī)軟硬件設(shè)計(jì)。經(jīng)研究測(cè)試,系統(tǒng)能夠噴繪出高精度彩色圖像,達(dá)到了預(yù)期要求。
關(guān)鍵詞: I2C總線(xiàn);噴繪機(jī);ATmega8;EEPROM;SAA1064

 隨著大型噴繪機(jī)應(yīng)用領(lǐng)域的拓展與普及,人們對(duì)噴繪產(chǎn)品的質(zhì)量要求也越來(lái)越高。為了提高噴繪產(chǎn)品的清晰度,本系統(tǒng)采用分組噴頭,每組6色或者8色,共3組~6組可選??紤]到通信效率和電路的簡(jiǎn)化設(shè)計(jì),采用簡(jiǎn)單實(shí)用的I2C總線(xiàn)實(shí)現(xiàn)主控制系統(tǒng)與多噴頭之間的數(shù)據(jù)傳輸,同時(shí)基于I2C總線(xiàn)與SAA1064驅(qū)動(dòng)芯片擴(kuò)展了4個(gè)數(shù)碼管用于顯示和校驗(yàn)。
1 I2C總線(xiàn)的概念
 I2C總線(xiàn)是Philips公司推出的芯片間串行數(shù)據(jù)傳輸總線(xiàn),軟硬件協(xié)議十分巧妙,用兩根線(xiàn)(SDA、SCL)即可實(shí)現(xiàn)完善的全雙工同步數(shù)據(jù)傳輸,能夠十分方便地構(gòu)成單主機(jī)系統(tǒng)或者多主機(jī)系統(tǒng)[1]。任何一個(gè)具有I2C接口的器件,不論其功能差別有多大,都能通過(guò)串行數(shù)據(jù)線(xiàn)SDA和串行時(shí)鐘線(xiàn)SCL連接到I2C總線(xiàn)上[2]。從而簡(jiǎn)化了系統(tǒng)設(shè)計(jì)的復(fù)雜性,提高了系統(tǒng)的抗干擾能力,給用戶(hù)設(shè)計(jì)應(yīng)用系統(tǒng)帶來(lái)了極大地方便。
 在I2C總線(xiàn)上的每一個(gè)器件都有一個(gè)唯一的識(shí)別地址,器件之間的通信采用主從方式,主機(jī)與從機(jī)之間的通信是相互的,但主從關(guān)系并不持久,由數(shù)據(jù)傳輸?shù)姆较驔Q定。發(fā)送并控制數(shù)據(jù)傳輸?shù)钠骷Q(chēng)為主機(jī),此時(shí)在I2C總線(xiàn)上任何被尋址的器件都稱(chēng)為從機(jī)。一般主機(jī)負(fù)責(zé)起始和終止信號(hào)的產(chǎn)生,當(dāng)主機(jī)發(fā)送了起始信號(hào)(SCL為高電平時(shí),SDA產(chǎn)生一個(gè)下降沿)后,再發(fā)送從機(jī)地址來(lái)選擇需要通信的器件。從機(jī)地址有7位和10位兩種,本文僅介紹7位地址的尋址方式。尋址信號(hào)由一個(gè)字節(jié)組成,高7位為器件的地址,最低位為方向位,用來(lái)表明數(shù)據(jù)傳輸?shù)姆较颉.?dāng)方向位為“0”時(shí)表明主機(jī)對(duì)從機(jī)的寫(xiě)操作;為“1”時(shí)表明主機(jī)對(duì)從機(jī)的讀操作。
 每一個(gè)從機(jī)在收到尋址信號(hào)后都與自己的器件地址進(jìn)行匹配,匹配成功后要向主機(jī)發(fā)送一個(gè)應(yīng)答信號(hào)(ACK),主機(jī)收到應(yīng)答信號(hào)后將按照一定的時(shí)序開(kāi)始與從機(jī)通信。若從機(jī)不能響應(yīng)尋址或需要終止傳輸過(guò)程,從機(jī)必須在SDA上輸出高電平。主機(jī)檢測(cè)到異常情況后產(chǎn)生一個(gè)終止信號(hào)或者起始信號(hào)。
2 基于I2C總線(xiàn)的硬件設(shè)計(jì)
 本噴繪機(jī)系統(tǒng)采用的是主控制系統(tǒng)板(ARM板)級(jí)聯(lián)多個(gè)噴頭控制板的結(jié)構(gòu)。由于各噴頭的參數(shù)和各顏色油墨的參數(shù)不同,在系統(tǒng)初始化時(shí)要靠I2C總線(xiàn)逐個(gè)配置噴頭的容積電壓和油墨的溫度電壓補(bǔ)償表(T-V表) [3]。
噴頭的驅(qū)動(dòng)電壓取決于噴頭的容積電壓和當(dāng)前噴頭的溫度,噴頭溫度的變化影響著所盛油墨的粘滯度。為了實(shí)現(xiàn)穩(wěn)定點(diǎn)火,使噴頭所噴出的墨點(diǎn)大小一致,達(dá)到提高噴繪產(chǎn)品的精度,需要隨著溫度的變化及油墨溫度電壓補(bǔ)償表實(shí)時(shí)改變噴頭的驅(qū)動(dòng)電壓。綜合多方面的考慮,使用支持I2C總線(xiàn)的ATmega8來(lái)驅(qū)動(dòng)噴頭。
在噴繪機(jī)的研發(fā)和使用過(guò)程中,設(shè)置一個(gè)可視模塊不僅提高研發(fā)的速度而且給用戶(hù)的使用帶來(lái)了方便。為了進(jìn)一步簡(jiǎn)化電路設(shè)計(jì),采用SAA1064芯片驅(qū)動(dòng)數(shù)碼管。SAA1064是一種支持I2C協(xié)議的數(shù)碼管驅(qū)動(dòng)芯片,在采用動(dòng)態(tài)模式狀態(tài)下,最多可以支持4只數(shù)碼管同時(shí)顯示?;贗2C通信的整體結(jié)構(gòu)如圖1所示。

 

 

 I2C總線(xiàn)支持尋址工作,需要為每個(gè)噴頭控制板設(shè)定唯一的地址??梢酝ㄟ^(guò)軟件編程的方法設(shè)置噴頭板的地址,考慮到噴繪機(jī)的批量生產(chǎn),不可能為每一個(gè)噴頭控制板燒寫(xiě)不同的程序,采用電路焊接的方式為噴頭板設(shè)置唯一的地址,在A(yíng)Tmega8上留出3個(gè)引腳,通過(guò)選擇是否焊接0 Ω電阻來(lái)區(qū)分地址。焊接為輸入0,不焊接為輸入1。其中000為公用I2C地址,地址111留作備用,這樣一組噴頭中有001~110共6個(gè)從機(jī)地址可選,能夠滿(mǎn)足系統(tǒng)需要。
 數(shù)碼管驅(qū)動(dòng)芯片SAA1064的器件從地址由高四位固定地址和低四位可編程地址組成。其中高四位器件地址固定為0111,低四位可編程地址由芯片引腳ADR的不同連接方式和讀/寫(xiě)位決定[4]。在SAA1064中有5個(gè)寄存器單元,分別為1個(gè)控制寄存器和4個(gè)顯示寄存器,其中控制寄存器控制數(shù)碼管的亮度,動(dòng)、靜態(tài)模式及位亮、暗顯示;4個(gè)顯示寄存器存儲(chǔ)要顯示的數(shù)據(jù)。
 作為I2C總線(xiàn)器件,SAA1064的數(shù)據(jù)操作遵循I2C協(xié)議的要求。其數(shù)據(jù)操作格式如圖2所示。

 表中S表示起始信號(hào),P表示終止信號(hào),A表示應(yīng)答信號(hào)。SLAWR為SAA1064在寫(xiě)模式時(shí)的器件地址,SUBADR為器件控制寄存器地址,COM為控制命令。由于SAA1064內(nèi)部有一個(gè)增量控制器,在通過(guò)SDA線(xiàn)向其發(fā)送控制寄存器地址后,控制命令字和要顯示的數(shù)據(jù)可依次寫(xiě)入相應(yīng)的寄存器中[5]。
3 基于I2C總線(xiàn)的軟件設(shè)計(jì)
 系統(tǒng)上電初始化期間,主控制系統(tǒng)根據(jù)噴頭所盛油墨顏色將油墨的溫度電壓補(bǔ)償表和噴頭容積電壓等一系列參數(shù)下載到噴頭控制板上,存儲(chǔ)在A(yíng)Tmega8內(nèi)部512 B的EEPROM中。在EEPROM中數(shù)據(jù)的存儲(chǔ)格式規(guī)定為:在地址0處存儲(chǔ)油墨的顏色;地址1處存儲(chǔ)噴頭的型號(hào);地址2~3處存儲(chǔ)噴頭的容積電壓;地址4~5處存儲(chǔ)噴頭偏移電壓;地址6~7處存儲(chǔ)A/D電壓調(diào)整標(biāo)準(zhǔn)值Vset;地址8~9處存儲(chǔ)A/D電壓調(diào)整值A(chǔ)Dset;地址10~400存儲(chǔ)溫度電壓補(bǔ)償表。EEPROM的地址是A/D轉(zhuǎn)換值減去300,地址內(nèi)存儲(chǔ)的是A/D對(duì)應(yīng)電壓偏差值的10倍,其中以8位補(bǔ)碼進(jìn)行表示。例如,地址為100的內(nèi)存里存儲(chǔ)的是FF,地址為105的內(nèi)存存儲(chǔ)的值是0F,其表示的是A/D轉(zhuǎn)換值為400時(shí)對(duì)應(yīng)的電壓偏差值為-0.1 V,A/D轉(zhuǎn)換值為405時(shí)對(duì)應(yīng)的電壓偏差值為+1.5 V;地址401~507留作備用;地址508~509存儲(chǔ)A/D校驗(yàn)0 V電壓;地址510~511存儲(chǔ)A/D校驗(yàn)1.23 V電壓。
3.1 噴頭通信模塊
 ATmega8提供了實(shí)現(xiàn)標(biāo)準(zhǔn)兩線(xiàn)串行通信的硬件接口TWI(即I2C總線(xiàn),以下稱(chēng)為I2C),支持主機(jī)/從機(jī)模式,數(shù)據(jù)傳輸率最高可達(dá)400 kHz。其I2C接口是面向字節(jié)和基于中斷的,在所有總線(xiàn)事件后,如收到一個(gè)字節(jié)或發(fā)送了一個(gè)起始信號(hào)等,都將產(chǎn)生一個(gè)I2C中斷。由于I2C接口基于中斷,因此I2C接口在字節(jié)傳送和接收過(guò)程中,不需要應(yīng)用程序的干擾,由其內(nèi)部寄存器自動(dòng)控制。在A(yíng)Tmega8中有5個(gè)I2C寄存器:(1)TWBR是I2C波特率寄存器用于產(chǎn)生和提供SCL引腳上的時(shí)鐘信號(hào);(2)TWCR是I2C的控制寄存器,負(fù)責(zé)產(chǎn)生I2C的應(yīng)答、起始、終止信號(hào)和控制中斷等;(3)TWSR是I2C的狀態(tài)寄存器,反映了I2C的邏輯狀態(tài)和總線(xiàn)狀態(tài);(4)TWDR是I2C的數(shù)據(jù)寄存器,用于存儲(chǔ)要發(fā)送的數(shù)據(jù)或接收到的數(shù)據(jù);(5)TWAR是I2C的地址寄存器存放需要通信的從機(jī)地址[6]。
I2C中斷服務(wù)程序負(fù)責(zé)與主程序進(jìn)行通信。在每次噴頭溫度變化后,I2C中斷服務(wù)程序都要將溫度變化值傳給主程序,主程序以此查找溫度電壓補(bǔ)償表來(lái)獲取補(bǔ)償電壓。此中斷服務(wù)包括從地址+寫(xiě)、從地址+讀、收到數(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ī)地址寫(xiě)命令(TWSR=0x60)時(shí)表示主機(jī)要求寫(xiě)數(shù)據(jù)到從機(jī)地址中,因此要準(zhǔn)備好接收緩沖區(qū)的指針RbufP,并向主程序發(fā)出開(kāi)始接收信號(hào)即將開(kāi)始接受標(biāo)志位bI2Cin置1,隨后應(yīng)該是收到數(shù)據(jù)中斷(TWSR=0x80),將收到的數(shù)據(jù)放入接收緩沖區(qū)中并增量接收緩沖區(qū)指針,如此反復(fù)直到接收到停止條件(TWSR=0xB8,STA=0),這時(shí)將數(shù)據(jù)幀完成標(biāo)志bI2Cend置位。若接收到主機(jī)從機(jī)地址讀命令(TWSR=0xA8)時(shí),要復(fù)位發(fā)送緩沖寄存器SbufP指針,并將發(fā)送寄存器中的第一個(gè)字節(jié)發(fā)送出去,在數(shù)據(jù)發(fā)送成功后(TWSR=0xB8),將后續(xù)的數(shù)據(jù)發(fā)送出去,并增量發(fā)送緩沖區(qū)指針,直到接收到停止條件。
 無(wú)論是從機(jī)地址寫(xiě)命令、從機(jī)地址讀命令,收到數(shù)據(jù)還是數(shù)據(jù)發(fā)送成功,I2C的傳送過(guò)程都沒(méi)有完成,因此在返回時(shí)需要置位TWINT(TWI中斷標(biāo)志),以便繼續(xù)下一步的I2C通信。但在收到停止條件后,表示一次完整的I2C通信完成,此時(shí)需要主程序?qū)偛臝2C通信的數(shù)據(jù)進(jìn)行處理,因此這時(shí)不能復(fù)位TWINT,要暫時(shí)停止I2C動(dòng)作,同時(shí)向主程序發(fā)送標(biāo)記bI2Cend,通知主程序進(jìn)行數(shù)據(jù)處理。為保證下一次I2C通信能夠正常進(jìn)行,主程序在處理完I2C數(shù)據(jù)后要將TWINT置位,以便開(kāi)啟下一次的I2C傳送。
 I2C數(shù)據(jù)處理程序處于主程序的循環(huán)中,當(dāng)主程序發(fā)現(xiàn)數(shù)據(jù)接收就緒標(biāo)志bI2Cend置位時(shí)進(jìn)入本處理程序中。首先從緩沖區(qū)Rbuf的第一個(gè)單元中取出命令和地址A8。然后對(duì)命令進(jìn)行判斷,如果是寫(xiě)EEPROM地址命令(Command=0000001),則將Rbuf的第二個(gè)字節(jié)與前面獲得的A8合并構(gòu)成9位地址,等待EEPROM允許讀寫(xiě)標(biāo)志EEWE變?yōu)榈碗娖胶?,?位地址寫(xiě)入EEPROM地址寄存器EEAR中。然后復(fù)位TWINT,開(kāi)始下一幀的傳輸。EEWE變?yōu)榈碗娖奖硎旧弦淮蜤EPROM結(jié)束,若上一次EEPROM讀寫(xiě)沒(méi)有結(jié)束就變更地址可能會(huì)發(fā)生錯(cuò)誤。
 若是EEPROM寫(xiě)操作命令(Command=0000010),則將Rbuf的第二個(gè)字節(jié)取出寫(xiě)入EEPROM數(shù)據(jù)寄存器EEDR中,并置位EEPROM開(kāi)始寫(xiě)標(biāo)志EEMWE和EEWE,開(kāi)始EEPROM的寫(xiě)操作。最后復(fù)位TWINT,開(kāi)始下一幀的傳輸。    如果是EEPROM讀操作命令(Command=0000100),則置位EEPROM讀標(biāo)志EERE,然后從EEDR中讀出數(shù)據(jù)寫(xiě)入發(fā)送緩沖區(qū)Sbuf中。真正的發(fā)送操作是當(dāng)I2C中斷發(fā)生,且I2C狀態(tài)是從機(jī)地址讀時(shí),由I2C中斷服務(wù)程序直接將Sbuf的內(nèi)容寫(xiě)入TWDR中完成寫(xiě)操作。復(fù)位TWINT后,開(kāi)始下一幀的傳輸。
 其他命令作為備用,可進(jìn)行對(duì)應(yīng)的操作,但在結(jié)束后都必須復(fù)位TWINT,以便開(kāi)始下一次I2C通信。對(duì)錯(cuò)誤的命令或無(wú)法識(shí)別的命令,通過(guò)數(shù)碼管進(jìn)行顯示以便及時(shí)排除故障。再?gòu)?fù)位TWINT,開(kāi)始下一次的傳送。
3.2 數(shù)碼管顯示模塊
 數(shù)碼管僅用于顯示數(shù)據(jù),在一般情況下I2C總線(xiàn)上的驅(qū)動(dòng)芯片SAA1064只作為從機(jī),接收主機(jī)的數(shù)據(jù)。本系統(tǒng)中用數(shù)碼管顯示EEPROM的非法操作、噴頭溫度以及初始化時(shí)的校準(zhǔn)值。
 MCU主程序主要有兩個(gè)狀態(tài),系統(tǒng)啟動(dò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時(shí)還可以顯示錯(cuò)誤類(lèi)型。噴頭控制板上有兩路A/D,A/D0用于電壓調(diào)整器的輸出采樣;A/D1用于噴頭的溫度采樣。其A/D0的校準(zhǔn)顯示流程如圖4所示。

 系統(tǒng)初始化開(kāi)始后,設(shè)AD0為查詢(xún)模式、關(guān)閉AD0中斷隨后啟動(dòng)AD0,經(jīng)過(guò)一段時(shí)間,停止AD0并讀取AD0采樣值。經(jīng)轉(zhuǎn)換得到電壓值,經(jīng)I2C總線(xiàn)顯示在數(shù)碼管上,判斷是否是需要的電壓輸出值,若不是則不斷調(diào)整ADset來(lái)獲得需求值,若顯示正確就將ADset和需求的電壓輸出值Vcur保存到EEPROM中,完成校準(zhǔn)工作并返回到主程序中。
 每個(gè)噴頭控制板作為從機(jī)與主控制系統(tǒng)進(jìn)行多對(duì)一的雙向數(shù)據(jù)通信,使得系統(tǒng)布線(xiàn)簡(jiǎn)捷,傳輸效率高,降低了系統(tǒng)復(fù)雜度和成本。經(jīng)過(guò)試驗(yàn)測(cè)試,達(dá)到了預(yù)期的噴繪效果。本文的方法經(jīng)簡(jiǎn)單修改也可應(yīng)用于其他類(lèi)似場(chǎng)合,值得推廣使用。
參考文獻(xiàn)
[1] 何立民.I2C總線(xiàn)應(yīng)用系統(tǒng)設(shè)計(jì)[M].北京:北京航空航天大學(xué)出版社,1995.
[2] 梁建華,肖伸平.基于S3C44B0X的I2C總線(xiàn)設(shè)計(jì)[J],微計(jì)算機(jī)信息,2006,22(5):142-144.
[3] 張秋風(fēng),劉晉.基于計(jì)算機(jī)平臺(tái)的多噴頭噴繪機(jī)控制系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2010,29(24):93-95.
[4] 孫世君,宋強(qiáng).4位LED驅(qū)動(dòng)芯片SAA1064的原理與應(yīng)用[J],丹東紡專(zhuān)學(xué)報(bào),2004,11(3):4-7.
[5] 周劍利,梁延貴.具有I2C總線(xiàn)接口的發(fā)光二極管驅(qū)動(dòng)控制器[J],電子元器件應(yīng)用,2003,5(11):22-23.
[6] 馬潮,詹衛(wèi)前,耿德根.ATmega8原理及應(yīng)用手冊(cè)[M],北京:清華大學(xué)出版社,2003.

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權(quán)禁止轉(zhuǎn)載。