TWI:ATMega
系列單片機內集成兩線制串行接口模塊,ATmegl文檔稱為TWI接口事實上TWI與PHILIOS的I2C總線是同一回事,之所以叫它TWI是因為這樣命名可使ATmel避免交術語版稅。所以,TWI是兼容I2C的一種說法。
I2C總線最只要的優點是其簡單性和有效性。由于接口直接在組件之上,因此I2C總線占用的空間非常小,減少了電路板的空間和芯片管腳的數量,降低了互聯成本。總線的長度可高達25英尺,并且能夠以10KPS的最大傳輸率支持40個組件,I2C總線的另一個優點是,它支持多主控(MULTIMASTERING),其中任何能夠進行發送和接受的設備都可以稱為主總線,一個主控能夠控制信號的傳輸和時鐘頻率。當然,在任何時間點上只能有一個主控。
I2C總線是由數據線SDA和時鐘線SCL構成的串行總線,可發送和接受數據。在CPU與被控IC之間、IC與IC之間進行雙向傳送、最高傳送速率100KBPS.各種被控制電路均并聯在這條總線上,最高傳送速率100KBPS.各種被控制電路均并聯在這條總線上,但就像電話機一樣只有撥通各自的號碼才能工作,所以每個電路和模塊都有唯一的地址,在信息的傳輸過程中,I2C總線并接的每一模塊電路既是主控器(或被控器),又是發送器(或接收器),這取決于它所要完成的功能,CPU發出的控制信號分為地址碼和控制量兩部分,地址碼用來選址,即接通需要控制的電路,確定控制的種類;控制量決定調整的類別(如對比度、亮度等)及需要調整的量。這樣各控制電路雖然掛在同一條總線上,卻彼此獨立,互不相關。
oI2C總線在傳送數據過程中共有三種類型信號,
它們分別是:開始信號、結束信號和應答信號。
o開始信號:SCL為高電平時,SDA由高電平向低電平跳變,開始傳送數據。
o結束信號:SCL為高電平時,SDA由低電平向高電平跳變,結束傳送數據。
o應答信號:接收數據的IC在接收到8bit數據后,向發送數據的IC發出特定的低電平脈沖,表示已收到數據。CPU向受控單元發出一個信號后,等待受控單元發出一個應答信號,CPU接收到應答信號后,根據實際情況作出是否繼續傳遞信號的判斷。若未收到應答信號,由判斷為受控單元出現故障。
o這些信號中,起始信號是必需的,結束信號和應答信號,都可以不要。
發送地址跟上面右邊那個兩個發送數據 0
1
是一樣的由時鐘來鎖存相應的數據位,地址共七位,第8位是讀還是寫狀態,讀的話置1 寫 置0
。第9位是應答為,切記應答位不是單片機發出的,而是I2C器件發出的。應答位是這樣產生的,I2C器件在接收到完整的8位數據之后,I2C器件判定接受成功,它會向總線發送一個應答信號,可以看到就是在一個時鐘脈沖期間,數據線SDA保持低電平就是0,當然發送完地址位之后呢?就發送數據,長度可能是可能1個字節或多個字節。數據的個數跟器件是有關系的。比如AT24C02
EEPROM芯片對他進行讀寫操作 如寫可以進行1 2
4 8 字節,當地址數據結束后來一個結束信號。表示這一幀結束了。
下面說下ATmega 16 的TWI模塊。下圖 (由于ATmega 16 的技術文檔講的比較詳細了,所以我們也結合atmege 16
的數據手冊說了)。
這是兩線的一些特點:(自己翻一下吧)
一、簡單,但是強大而靈活的通訊接口,只需兩根線
二、支持主機和從機的操作
三、器件可以工作于發送或接受
四、7位地址空間允許128個從機
五、高達400KHZ的數據傳輸率
六、斜率受控制的輸出驅動器
七、可以抑制總線的尖峰噪聲控制器
八、完全可變成的從機地址以及公共地址
九、睡眠時地址匹配可以喚醒AVR
首先看下數據傳輸和幀格式下圖(傳輸 數據 (位))
(TWI總線上數據位的傳送與時鐘脈沖同步。時鐘線為高時,數據線電壓必須保持穩定,除非在啟動與停止的狀態下。官方的解釋)
其實這個圖說明在SCL為高電平期間 SDA 數據必須穩定0 或1
當然還有起始位與停止位如下圖
(翻譯如下)
{
主機啟動與停止數據傳輸。主機在總線上發出START信號以啟動數據傳輸;在總線上發出STOP信號以停止數據傳輸。在START與STOP
狀態之間,需要假定總線忙,不允許其它主機控制總線。特例是在START與STOP
狀態之間發出一個新的START狀態。這被稱為REPEATED
START狀態,適用于主機在不放棄總線控制的情況下啟動新的傳送。在REPEATED
START之后,直到下一個STOP,需要假定總線處于忙的狀態。這與START是完全一樣的,因此在本手冊中,如果沒有特殊說明,START與REPEATEDSTART均用START表述。如下所示,START與STOP狀態是在SCL線為高時,通過改變SDA電平來實現的。
}
開始停止時序圖
像這個圖中間的一些開始停止和從新開始在絕大數都是用不到的。就不細說了。
下圖是地址數據包格式(好好看看是 地址數據的講解)
翻譯下:所有在TWI總線上傳送的地址包均為9位,包括7位地址位、1位READ/WRITE控制
位與1位應答位。如果READ/WRITE為1,則執行讀操作;否則執行寫操作。從機被尋
址后,必須在第九個SCL (ACK)周期通過拉低SDA作出應答。若該從機忙或有其它原因
無法響應主機,則應該在ACK周期保持SDA為高。然后主機可以發出STOP狀態或
REPEATED START 狀態重新開始發送。地址包包括從機地址與分別稱為SLA+R或
SLA+W的READ或WRITE位。
地址字節的MSB首先被發送。從機地址由設計者自由分配,但需要保留地址0000 000
作為廣播地址。
當發送廣播呼叫時,所有的從機應在ACK周期通過拉低SDA作出應答。當主機需要發送
相同的信息給多個從機時可以使用廣播功能。當Write位在廣播呼叫之后發送,所有的從
機通過在ACK周期通過拉低SDA作出響應。所有的從機接收到緊跟的數據包。注意在整
體訪問中發送Read位沒有意義,因為如果幾個從機發送不同的數據會帶來總線沖突。
所有形如1111 xxx格式的地址都需要保留,以便將來使用。
地址包格式圖下圖:
這個圖從右邊往左邊看先發送的最高位 最后發的是低位。 從 1---9 最后一位 ACK 響應。
下面是數據包下圖
官方解釋
可見數據包是8位數據加一個應當位。
下圖是地址和數據包一個完整的傳輸。組合一起
SLA +RW 就是地址數據 的傳送的字節數由應用程序的協議決定。
1個字節 2 4 8
個字節數據。
下圖是多主機總線系統如圖(這個大部分場合用不到所以不用看 以后可以了解下)
解釋
下面講解下TWI 模塊的使用方法:如圖構成
首先看下SCL SDA
有兩個引腳 是在22
與23 腳 PC0 PC1 下面是這兩腳的說明
還有一個波特率發聲單元與USART相似 他控制SCL
的時鐘周期,當然這個比特率有兩個寄存器決定,TWBR
TWPS 有SCL frequency
公式的。CPU的單片機晶振頻率 除以 16加上2倍的TWBR
乘以4的TWPS它的次數注意:如果工作在主機模式不應該小于10 下面有解釋
下面是總線的接口單元主要包括一些寄存器總線總裁。我們沒必要關心然后又一個地址匹配單元看下啊(只有在多級通訊時候多個單片機進行I2C通訊時候我們給每個單片機設置一個本機地址如果匹配了表示發給自己的,初學者一般也不看)最下面是控制器有圖都復制上來吧!還有官方中文解釋。
解釋有下圖
其實都不重要我們要TWI 寄存器它的使用是重要的。呵呵開始講吧!最終我們的應用都是對這些寄存器操作。
首先是比特率上面有公式第一個寄存器

