新聞中心

TWI接口

作者: 時(shí)間:2016-12-12 來(lái)源:網(wǎng)絡(luò) 收藏
在AVR系列單片機(jī)中內(nèi)嵌有一個(gè)TWI(Two-wire Serial Interface)接口,它實(shí)際上就是IIC總線接口。IIC是一種多向控制總線,它是由PHILIPS公司在二十世紀(jì)八十年代初設(shè)計(jì)出來(lái)的,利用該總線可實(shí)現(xiàn)多主機(jī)系統(tǒng)所需的裁決和高低速設(shè)備同步等功能,是一種高性能的串行總線。IIC總線的連接方式如下圖所示。它只用兩根雙向傳輸線就可以將128個(gè)不同的設(shè)備互連到一起。這兩根線一根是時(shí)鐘線SCL,一根是數(shù)據(jù)SDA。外部硬件只需要兩個(gè)上拉電阻,每根線上一個(gè)。所有連接到總線上的設(shè)備都有自己的地址。

本文引用地址:http://butianyuan.cn/article/201612/328731.htm

總線的速度有兩個(gè)不同的規(guī)范,一種的速度低于100kHz,而另外一種的速度高達(dá)400kHz,總線間的電容不能大于400pF。所有TWI兼容的器件的總線驅(qū)動(dòng)都應(yīng)該是漏極開路或集電極開路的結(jié)構(gòu),這樣就可以實(shí)現(xiàn)線與的功能。TWI器件在輸出為0時(shí),TWI總線會(huì)產(chǎn)生低電平。當(dāng)所有的TWI器件輸出為三態(tài)時(shí),總線會(huì)輸出高電平,如果接有上拉電阻電壓將會(huì)被拉高。

TWI總線上傳輸?shù)臄?shù)據(jù)是通過在時(shí)鐘線(SCL)高電平期間對(duì)應(yīng)的數(shù)據(jù)線(SDA)上的電平來(lái)判別的??赏ㄟ^下圖來(lái)描述。

在上圖中,當(dāng)SCL拉高期間對(duì)應(yīng)的SDA的電平,如果是高則這位數(shù)據(jù)就是1,反之則是0。只有在SCL為低電平期間,SDA才可以更新下一位的數(shù)據(jù)。TWI總線上數(shù)據(jù)的傳送就是通過SCL為高時(shí)對(duì)應(yīng)到的SDA的值來(lái)構(gòu)成的。顯然,SCL的頻率決定了數(shù)據(jù)傳送的速度。

除了傳送的數(shù)據(jù)以外,在每一幀數(shù)據(jù)傳送之前,還會(huì)有一個(gè)啟動(dòng)信號(hào),以通知從機(jī)準(zhǔn)備接收數(shù)據(jù)。在數(shù)據(jù)傳送結(jié)束之后,也會(huì)有一個(gè)停止信號(hào),以通知從機(jī)數(shù)據(jù)傳輸結(jié)束。啟動(dòng)信號(hào)是這樣來(lái)定義的,在SCL為高電平期間,若對(duì)應(yīng)的SDA線上有一個(gè)由高變低的電平下跳沿,則表示這是一個(gè)啟動(dòng)信號(hào)。同樣,停止信號(hào)是這樣定義的,在SCL為高電平期間,若對(duì)應(yīng)的SDA線上有一個(gè)由低變高的電平上跳沿,則表示這是一個(gè)停止信號(hào)。為了形成啟動(dòng)或停止信號(hào),必須在判別該信號(hào)的SCL拉高之前做好電平準(zhǔn)備,比如要形成一個(gè)停止信號(hào),必須在SCL為低電平期間把SDA上的電平拉低,以便在緊跟著后面的SCL高電平期間把SDA的電平拉低,形成一個(gè)停止信號(hào)。當(dāng)已經(jīng)有一個(gè)啟動(dòng)信號(hào)之后,在沒有停止信號(hào)出現(xiàn)之前若再次出現(xiàn)啟動(dòng)信號(hào),則表示該信號(hào)是一個(gè)重新啟動(dòng)信號(hào),它主要用于在主機(jī)不放棄總線控制的情況下啟動(dòng)新的傳送。上述整個(gè)過程可用下圖來(lái)描述。

