TWI接口
總線的速度有兩個(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)描述。
在上圖中,位于粗線之中的寄存器可以通過程序進(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í)
評(píng)論