這個是控制寄存器非常重要。
第二個寄存器
TWCR
首先是第7位 TWINT: TWI 中斷標志
在什么時候產生中斷呢?當發送完 地址包 數據包 ,注意這一位清0呢。必須手動清0
必須通過軟件寫1,不像其他的中斷能夠自動置1.
第6位 (使能TWI 應答)這個TWEA 在多級通訊時候,就是有其他的I2C器件向AVR單片機發送數據,這時候AVR
單片機在接受到一幀數據之后,它會發送一個應答位,也就是使能這位后,向發送放返回一個應答位這種信息。

官方解釋

第5位(是一個狀態標志位,TWSTA它表示的是TWI START 這個信號。第4位 和第5位都是多級通訊用的到的。)
官方解釋
第3位:TWWC 是TWI 的寫碰撞標志。
就是標志出TWDR 數據寄存器是否可以寫。如果為低的時候可以寫數據
第2位:TWI 使能。置位此位TWI 。如果使用TWI模塊此位必須模塊激活。
第1位:是保留位沒有作用的。
第0位:TWIE 使能TWI 中斷。 (要中斷方式使用TWI 總線的的話就要使能這個位 置位)
第3個寄存器:狀態寄存器
它的第7位到第3位
5位反應TWI邏輯總線的狀態,不同的狀態的狀態代碼會在后面部分描述,所以我們在讀取這5位狀態代碼的時候,讀取方法就是先讀取這個寄存器然后通過與這個0b11111000將最后兩位屏蔽掉因為TWPS是預分頻位,在比特率發生器里面是有作用的,有公式的
4的指數
第四個寄存器:TWDR (類似于USART
SPI 的數據寄存器差不多的)
發送模式包含 字節,接受模式包含接受到的數據。
第五個寄存器:TWAR
從機地址寄存器
(多級通訊用的到)
如何使用TWI
其實這個圖跟一次完整數據傳輸類似的。所有的不同在這第
3個階段結束的時候有一個TWI中斷觸發也就是TWINT這一位被置位,可以用于觸發中斷。
第一步 :向TWCR 寫一個1 使能一個START 信號。就是通過TWCR
寄存器的內容進行一個發START信號的操作。發送成功之后會有一個TWINT中斷,在中斷里面SCL時鐘不采取任何動作的。
第二步:在中斷里面通過查詢 status code 就是那五位數據看是何種狀態,來確定是start
發送完成中斷。
第三步:發送一個地址包,就是程序將SLA(從機地址)
+W (讀寫位)就是7位從機地址加1位讀寫位,寫入到TWDR 數據寄存器對這些寄存器進行一些確認操作。
第四步:在數據包發送完成和接受到ACK信號之后繼續等待第2個中斷。接收到ACK信號之后呢TWINT會置位 。
第五步:再處理一次中斷,在這個中斷里寫入數據字節,也是8位數據
第六步:8位數據發送成功接受到ACK TWINT 會再次置位,那么這個 status
code 會指示出發送完成。當然這只是發送一個字節數據,如果發送多個數據這個過程會持續多次,一直到數據發送完成。
第七步:接受完成之后且接收到ACK
我們這里會發送一個STOP信號,也是通過寫TWCR寄存器來實現的。當然STOP發送成功之后不會觸發中斷。值得注意的是中間如果進行多字節的讀或寫的話發送的字節數是由編程來把握的,也就是說AVR單片機不會知道你要發多少個字節。所以這個處理相當于在第7步這里。如果我們程序判斷我們程序已經發送完畢,我們就發一個STOP信號若如果,沒有就重復一下第五步。這就是ATmega
16的TWI總線的使用方法。下面我們結合24c02一個實際的程序來給大家吹吹牛。
oAT24C02是由ATMEL公司提供的,I2C總線串行EEPROM,其容量為2Kbit(256B),工作電壓在2.7V~5.5V之間,生產工藝是CMOS工藝。
各引腳功能如下。
A2~A0:器件地址選擇引腳。將這3個引腳配置成不同的編碼值,在同一串行總線上最多可擴充8片同一容量或不同容量的24系列串行EEPROM芯片。
SDA:串行數據輸入輸出口,是一個雙向的漏極開路結構的引腳,容量擴展時可以將多片24系列的SDA引腳直接相連。
SCL:串行移位時鐘控制端。寫入時上升沿起作用,讀出時下降沿起作用。
WP:硬件寫保護控制引腳。當其為低電平時,正常寫操作,高電平時,對EEPROM部分存儲區域提供硬件寫保護功能,即對被保護區域只能讀不能寫。
GND:接地。
VCC:接+5V電壓
2k位 256*8 =
2K
等于256b
地址值相當于低三位 0 1 2 組合 8個數字
7 硬件寫保護 低電平 可以正常寫操作 高 的話只能讀 所以我們接地OK了
它的相關電路設計如下圖
我們設置的時候都會將他的地址值變為0 0 1 2 全接地線 ,5 6
PC0 PC1 因為第2功能是TWI 總線
0.1uf進行電源退耦,一般數字芯片 高速的數字時鐘對所在電源產生干擾。凈化電源。
容量計算方法
AT24Cxx:01~1024
容量=xx X 1Kbit
型號系列列表
AT24C01 1K(128X8)
AT24C02 2K(256X8)
AT24C04 4K(512X8)
AT24C08 8K(1KX8)
AT24C16 16K(2KX8)
AT24C512 512K(64KX8)
AT24C1024 1M(128KX8)
值得一提是AVR單片機片上自帶EEPROM
芯片,而且是1K字節相當于24C08這個容量。而我們24c02實際應用并不大。當然有一些應用場合必須外置的。因為是學習板,因為這個芯片比較常見,學習I2C總線的作用。
下圖為總體的操作流程
寫
與讀的操作流程和上面的7步可以對比下。器件地址的表示方法等下講一下。器件地址的高4位是0xa0
1010 低四位 前3位就是 a0 a1
a2 第4位是
讀寫地址 然后等待ACK 。
數據地址相當于數據 在256字節的 存儲器里面的編址,它處于數據包的一部分是8位的。
所以這個是寫是 地址一個
數據2 個
數據1是數據所處的地址 第2是數據的內容
這就是寫一字節的操作流程。
右邊是讀類似。
讀出的是多個字節 循環判斷是否是最后一個字節,而24c02是 ACK 就是ACK 來產生的,最后產生一個停止位
所以這個讀操作相當于是 地址包1個字節 數據包是多個字節。
下面結合程序來大家講解AT24C02應用。
打開整體測試板程序 我沒有哦
# 需要此頭文件