2C通訊協(xié)議具有運(yùn)行可靠、成本低廉、占用IO資源少等優(yōu)點(diǎn),廣泛應(yīng)用于多級(jí)通訊中;中穎芯片硬件TWI(兩線串行接口)接口完全兼容I2C總線協(xié)議。中穎芯片硬件TWI支持功能:
- 開漏輸出,通訊電平不受VDD影響;支持主機(jī)模式和從機(jī)模式;各個(gè)模式均支持發(fā)送和接受;支持多級(jí)通訊的仲裁功能;具有SCL低電平/高電平超時(shí)判斷;器件地址可編程,帶多個(gè)地址屏蔽位,支持廣播功能;支持標(biāo)準(zhǔn)模式(100K)和快速模式(400K);支持Clock Stretch功能支持內(nèi)部上拉電阻功能
中穎芯片硬件TWI注意事項(xiàng):
- 硬件TWI在傳輸ACK/NACK響應(yīng)信號(hào)時(shí),在SCL由低跳高后產(chǎn)生TWI中斷標(biāo)志(TWINT),并在SCL由高跳低時(shí)拉低SCL,在TWI中斷標(biāo)志清除后釋放SCL;TWI中斷標(biāo)志(TWINT)在被清除前,TWI通訊會(huì)暫停,應(yīng)用程序必須在TWI中斷標(biāo)志(TWINT)清除前決定后續(xù)的動(dòng)作;硬件TWI規(guī)定通訊過(guò)程中SCL總線維持高電平超過(guò)TFREE定義的時(shí)鐘個(gè)數(shù)時(shí)為“空閑”狀態(tài),釋放總線;此功能無(wú)法關(guān)閉。硬件TWI規(guī)定參與傳輸?shù)乃衅骷?,將時(shí)鐘線SCL維持低電平超過(guò)CNT定義的時(shí)鐘個(gè)數(shù)時(shí)為“總線超時(shí)”,釋放總線;此功能無(wú)法關(guān)閉。
硬件TWI通訊注意事項(xiàng):
- TWI中斷標(biāo)志(TWINT)置起后,軟件配置TWI即將執(zhí)行的動(dòng)作(如發(fā)送數(shù)據(jù)、回應(yīng)ACK/NACK、發(fā)送STO/清除STA信號(hào)等)后方可清除TWI中斷標(biāo)志(TWINT);硬件TWI作為從機(jī)時(shí),在每次通訊開始前,提前將應(yīng)答信號(hào)準(zhǔn)備好(AA=1);為了增強(qiáng)通訊抗干擾能力,程序中建議增加SCL高電平超時(shí)判斷、總線超時(shí)判斷、特殊狀態(tài)機(jī)(00H)判斷;
硬件TWI操作流程示意圖:
硬件TWI出錯(cuò)案例:
- 硬件TWI通信錯(cuò)誤(從機(jī))原因:外界存在干擾。當(dāng)從機(jī)TWI狀態(tài)機(jī)為B8時(shí),從機(jī)繼續(xù)向主機(jī)發(fā)送數(shù)據(jù),且準(zhǔn)備NACK信號(hào),此時(shí)若外接干擾造成從機(jī)識(shí)別主機(jī)回傳的信號(hào)非正常信號(hào),則從機(jī)狀態(tài)機(jī)會(huì)跳到非正常狀態(tài)機(jī)中,此時(shí)程序中未對(duì)應(yīng)答信號(hào)做處理,造成當(dāng)此輪通訊結(jié)束后,在開始下一輪通訊時(shí),從機(jī)無(wú)ACK信號(hào)造成無(wú)法響應(yīng)主機(jī)通訊。TWI默認(rèn)開啟SCK高電平超時(shí)功能,待發(fā)送完最后一個(gè)字節(jié),此時(shí)AA清零;此時(shí)若存在因主機(jī)通訊或干擾造成SCK高電平超時(shí)時(shí),TWI模塊會(huì)自動(dòng)釋放總線,此時(shí)AA仍然保持為之前的NACK狀態(tài),造成在下一輪通訊時(shí)無(wú)法響應(yīng)主機(jī)通訊,通訊異常;
改善方案:在傳輸完成最后一個(gè)字節(jié)數(shù)據(jù)后AA置位,這樣即使發(fā)生異常情況,待下一組時(shí)序到來(lái)時(shí),從機(jī)仍能夠正常響應(yīng)主機(jī);在程序其他異常狀態(tài)下置位AA,即使通信受到干擾,跳轉(zhuǎn)到異常狀態(tài),仍能進(jìn)行下一次的通訊響應(yīng)。下圖列出TWI中斷代碼改善前后的代碼。
圖1改善前
圖2改善后