通過上述討論,說(shuō)明了TWI總線的數(shù)據(jù)位傳送與時(shí)鐘脈沖是同步的。除了啟動(dòng)與停止?fàn)顟B(tài)之外,當(dāng)時(shí)鐘線為高電平時(shí),數(shù)據(jù)線上的電壓(不論是高還是低)必須保持穩(wěn)定,否則有可能被識(shí)別成停止信號(hào)或重新開始的信號(hào)。

下面來(lái)看TWI總線是如何尋址的。在啟動(dòng)信號(hào)之后緊接著的就是地址幀,所有的地址包均為9位,包括7位地址位、1位READ/WRITE控制位(即方向位,表明是主機(jī)寫從機(jī)還是從機(jī)寫主機(jī))與1位應(yīng)答位。如果READ/WRITE為1,則執(zhí)行讀(從機(jī)寫主機(jī))操作;否則執(zhí)行寫(主機(jī)寫從機(jī))操作。從機(jī)被尋址后,必須在第九個(gè)SCL(ACK)周期通過拉低SDA作出應(yīng)答。發(fā)送地址時(shí)先發(fā)送高位后發(fā)送低位,地址字節(jié)的MSB(數(shù)據(jù)的最高位)先被發(fā)送,從機(jī)地址由用戶自行分配,但要避開保留的廣播地址(即地址0000000)。地址的傳輸格式可用下圖來(lái)描述。

地址發(fā)送后,就要發(fā)送數(shù)據(jù)包。所有在TWI總線上傳送的數(shù)據(jù)包為9位長(zhǎng),包括8位數(shù)據(jù)位及1位應(yīng)答位。在數(shù)據(jù)傳送中,主機(jī)產(chǎn)生時(shí)鐘及START與STOP狀態(tài),而接收器響應(yīng)接收。應(yīng)答是由從機(jī)在第9個(gè)SCL周期拉低SDA實(shí)現(xiàn)的。如果接收器在第9個(gè)SCL周期使SDA為高,則是發(fā)出NACK信號(hào)。NACK信號(hào)是在接收器在完成了最后數(shù)據(jù)的接收,或者由于某些原因無(wú)法接收更多的數(shù)據(jù)時(shí),才在收到最后的字節(jié)后發(fā)出去告知發(fā)送器的。數(shù)據(jù)的傳輸格式可用下圖來(lái)描述。
下面來(lái)看,如何將地址包和數(shù)據(jù)包組合為一個(gè)完整的傳輸過程。發(fā)送主要由START狀態(tài)、SLA+R/W、至少一個(gè)數(shù)據(jù)包及STOP狀態(tài)組成。只有START與STOP狀態(tài)的空信息是非法的。當(dāng)主機(jī)設(shè)定的時(shí)鐘速度相對(duì)于從機(jī)太快,或從機(jī)需要額外的時(shí)間來(lái)處理數(shù)據(jù)時(shí),從機(jī)可通過拉低SCL來(lái)延長(zhǎng)SCL低電平的時(shí)間。從機(jī)延長(zhǎng)SCL低電平的時(shí)間不會(huì)影響SCL高電平的時(shí)間,因?yàn)镾CL高電平時(shí)間是由主機(jī)決定的。一個(gè)典型的數(shù)據(jù)傳送的過程可用下圖來(lái)描述。
要注意一點(diǎn),SLA+R/W與STOP之間傳送的字節(jié)數(shù)由應(yīng)用程序的協(xié)議決定。
下面來(lái)看AVR內(nèi)部的TWI模塊,它是由幾個(gè)子模塊組成,其內(nèi)部結(jié)構(gòu)圖如下。

在上圖中,位于粗線之中的寄存器可以通過程序進(jìn)行訪問。SCL與SDA為MCU的TWI接口引腳。引腳的輸出驅(qū)動(dòng)器包含一個(gè)波形斜率限制器以滿足TWI的信號(hào)規(guī)范。引腳的輸入部分包括尖峰抑制單元以去除小于50ns的毛刺干擾。當(dāng)相應(yīng)的端口被設(shè)置為SCL與SDA引腳時(shí),可以使能I/O口內(nèi)部的上拉電阻,這樣可省掉外部的上拉電阻。

當(dāng)TWI工作于主機(jī)模式時(shí),比特率發(fā)生器(上圖中的Bit Rate Generator部分)控制時(shí)鐘信號(hào)SCL的周期。具體的值由TWI狀態(tài)寄存器TWSR(上圖中的Control Unit部分內(nèi))的預(yù)分頻系數(shù)以及比特率寄存器TWBR(上圖中的Bit Rate Generator部分內(nèi))設(shè)定。可通過下面的公式來(lái)計(jì)算。

