I2Cポートが足りないとき、i2c-gpioドライバを使用することで普通のGPIOポートをI2Cポートとして使うことができる。
GPIOを高速で制御 (Bit banging) して、SDAとSCL相当のシリアル波形を作り出そうというドライバ。任意のGPIOポートが使える代わりに、それなりにCPUパワーを消費するし、きっちりとした波形が出ないのでデバイスによってはうまく動作しない場合がある。
参考: https://en.wikipedia.org/wiki/Bit_banging
できることならハードウェアI2Cポートを使用すべきだし、使うにしてもオシロスコープで波形を確認し、デバイスの仕様に沿うか確認して使いたいところ。
/boot/overlays/README
に記載のあるように、dtoverlayディレクティブを使用し/boot/config.txt
に設定を追加することで動作するようになる。
/boot/overlays/README
Name: i2c-gpio
Info: Adds support for software i2c controller on gpio pins
Load: dtoverlay=i2c-gpio,<param>=<val>
Params: i2c_gpio_sda GPIO used for I2C data (default "23")
i2c_gpio_scl GPIO used for I2C clock (default "24")
i2c_gpio_delay_us Clock delay in microseconds
(default "2" = ~100kHz)
GPIO 5をSDA、GPIO 6をSCL、クロックディレイを2μsecとする場合の設定は以下のような感じ。
/boot/config.txt
dtoverlay=i2c-gpio,i2c_gpio_sda=5,i2c_gpio_scl=6,i2c_gpio_delay_us=2