Arduino 更改 IIC(I2C)Baud Rate 為 400 KHz,增加傳輸速率

這裡介紹如何更改 Arduino 內建的 Wire 函式庫,提高 I2C 傳輸協定的 baud rate 到 400 KHz,增加資料傳輸的速度。

一般市面上的感測器(sensors)中,如果傳輸的資料量不大的話,大概都會使用 I2C 這種傳輸協定,而 Arduino 內建的 Wire 函式庫本身就有支援 I2C,這種傳輸協定的特色就是接線簡單,它只需要串列資料(SDA)及串列時脈(SCL)兩條線就可以進行資料的傳輸,再加上供應電源的 VCC 與 GND,總共只需要接四條線,不過缺點就是資料傳輸的速率比較慢一些。


I2C 有好幾種傳輸模式(也就是 baud rate),在標準上有 100KHz、400KHz、1MHz、3.4MHz、5MHz 等這幾種,而在 Arduino 的 Wire 函式庫中預設是使用最慢的 100KHz,如果您的感測器需要比較快的傳輸速度,可以稍微修改一下 Wiretwi.h 標頭檔,將 baud rate 提高以加速資料的傳輸。

twi.h 標頭檔在各種不同的系統中路徑有些小差異,Windows 中的路徑為

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire\utility\twi.h

在 Mac OS X 中如果您是直接按照正常的安裝方式將 Arduino 拖進 Applications 中的話,路徑就是

/Applications/Arduino.app/Contents/Java/hardware/arduino/avr/libraries/Wire/utility/twi.h

若在 Linux 系統之下,twi.h 的路徑則為 Arduino 的安裝路徑再加上

hardware/arduino/avr/libraries/Wire/utility/twi.h

開啟 twi.h 這個標頭檔之後,找尋定義 TWI_FREQ 的地方:

#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif

這個 TWI_FREQ 所指定的值就是 I2C 的 baud rate,其預設值為 100000L(也就是 100KHz),如果要提高資料的傳輸速率,可以將這個值改為 400000L(亦即 400KHz)。

修改完成之後,再刪除 hardware/libraries/Wire/Wire.ohardware/libraries/Wire/utility/twi.o 這兩個檔案,強迫 Wire 函式庫重新編譯(或是直接關閉 Arduino IDE 再重新開啟也可以,Arduino IDE 會自動檢查並且重新編譯必要的部份)。

如果您的感測器支援高於 400KHz 的 baud rate,也可以依照感測器所支援的速度來設定,例如 MPU-6050 這個加速度計與陀螺儀六軸感測器就有支援到 500KHz,所以如果 Arduino 的 I2C 匯流排只有連接 MPU-6050 的話,也可以直接設定為 500000L

設定 baud rate 時,一定要先看看自己的 I2C 裝置(通常就是各種感測器)支援到多快的速度,如果設定的速度超過了裝置本身支援的速度上限的話,就會無法跟該設備連線。100KHz 是最基本的速度,一般的 I2C 裝置應該都可以使用這個速度,如果您發現您的 I2C 裝置無法連線,可以調回這個速度測試看看。

如果您對於 Arduino 的相關應用有興趣,建議您可以繼續閱讀物聯網的文章。

參考資料:Arduino

Arduino, 物聯網

2 留言

  1. skybow

    您好,我使用的是Arduino IDE1.6.5免安裝windows版,修改完twi.h內的TWI_FREQ後,重開IDE上傳程式,測試後發現,I2C速度沒有變快。請問刪除wire.o和twi.o這兩個檔案的動作是必須的嗎? 因為,我找遍整個C:和該Arduino IDE目錄,都沒發現要刪除的wire.o和twi.o這兩個檔案…不知您是否有遇過這個狀況? 感謝!

    • G. T. Wang

      請問您是用什麼方式測試 I2C 的速度呢?程式是否真的有用到 Wire,還是用到了別的 library?

      可以簡單測試一下,把 TWI_FREQ 調成 I2C 不可能支援的數值,看看是否能執行,如果可以執行,就表示程式可能根本沒用到這個 Wire library,或是改錯地方,而如果不能執行,就表示 Wire library 的使用應該是沒問題。

Comments are Closed