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

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

官方解釋

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