周永剛
(中國電子科技集團公司第四十一研究所,山東青島266555)
AVR ATmega 系列單片機片內集成兩線串行接口TWI 模塊。采用TWI 協議,設計者可通過兩根雙向總線,即一根時鐘線SCL 和一根數據線SDA,最多連接128 個從設備[1]。實現總線連接時唯一需要增加的外部設備是兩條總線上的上拉電阻。所有與總線相連的設備都需要定義各自的設備地址。 實際上,TWI 接口時序與常見的I2C 總線是兼容的,因此,只需要控制相關寄存器,就能夠實現通過TWI 傳輸數據,TWI 通信工作于主從模式,把系統任務進行了合理的分工,節省了硬件資源,減少了工作量,從而使編程簡單,開發更容易。
TWI 總線是簡單同時強大而靈活的通信接口, 具有最高達400kHz 的數據傳輸率。 TWI 總線協議可僅用兩根線將不同的設備互連到一起。 支持主機和從機操作、多主機仲裁。 AVR 單片機的TWI 模塊由以下幾個子模塊構成[2]:
當CPU 對應的端口設置為SCL 和SDA 引腳時,可以設定相應I/O 口內部上拉電阻有效,這樣可以省略外部的上拉電阻。
TWI 工作于主機模式時, 時鐘信號SCL 的周期由比特率發生器控制。 具體由TWI 狀態寄存器TWSR 的預分頻系數以及比特率寄存器TWBR 設定,SCL 的頻率計算公式如公式(1):

其中,TWBR 為TWI 波特率寄存器的值;TWPS 為TWI 狀態寄存器預分頻位的值。 在主機模式下,TWBR 的值應大于10,否則可能會產生不正確的輸出。
該單元包括數據與地址移位寄存器TWDR, 起始/終止信號(START/STOP)控制器和總線仲裁判定硬件電路。
地址匹配單元將檢測從總線上接收到的地址是否與TWAR 寄存器中的7 位地址相匹配。 一旦地址匹配成功,控制單元將按照得到的通知作出相應的響應。
控制單元監聽總線TWI 總線,并根據TWI 控制寄存器TWCR 的設置作出相應的響應。 當TWI 總線上產生需要應用程序干預處理的事件時,TWI 中斷標志位TWINT 置位,時鐘線SCL 被拉低,暫停TWI總線上的數據傳輸。
TWBR:TWI 比特率寄存器。
TWCR:TWI 控制寄存器。
TWSR:TWI 狀態寄存器。
TWDR:TWI 數據寄存器。
TWAR:TWI(從機)地址寄存器。
AVR 的TWI 接口是面向字節和基于中斷的。所有的總線事件,如接收到一個字節或發送一個START 信號等, 都會產生一個TWI 中斷。由于TWI 接口是基于中斷的,因此TWI 接口在字節發送和接受過程中,不需要應用程序的干預[3]。TWI 狀態寄存器TWSR 包含了表面當前TWI 總線狀態的值。 應用程序可以讀取TWSR 的狀態碼,判別此時的狀態是否正確,并通過設置控制寄存器,決定在下一個TWI 總線周期TWI 接口的工作[4]。
TWI 可以工作于4 種不同的模式,即主機發送模式(MT)、主機接收模式(MR)、從機發送模式(ST)、從機接收模式(SR)。當TWI 上出現多個主機時,就會發生多主機仲裁。除了依靠自身硬件的檢測外,還可以通過軟件讀取TWSR 狀態寄存器判斷自己在總線中的精確狀態,以便為下一步動作提供更精確的診斷依據。
主機模式下,主機可向從機發送或接收數據。為了進入主機模式,必須先發送START 信號; 緊接著的地址包格式決定是進入主機發送模式或者主機接收模式。 如果發送SLA+W,則進入主機發送模式;如果發送SLA+R,則進入主機接收模式。
從機模式下,從機只需要監聽TWI 總線,如果接收到SLA+R 并回復ACK 后,則進入從機發送模式;如果接收到SLA+W 并回復ACK后,則進入從機接收模式。

圖1 系統硬件結構
在交流電源分配柜中,采集板負責采集交流電壓、交流電流、交流頻率和30 熔絲告警信息,采集數據后發送到顯示板;顯示板具備告警門限設置、數據顯示以及數據上傳服務器等功能。 采集板和顯示板的CPU 均采用ATmega8 芯片。基于TWI 接口的硬件電路實現非常方便,只需要將兩片ATmega8 芯片的SCL 和SDA 引腳通過上拉電阻與+5V電源相連接即可。 硬件電路如圖1 所示。
采集板CPU 采集數據后, 通過TWI 總線發送數據到顯示板CPU,顯示板CPU 接收數據后,給采集板CPU 回復相應的數據。 顯示板CPU 在用戶重新設定告警門限后, 需要設定值發送給采集板進行設定。 因此在該系統中采集板CPU 工作于主機發送和主機接收模式,顯示板CPU 工作于從機接收和從機發送模式。
在主機模式[5]下,主機通過發送START 信號啟動總線,確認START信號發送后,發送從機地址和寫標志位等待從機響應,得到從機的響應后,發送數據到從機。同時在總線空閑時,主機每隔一段時間發送從機地址和讀標志位進入主機接收模式,接收從機的告警門限值,接收完后設定主機的門限值。主機在初始化后,需要執行包括主機讀、主機寫程序,并把讀取到數據從緩沖區中轉存。 為了保證TWI 總線的穩定運行,只有主機發送模式(MT)和主機接收模式(MR)程序是不夠的,還必須有一定的系統總線狀態錯誤處理程序[6],以防止TWI 總線在受到外界干擾時出現故障。考慮本文所設計的系統是主機與從機不會實時發生變化的總線網絡系統, 所以對于主機而言還要有容錯處理程序。中斷流程圖如圖2 所示。

圖2 主機模式中斷流程圖
在從機模式[7]下,由于從機也需要處理不通的事件,需要采用中斷的方式處理接收和發送數據, 這樣可以有效的提高程序的運行程序。通過檢測TWSR 狀態碼,進行不同的處理。 從機在被尋址后,回復主機,判斷是否進入從機接收模式或從機發送模式。 進入從機接收模式時,在RAM 中開辟一塊數據緩沖區,用于接收數據;進入從機發送模式時,將需要發送的數據裝入發送緩沖區,中斷程序在自動響應主機進行數據發送。 中斷流程圖如圖3 所示。

圖3 從機模式中斷流程圖
利用TWI 接口實現AVR 單片機主從機通信,簡化了硬件和軟件設計, 縮短了系統開發周期。 在TWI 通信程序中增加了容錯處理程序,使總線運行穩定可靠,提高了系統的抗干擾能力。在通信中采用了TWI 中斷,合理安排事件處理時間,有效提高了程序的運行效率。
[1]ATmega8 Datasheet[Z]. ATMEL Corporation.
[2]馬潮,詹衛前,耿德根,等.ATmega8 原理及應用手冊[M].北京:清華大學出版社,2002.
[3]郭祥軍.AVR 單片機的TWI 總線的原理及應用[J].單片機與嵌入式系統應用,2006(8):37-39.
[4]楚天鵬,鄭華耀.TWI 接口多機通信的實現[J].裝備制造技術,2008(6):96-98.
[5]AVR315: Using the TWI module as I2C master[OL]. www.atmel.com.
[6]汪海波,王卓然,耿德根,等.深入淺出AVR 單片機[M].北京:中國電力出版社,2008.
[7]AVR311: Using the TWI module as I2C slave[OL]. www.atmel.com.