周永剛
(中國(guó)電子科技集團(tuán)公司第四十一研究所,山東青島266555)
AVR ATmega 系列單片機(jī)片內(nèi)集成兩線串行接口TWI 模塊。采用TWI 協(xié)議,設(shè)計(jì)者可通過兩根雙向總線,即一根時(shí)鐘線SCL 和一根數(shù)據(jù)線SDA,最多連接128 個(gè)從設(shè)備[1]。實(shí)現(xiàn)總線連接時(shí)唯一需要增加的外部設(shè)備是兩條總線上的上拉電阻。所有與總線相連的設(shè)備都需要定義各自的設(shè)備地址。 實(shí)際上,TWI 接口時(shí)序與常見的I2C 總線是兼容的,因此,只需要控制相關(guān)寄存器,就能夠?qū)崿F(xiàn)通過TWI 傳輸數(shù)據(jù),TWI 通信工作于主從模式,把系統(tǒng)任務(wù)進(jìn)行了合理的分工,節(jié)省了硬件資源,減少了工作量,從而使編程簡(jiǎn)單,開發(fā)更容易。
TWI 總線是簡(jiǎn)單同時(shí)強(qiáng)大而靈活的通信接口, 具有最高達(dá)400kHz 的數(shù)據(jù)傳輸率。 TWI 總線協(xié)議可僅用兩根線將不同的設(shè)備互連到一起。 支持主機(jī)和從機(jī)操作、多主機(jī)仲裁。 AVR 單片機(jī)的TWI 模塊由以下幾個(gè)子模塊構(gòu)成[2]:
當(dāng)CPU 對(duì)應(yīng)的端口設(shè)置為SCL 和SDA 引腳時(shí),可以設(shè)定相應(yīng)I/O 口內(nèi)部上拉電阻有效,這樣可以省略外部的上拉電阻。
TWI 工作于主機(jī)模式時(shí), 時(shí)鐘信號(hào)SCL 的周期由比特率發(fā)生器控制。 具體由TWI 狀態(tài)寄存器TWSR 的預(yù)分頻系數(shù)以及比特率寄存器TWBR 設(shè)定,SCL 的頻率計(jì)算公式如公式(1):
其中,TWBR 為TWI 波特率寄存器的值;TWPS 為TWI 狀態(tài)寄存器預(yù)分頻位的值。 在主機(jī)模式下,TWBR 的值應(yīng)大于10,否則可能會(huì)產(chǎn)生不正確的輸出。
該單元包括數(shù)據(jù)與地址移位寄存器TWDR, 起始/終止信號(hào)(START/STOP)控制器和總線仲裁判定硬件電路。
地址匹配單元將檢測(cè)從總線上接收到的地址是否與TWAR 寄存器中的7 位地址相匹配。 一旦地址匹配成功,控制單元將按照得到的通知作出相應(yīng)的響應(yīng)。
控制單元監(jiān)聽總線TWI 總線,并根據(jù)TWI 控制寄存器TWCR 的設(shè)置作出相應(yīng)的響應(yīng)。 當(dāng)TWI 總線上產(chǎn)生需要應(yīng)用程序干預(yù)處理的事件時(shí),TWI 中斷標(biāo)志位TWINT 置位,時(shí)鐘線SCL 被拉低,暫停TWI總線上的數(shù)據(jù)傳輸。
TWBR:TWI 比特率寄存器。
TWCR:TWI 控制寄存器。
TWSR:TWI 狀態(tài)寄存器。
TWDR:TWI 數(shù)據(jù)寄存器。
TWAR:TWI(從機(jī))地址寄存器。
AVR 的TWI 接口是面向字節(jié)和基于中斷的。所有的總線事件,如接收到一個(gè)字節(jié)或發(fā)送一個(gè)START 信號(hào)等, 都會(huì)產(chǎn)生一個(gè)TWI 中斷。由于TWI 接口是基于中斷的,因此TWI 接口在字節(jié)發(fā)送和接受過程中,不需要應(yīng)用程序的干預(yù)[3]。TWI 狀態(tài)寄存器TWSR 包含了表面當(dāng)前TWI 總線狀態(tài)的值。 應(yīng)用程序可以讀取TWSR 的狀態(tài)碼,判別此時(shí)的狀態(tài)是否正確,并通過設(shè)置控制寄存器,決定在下一個(gè)TWI 總線周期TWI 接口的工作[4]。
TWI 可以工作于4 種不同的模式,即主機(jī)發(fā)送模式(MT)、主機(jī)接收模式(MR)、從機(jī)發(fā)送模式(ST)、從機(jī)接收模式(SR)。當(dāng)TWI 上出現(xiàn)多個(gè)主機(jī)時(shí),就會(huì)發(fā)生多主機(jī)仲裁。除了依靠自身硬件的檢測(cè)外,還可以通過軟件讀取TWSR 狀態(tài)寄存器判斷自己在總線中的精確狀態(tài),以便為下一步動(dòng)作提供更精確的診斷依據(jù)。
主機(jī)模式下,主機(jī)可向從機(jī)發(fā)送或接收數(shù)據(jù)。為了進(jìn)入主機(jī)模式,必須先發(fā)送START 信號(hào); 緊接著的地址包格式?jīng)Q定是進(jìn)入主機(jī)發(fā)送模式或者主機(jī)接收模式。 如果發(fā)送SLA+W,則進(jìn)入主機(jī)發(fā)送模式;如果發(fā)送SLA+R,則進(jìn)入主機(jī)接收模式。
從機(jī)模式下,從機(jī)只需要監(jiān)聽TWI 總線,如果接收到SLA+R 并回復(fù)ACK 后,則進(jìn)入從機(jī)發(fā)送模式;如果接收到SLA+W 并回復(fù)ACK后,則進(jìn)入從機(jī)接收模式。
圖1 系統(tǒng)硬件結(jié)構(gòu)
在交流電源分配柜中,采集板負(fù)責(zé)采集交流電壓、交流電流、交流頻率和30 熔絲告警信息,采集數(shù)據(jù)后發(fā)送到顯示板;顯示板具備告警門限設(shè)置、數(shù)據(jù)顯示以及數(shù)據(jù)上傳服務(wù)器等功能。 采集板和顯示板的CPU 均采用ATmega8 芯片?;赥WI 接口的硬件電路實(shí)現(xiàn)非常方便,只需要將兩片ATmega8 芯片的SCL 和SDA 引腳通過上拉電阻與+5V電源相連接即可。 硬件電路如圖1 所示。
采集板CPU 采集數(shù)據(jù)后, 通過TWI 總線發(fā)送數(shù)據(jù)到顯示板CPU,顯示板CPU 接收數(shù)據(jù)后,給采集板CPU 回復(fù)相應(yīng)的數(shù)據(jù)。 顯示板CPU 在用戶重新設(shè)定告警門限后, 需要設(shè)定值發(fā)送給采集板進(jìn)行設(shè)定。 因此在該系統(tǒng)中采集板CPU 工作于主機(jī)發(fā)送和主機(jī)接收模式,顯示板CPU 工作于從機(jī)接收和從機(jī)發(fā)送模式。
在主機(jī)模式[5]下,主機(jī)通過發(fā)送START 信號(hào)啟動(dòng)總線,確認(rèn)START信號(hào)發(fā)送后,發(fā)送從機(jī)地址和寫標(biāo)志位等待從機(jī)響應(yīng),得到從機(jī)的響應(yīng)后,發(fā)送數(shù)據(jù)到從機(jī)。同時(shí)在總線空閑時(shí),主機(jī)每隔一段時(shí)間發(fā)送從機(jī)地址和讀標(biāo)志位進(jìn)入主機(jī)接收模式,接收從機(jī)的告警門限值,接收完后設(shè)定主機(jī)的門限值。主機(jī)在初始化后,需要執(zhí)行包括主機(jī)讀、主機(jī)寫程序,并把讀取到數(shù)據(jù)從緩沖區(qū)中轉(zhuǎn)存。 為了保證TWI 總線的穩(wěn)定運(yùn)行,只有主機(jī)發(fā)送模式(MT)和主機(jī)接收模式(MR)程序是不夠的,還必須有一定的系統(tǒng)總線狀態(tài)錯(cuò)誤處理程序[6],以防止TWI 總線在受到外界干擾時(shí)出現(xiàn)故障??紤]本文所設(shè)計(jì)的系統(tǒng)是主機(jī)與從機(jī)不會(huì)實(shí)時(shí)發(fā)生變化的總線網(wǎng)絡(luò)系統(tǒng), 所以對(duì)于主機(jī)而言還要有容錯(cuò)處理程序。中斷流程圖如圖2 所示。
圖2 主機(jī)模式中斷流程圖
在從機(jī)模式[7]下,由于從機(jī)也需要處理不通的事件,需要采用中斷的方式處理接收和發(fā)送數(shù)據(jù), 這樣可以有效的提高程序的運(yùn)行程序。通過檢測(cè)TWSR 狀態(tài)碼,進(jìn)行不同的處理。 從機(jī)在被尋址后,回復(fù)主機(jī),判斷是否進(jìn)入從機(jī)接收模式或從機(jī)發(fā)送模式。 進(jìn)入從機(jī)接收模式時(shí),在RAM 中開辟一塊數(shù)據(jù)緩沖區(qū),用于接收數(shù)據(jù);進(jìn)入從機(jī)發(fā)送模式時(shí),將需要發(fā)送的數(shù)據(jù)裝入發(fā)送緩沖區(qū),中斷程序在自動(dòng)響應(yīng)主機(jī)進(jìn)行數(shù)據(jù)發(fā)送。 中斷流程圖如圖3 所示。
圖3 從機(jī)模式中斷流程圖
利用TWI 接口實(shí)現(xiàn)AVR 單片機(jī)主從機(jī)通信,簡(jiǎn)化了硬件和軟件設(shè)計(jì), 縮短了系統(tǒng)開發(fā)周期。 在TWI 通信程序中增加了容錯(cuò)處理程序,使總線運(yùn)行穩(wěn)定可靠,提高了系統(tǒng)的抗干擾能力。在通信中采用了TWI 中斷,合理安排事件處理時(shí)間,有效提高了程序的運(yùn)行效率。
[1]ATmega8 Datasheet[Z]. ATMEL Corporation.
[2]馬潮,詹衛(wèi)前,耿德根,等.ATmega8 原理及應(yīng)用手冊(cè)[M].北京:清華大學(xué)出版社,2002.
[3]郭祥軍.AVR 單片機(jī)的TWI 總線的原理及應(yīng)用[J].單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2006(8):37-39.
[4]楚天鵬,鄭華耀.TWI 接口多機(jī)通信的實(shí)現(xiàn)[J].裝備制造技術(shù),2008(6):96-98.
[5]AVR315: Using the TWI module as I2C master[OL]. www.atmel.com.
[6]汪海波,王卓然,耿德根,等.深入淺出AVR 單片機(jī)[M].北京:中國(guó)電力出版社,2008.
[7]AVR311: Using the TWI module as I2C slave[OL]. www.atmel.com.