使用Arduino開發板與各種IC或感測器模組溝通,通常會用到I2C介面,
以Arduino Uno來說,其核心ATMega328P支援的通訊速率有2種,
分別是Standard-Mode(100kbps)和 Fast-Mode(400kbps)。
(參考ATMega328P Datasheet P:214)
若使用Arduino內建的Wire函式庫來進行I2C通訊,其I2C速率預設是100kbps,
但如果想要以更快速度與slave device溝通,必須修改Wire函式庫所引用的底層Library。
可以用Dev C++ IDE或文字編輯器打開twi.h這個標頭檔,
其所在目錄通常是 "......(Arduino IDE安裝目錄) \ hardware\arduino\avr\libraries\Wire\utility";
在這個檔案中找到第28行,
#define TWI_FREQ 100000L
將100000L修改為400000L。
然後關閉Arduino IDE,再重新開啟,讓它自行重新編譯即可。
===================================================
要特別注意的是,當通訊速率提高時,SDA和SCL的上拉電阻(Pull-up Resistor)可能也要跟著降低!
因為根據I2C的規格書P:55,
I2C Bus上的電阻值和電容值,會影響其SCL時脈訊號的上升時間(rise time=tr),
而根據Table10,各種通訊速率所要求的tr是有限制的,
因為這樣才能對應正確的時脈週期和正確的時脈頻率,在進行I2C通訊時,才不會產生錯誤。
在上圖的公式1之中,
由於匯流排估計電容值Cb可以視為I2C連接線長度、接頭、針腳的寄生電容總和,
也會受I2C BUS上所有連接的從裝置所影響,
因此在不更動硬體連接的狀態下,可以假設Cb為一個常數。
這時,當I2C通訊速率由100Kbps提高到400kbps時,
tr的最大規格值就由1000ns降低為300ns,
這麼一來,根據公式1,I2C Bus上可容忍的電阻值Rp(max)就會跟著下降。
因此,根據DSS Circuits這篇文章中的實驗,
建議上拉電阻最大只能採用4.7K 歐姆,
這樣才能有效限縮rise time,
產生趨近理論的時脈波形,對應到正確的時脈頻率。
[參考資料]
留言列表