I2C 是嵌入式系統中流行的通信協議。 當與slave連接時,每條雙向線上都需要一個上拉電阻。
出現的一個常見問題是“我應該使用多大尺寸的上拉電阻?”。
我認為,與其進行大量理論和計算,不如更容易地展示使用不同電阻值時信號會發生什麼情況。
由於 Arduino 是愛好者中流行的微控制器,我們將在以下示例中使用它。 我們將 Arduino 連接到 DS3231 實時時鐘,這是一個 5 伏設備。 我們還將研究不同速度的 I2C(100 和 400kHz 時鐘信號)對信號的影響。 我們將設置示波器來測量上升時間、頻率和峰值電壓。 頻率? 為什麼我們要測量頻率,我以為時鐘頻率運行在 100kHz...好吧,讓我們看看示波器怎麼說。
由於 SDA(數據)和 SCL(時鐘)線的電容大致相同,因此我們僅改變 SCL 線上的電阻,並在 SDA 線上保留標準 4.7k 歐姆電阻。
在示波器上分析重複時鐘信號比分析數據模式更容易。 讓我們僅使用 Arduino 的內部上拉電阻來進行初步讀數。
無論如何,讓我們禁用 Arduino 的內部上拉電阻並安裝我們自己的上拉電阻,看看它們如何影響信號。 我們將從 68k 歐姆電阻開始,然後是 47k、33k、10k、6.8k、4.7k、3.3k、2.2k,最後是 1.5k。
正如您在圖 2 中看到的,信號最終呈現出我們希望看到的方形形狀。 請注意測量的頻率如何接近我們所需的 33k 和 10k 歐姆之間的時鐘頻率。 您還可以看到上升時間如何隨著電阻的減小而減少。 正如您所看到的,4.7k 產生了一個漂亮的信號,上升時間約為 1 微秒。 您會發現 4.7k 是許多單從設備設置中使用的非常常見的電阻。 當然,當您向線路中添加越來越多的設備時,總線電容將會增加,這意味著如果您想保持信號完整性,則必須開始降低電阻 (t = RC)。 每個設計都是獨一無二的,並且無法保證數據表中引用的電容,因此最好的做法是查看示波器上的信號。 那麼為什麼不直接使用一個非常低的電阻來開始,這不應該減少上升時間以給我們盡可能的方波信號嗎? 嗯,是的,也不是。 I2C 標准設置了一些需要遵循的限制; 幸運的是,這些限制可以幫助我們縮小電阻值的範圍。 計算最小上拉電阻的簡單公式是 Rp = (Vcc - 0.4)/3mA,對於 5V 系統,該電阻約為 1.5k 歐姆。 計算最大電阻的公式實際上基於標準模式 (100kHz) 的最大上升時間(1 微秒),該公式為 Rp = 1us/Cb <省略乘以0.8473>,其中 Cb 是一條信號線的總總線電容。 因此,對於我們的示例,總總線電容約為 20pF(根據數據表,Arduino 為 10pF,根據數據表,DS3231 也是 10pF),這會產生 50k 歐姆的高壓側值。 顯然,在線路中添加更多的 DS3231 RTC 將改變我們應該使用的最大允許電阻(再添加 1 個將其降至 33.3k,另一個將其降至 25k,等等...)。 需要注意的是,每個 I2C 設備都有自己的電容,因此請務必查看數據表,以便了解該值是多少。
接下來,我們將使用相同的電路,但這次我們從標準模式切換到快速模式 (400kHz)。 正如您所看到的,相對於時鐘頻率而言,上升時間非常慢。 測得時鐘頻率約為 171kHz,明顯慢於所需的 400kHz。 另請注意,在切換到佔空比的後半部分之前,峰值電壓僅達到 3.28V。 我們將使用相同的電阻器重複上面的相同測試。 在開始之前,讓我們看一下確定上拉電阻值和下拉電阻值的計算。 最低值上拉電阻的計算與上面相同,在低端產生 1.5k; 然而,快速模式的最大上升時間從 1 微秒減少到 300 納秒。 正如您所看到的,使用該公式並替換最大總線電容 400pF 會得到 750 歐姆的上限電阻,這實際上低於第一次計算中的最低值電阻。 因此,對於 5 伏系統,建議的最大總線電容降至約 200pF。 因此,在構建電路時,請確保密切關注總總線電容。 因此,讓我們安裝電阻器,看看它們如何影響信號質量(圖 4)。 請注意,在我們從 6.8k 歐姆過渡到 4.7k 歐姆之前,測得的時鐘頻率不會接近 400kHz。 您還可以看到當我們從 2.2k 歐姆過渡到 1.5k 歐姆時,信號如何呈現良好的形狀。
出處來源:https://www.thebackshed.com/forum/uploads/BobD/2013-01-26_175209_I2C_-_Effects_of_Varying_Pullup_Resistors.pdf
I2C感測器推薦如下
1.BME280 I2C or SPI 溫度/濕度/壓力感測器
2.AHT20 溫濕度 I2C 感測 模組 高精度 溫度 濕度
3.GY-49 MAX44009 數位 光照度 光強度感測器模組 i2c介面 高精度
留言列表