在一個評論中,看到網友對硬件I2C的討論,硬件I2C Busy找不到原因、軟件I2C穩得一批。
那么為什么會出現I2C BUSY?硬件I2C真的不如軟件I2C嗎?怎么讓硬件I2C也穩得一批,讓我們來一探究竟。
首先我們從I2C時序分析下I2C總線掛死是如何產生的。
我們來看下I2C的時序和流程:
![wKgZomXX9piAC-JfAABf-fjP0y0517.png](https://file1.elecfans.com/web2/M00/C0/B0/wKgZomXX9piAC-JfAABf-fjP0y0517.png)
![wKgaomXX9p6AdZ9vAABj3Ag6XSg389.png](https://file1.elecfans.com/web2/M00/C1/9D/wKgaomXX9p6AdZ9vAABj3Ag6XSg389.png)
所以總線掛死可能會有幾個原因:
1、主機信號掛死了:
主機IO口損壞、I2C狀態機異常軟件死機
2、主機程序異常:
I2C通信需要主機來主導,主機軟件本身異常了I2C信號也不會繼續產生。
3、從機拉死了總線:
I2C是線與的,所以從機拉低后總線也掛了,主機無法再次拉高發起新的通信。這種情況一般在信號被干擾時從機丟失clock或者增加了clock導致雙方時序沒對齊,從機還維持住一個發送0 bit的狀態就把SDA拉低了。
首先原因1和2是和程序相關,I2C的狀態機流程較多,自行編寫驅動確實容易出現問題,只要使用成熟驅動就可以。大家可以直接使用紅楓派的I2C驅動就避免這類問題,紅楓派的驅動可靠性不比原廠驅動低,經受RTOS、多中斷、干擾等全方面打擊。
![wKgZomXX9qSAORzqAAAowZ6DO9Y088.png](https://file1.elecfans.com/web2/M00/C0/B0/wKgZomXX9qSAORzqAAAowZ6DO9Y088.png)
對于原因3,既然是干擾多了clock和少了clock導致從機維持拉低SDA的狀態,那我們補齊clock結束這次異常通信不就可以了?
其實這個方法在最新的I2C協議標準中也有說明,不管I2C當前丟失或增加幾個clcok,我們只要讓主機連續補齊9個clock,在9個clock內時序一定會補齊到ACK環節,此時主機維持SDA高狀態就可以讓這次通信以NACK進行結束,從機自然會釋放總線,這個比強制用推挽模式拉高SDA更安全合理。
那么這個異常恢復在紅楓派的驅動里也已經為大家考慮好了,當總線狀態出現異常時,驅動里會自動進行處理恢復總線。
![wKgaomXX9qyAeRWWAABEaGqe-dI730.png](https://file1.elecfans.com/web2/M00/C1/9D/wKgaomXX9qyAeRWWAABEaGqe-dI730.png)
那么軟件I2C的弊端在哪里呢?
軟件I2C一般通過IO口控制和延時進行模擬,這意味著整個通信過程會完全依靠并占用CPU,如果我們運行RTOS、或者有高頻中斷就會出現模擬時序過程被打斷,波形會出現頻率變化,波形中途停止等情況,一方面是降低通信效率,另外也可能導致主機沒有在關鍵時間采樣或者輸出數據,出現通信錯誤。
紅楓派開發板上板載了一個I2C的EEPROM,歡迎大家在軟件極其嚴苛、硬件I2C接口隨機進行干擾下驗證例程,體驗下穩得一批的硬件I2C。
-
單片機
+關注
關注
6044文章
44624瀏覽量
638943 -
嵌入式
+關注
關注
5095文章
19189瀏覽量
307952 -
硬件
+關注
關注
11文章
3401瀏覽量
66494 -
IIC
+關注
關注
11文章
302瀏覽量
38537 -
GD32
+關注
關注
7文章
416瀏覽量
24500
發布評論請先 登錄
相關推薦
I2C總線通信原理 如何設計I2C總線電路
I2C總線的優缺點分析
I2C總線與Arduino的接口示例
I2C總線的工作模式介紹
I2C總線故障排除技巧
I2C總線與單片機的連接
I2C總線設備地址設置方法
I2C總線應用實例分析
I2C總線與SPI總線的比較
RISC V的I2C操作
【GD32 MCU 入門教程】GD32 MCU 常見外設介紹(7)I2C 模塊介紹
![【<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 入門教程】<b class='flag-5'>GD32</b> <b class='flag-5'>MCU</b> 常見外設介紹(7)<b class='flag-5'>I2C</b> 模塊介紹](https://file1.elecfans.com/web2/M00/02/E9/wKgZoma-sU2AfOCVAABBglin3QE056.png)
簡單認識I2C通信協議
什么是I2C協議 I2C總線的控制邏輯
![什么是<b class='flag-5'>I2C</b>協議 <b class='flag-5'>I2C</b>總線的控制邏輯](https://file1.elecfans.com/web2/M00/C3/E6/wKgZomXvre-AWsW5AABL2e5FJAM091.png)
評論