<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > I2C接口進(jìn)入busy狀態(tài)不能退出

I2C接口進(jìn)入busy狀態(tài)不能退出

作者: 時(shí)間:2016-12-13 來(lái)源:網(wǎng)絡(luò ) 收藏

問(wèn)題:該問(wèn)題發(fā)生在 STM32F103VDT6 器件上。在其產(chǎn)品設計中,使用了 STM32 的一個(gè) I2C 接口與一個(gè) EEPROM 通信。在系統靠性測試中發(fā)現,經(jīng)過(guò)長(cháng)時(shí)間運行后,STM32 會(huì )出現不能讀寫(xiě) EEPROM 的現象。通過(guò) NRST 管腳對 STM32 進(jìn)行復位,復位后該現象依舊存在。關(guān)掉電源,然后重新上電,現象消失。通過(guò)進(jìn)一步測試發(fā)現,如果對 STM32反復做復位操作,會(huì )很容易復現 這一現象。

本文引用地址:http://dyxdggzs.com/article/201612/329277.htm

調研:修改軟件,通過(guò)打印監控 I2C 通信程序的流程,及 I2C 接口的各個(gè)寄存器的狀態(tài)。當出現上述現象時(shí),I2C接口的狀態(tài)寄存器 SR2中的 Busy 位置‘1’,狀態(tài)寄存器 SR1 中的 ARLO 位置‘1’。用示波器觀(guān)察 I2C 總線(xiàn),發(fā)現其 SCL 為高電平,SDA 為低電平。將 STM32 的復位腳拉到地,SCL 及 SDA 的狀態(tài)不變。檢查原理圖,確認 I2C 總線(xiàn)上只有 STM32 和 EEPROM 兩顆器件。

結論:EEPROM 驅動(dòng) I2C 總線(xiàn)進(jìn)入了非空閑狀態(tài),使得 STM32 在接管總線(xiàn)時(shí)發(fā)生總線(xiàn)仲裁失敗,進(jìn)而失去對總 線(xiàn)的控制,無(wú)法啟動(dòng)數據的傳輸。EEPROM 的這種狀態(tài)可能是通信被意外中斷造成的。通過(guò)對 STM32 進(jìn)行復位而重現這一現象,在一定程度上吻合了這種猜測。但沒(méi)有實(shí)驗和理論依據證實(shí)一定是該原因 導致了這一問(wèn)題,是否還有其它原因在起作用,不得而知。

處理:修改軟件,加入對 I2C 總線(xiàn)修復的功能。在每次發(fā)送起始條件之前首先檢測 SR2 中 Busy 位,如果為 ‘1’,則說(shuō)明總線(xiàn)上有異常。此時(shí),可由 GPIO 的 OD 模式代替 I2C 通信口接管 SCL 及 SDA 兩個(gè)管 腳。通過(guò)翻轉 GPIO,向 SCL 信號線(xiàn)上發(fā)高電平脈沖,脈沖寬度及間隔勻為 10uS。每發(fā)出一個(gè)脈沖之 后,檢測 SDA 信號是否為高電平。若 SDA 信號為已高電平,則將 SCL 拉高,然后向 SDA 信號線(xiàn)發(fā) 出一個(gè) 10uS 寬的低電平脈沖。然后將 SCL 及 SDA 兩個(gè)管腳交還給 I2C 接口,并通過(guò)將 CR1 中的 SWRST 位置‘1’后再清‘0’來(lái)復位 I2C 接口,使其退出 Busy 狀態(tài)。如圖(一)所示:

A. 將 SCL 和 SDA 切換成 GPIO 的 OD 模式;

B. 發(fā)送時(shí)鐘脈沖并等待 SDA 跳變到高電平;

C. 在 SDA 上發(fā)出一個(gè)低電平脈沖;

D. 在 SDA 拉高后,將 SCL 的 SDA 切換回 I2C 接口;

E. 通過(guò) CR1 中的 SWRST 位復位 I2C 接口;

建議:STM32 中的 I2C 接口被設計成為主從自適應接口,并充許多個(gè)主機共享一條 I2C 總線(xiàn)。I2C 接口在被使 能之后,會(huì )不斷的檢測 SCL 及 SDA 的電平與跳變。當發(fā)現有低脈沖出現在 SCL 或 SDA 上時(shí),則認 為總線(xiàn)進(jìn)入了 Busy 狀態(tài),其 Busy 標志會(huì )置‘1’,直到在總線(xiàn)上檢測到一個(gè)符合要的停止條件之 后,才認為總線(xiàn)回到了空閑狀態(tài),這時(shí)由硬件清除 Busy 標志。當 I2C 接口認為總處于 Busy 狀態(tài)且不 是由自己占用時(shí),會(huì )拒絕向總線(xiàn)上發(fā)送信號,因為它認為此刻 I2C 總線(xiàn)正在被其它的主機所使用。這時(shí) 向 I2C 接口發(fā)命令,要求產(chǎn)生起始條件,會(huì )導致總線(xiàn)仲裁失敗。要從這種狀態(tài)退出,首先要保證總線(xiàn)是 處于空閑狀態(tài),即 SCL 和 SDA 都為高電平。然后,通過(guò)將 CR1 的 SWRST 置‘1’然后清‘0’來(lái)復 位 I2C 接口,以達到清除 Busy 標志回到空閑狀態(tài)目的。



關(guān)鍵詞: I2C接口busy狀

評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>