使用Arduino開發板與各種IC或感測器模組溝通,通常會用到I2C介面,

以Arduino Uno來說,其核心ATMega328P支援的通訊速率有2種,

分別是Standard-Mode(100kbps)和 Fast-Mode(400kbps)。

(參考ATMega328P Datasheet P:214)

ATMEGA328P規格書P214 


若使用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,再重新開啟,讓它自行重新編譯即可。

修改Arduino I2C速率 


===================================================

要特別注意的是,當通訊速率提高時,SDA和SCL的上拉電阻(Pull-up Resistor)可能也要跟著降低!

因為根據I2C的規格書P:55,

I2C Bus上的電阻值和電容值,會影響其SCL時脈訊號的上升時間(rise time=tr),

而根據Table10,各種通訊速率所要求的tr是有限制的,

因為這樣才能對應正確的時脈週期和正確的時脈頻率,在進行I2C通訊時,才不會產生錯誤。

I2C規格書P55 


在上圖的公式1之中,

由於匯流排估計電容值Cb可以視為I2C連接線長度、接頭、針腳的寄生電容總和,

也會受I2C BUS上所有連接的從裝置所影響,

因此在不更動硬體連接的狀態下,可以假設Cb為一個常數。

這時,當I2C通訊速率由100Kbps提高到400kbps時,

tr的最大規格值就由1000ns降低為300ns,

這麼一來,根據公式1,I2C Bus上可容忍的電阻值Rp(max)就會跟著下降。

I2C規格書P48_Table10 

因此,根據DSS Circuits這篇文章中的實驗,

建議上拉電阻最大只能採用4.7K 歐姆,

這樣才能有效限縮rise time,

產生趨近理論的時脈波形,對應到正確的時脈頻率。


[參考資料]

1.DSS Circuits- Effect of Varying I2C Pull-Up Resistors

arrow
arrow

    sky 發表在 痞客邦 留言(0) 人氣()