式中,TWBR是TWI比特率寄存器的數(shù)值,TWPS是TWI狀態(tài)寄存器預(yù)分頻的數(shù)值。TWI工作在主機(jī)模式時(shí),TWBR值應(yīng)該不小于10。否則主機(jī)會(huì)在SDA與SCL產(chǎn)生錯(cuò)誤輸出作為提示信號(hào)。

當(dāng)TWI工作在從機(jī)模式時(shí),不需要對(duì)比特率或預(yù)分頻進(jìn)行設(shè)定,但從機(jī)的CPU時(shí)鐘頻率必須大于TWI時(shí)鐘線SCL頻率的16倍。

在上圖中,還有一個(gè)總線接口(上圖中的Bus Interface Unit部分)。它包含有數(shù)據(jù)與地址移位寄存器TWDR,START/STOP控制器和總線仲裁判定硬件電路。TWDR寄存器用于存放發(fā)送或接收的數(shù)據(jù)或地址。除了8位的TWDR外,總線接口單元還有一個(gè)寄存器,包含了用于發(fā)送或接收應(yīng)答的(N)ACK。這個(gè)(N)ACK寄存器不能由程序直接訪問。當(dāng)接收數(shù)據(jù)時(shí),它可以通過TWI控制寄存器TWCR來(lái)置位或清零;在發(fā)送數(shù)據(jù)時(shí),(N)ACK值由TWCR的設(shè)置來(lái)決定。START/STOP控制器負(fù)責(zé)產(chǎn)生和檢測(cè)TWI總線上的START、REPEATEDSTART與STOP狀態(tài)。即使在MCU處于休眠狀態(tài)時(shí),START/STOP控制器仍然能夠檢測(cè)TWI總線上的START/STOP條件,當(dāng)檢測(cè)到自己被TWI總線上的主機(jī)尋址時(shí),將MCU從休眠狀態(tài)喚醒,這一功能在節(jié)電時(shí)非常必要。

接下來(lái)是地址匹配單元(上圖中的Address Match Unit部分)。地址匹配單元將檢測(cè)從總線上接收到的地址是否與TWAR寄存器中的7位地址相匹配。如果TWAR寄存器的TWI廣播應(yīng)答識(shí)別使能位TWGCE為1,從總線接收到的地址也會(huì)與廣播地址進(jìn)行比較。一旦地址匹配成功,控制單元將得到通知以進(jìn)行正確地響應(yīng)。TWI可以響應(yīng),也可以不響應(yīng)主機(jī)的尋址,這取決于TWCR寄存器的設(shè)置。即使MCU處于休眠狀態(tài)時(shí),地址匹配單元仍可繼續(xù)工作。一旦主機(jī)尋址到這個(gè)器件,就可以將MCU從休眠狀態(tài)喚醒。

最后一個(gè)部分是控制單元,它監(jiān)聽TWI總線,并根據(jù)TWI控制寄存器TWCR的設(shè)置作出相應(yīng)的響應(yīng)。當(dāng)TWI總線上產(chǎn)生需要應(yīng)用程序干預(yù)處理的事件時(shí),TWI中斷標(biāo)志位TWINT置位。一旦TWINT標(biāo)志位置1,時(shí)鐘線SCL的電平即被拉低,暫停TWI總線上的數(shù)據(jù)傳輸,讓用戶程序處理事件。在下列狀況出現(xiàn)時(shí),TWINT標(biāo)志位會(huì)被置位。

1、在TWI傳送完START/REPEATED START信號(hào)之后
2、在TWI傳送完SLA+R/W數(shù)據(jù)之后
3、在TWI傳送完地址字節(jié)之后
4、在TWI總線仲裁失敗之后
5、在TWI被主機(jī)尋址之后( 廣播方式或從機(jī)地址匹配)
6、在TWI接收到一個(gè)數(shù)據(jù)字節(jié)之后
7、作為從機(jī)工作時(shí),TWI接收到STOP或REPEATED START信號(hào)之后
8、由于非法的START或STOP信號(hào)造成總線錯(cuò)誤時(shí)



關(guān)鍵詞: TWI接口IIC總線接

評(píng)論


技術(shù)專區(qū)

關(guān)閉