Sony Spresense ボード上で、Software I2C を使う方法です。
Software I2C とは
Software I2C とは、ソフトウェアで GPIO 信号をパタパタさせて、I2C 通信をエミュレートしてしまうというものです。I2C Bitbang などとも呼ばれます。もちろん Hardware I2C と比べると、CPU はこの処理に占有されてしまいますし、パフォーマンスもそれなりにしか出ません。
ですが、物理的に I2C 専用ピンが空いていないときなどは、余っているピンで I2C デバイスを制御できると便利です。また、Spresense ボードの場合はマルチコアが使えるので、MainCore では別の処理を行い、SubCore に Software I2C の処理を割り当てる、といった使い方をすれば CPU 処理の負荷について特に気にせず利用することができます。
ライブラリ
Arduino libraries にインストールしてください。
- ゼロベースで自作しても良かったのですが、felias-fogg さんのを流用させて頂きました。
- オリジナルは、脱ボード依存を目的として、Arduino標準APIだけを使うというコンセプトをもつライブラリなのですが、それだとパフォーマンスが出なかったので、ifdef で括って Spresense 依存コードをブチ込んでみました
- 標準の
Wire
ライブラリとインターフェース互換で使うためのラッパーです。これはそのまま利用します。
使い方
使い方はかんたんで、SDA, SCL として使うピン番号を指定して、SlowSoftWire のインスタンスを生成するだけす。第3引数は、チップの内蔵プルアップ機能を使うかどうかのフラグですが、true
を入れてください。それ以外の使い方は、標準的な Wire ライブラリと同じです。
# include <SlowSoftWire.h>
# define I2C_SDA_PIN 5
# define I2C_SCL_PIN 6
SlowSoftWire Wire = SlowSoftWire(I2C_SDA_PIN, I2C_SCL_PIN, true);
サンプル
I2C Scanner サンプルスケッチを貼っておきます。
# include <SlowSoftWire.h>
# define I2C_SDA_PIN 5
# define I2C_SCL_PIN 6
SlowSoftWire Wire = SlowSoftWire(I2C_SDA_PIN, I2C_SCL_PIN, true);
void setup()
{
Wire.begin();
Serial.begin(115200);
}
void loop()
{
uint8_t error;
int nDevices;
int addr;
int upper, lower;
printf("I2C Scanning...\n\n");
nDevices = 0;
printf(" -0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F\n");
for (upper = 0; upper < 8; upper++) {
printf("%d- :", upper);
for (lower = 0; lower < 16; lower++) {
addr = upper * 16 + lower;
Wire.beginTransmission(addr);
error = Wire.endTransmission();
if (error) {
printf(" --");
} else {
printf(" %02x", addr);
nDevices++;
}
}
printf("\n");
}
printf("\nthe number of found I2C devices is %d.\n\n", nDevices);
delay(5000);
}
正しく動けば、接続されているI2Cデバイスのスレーブアドレス一覧がシリアルモニタ上に表示されます。
I2C Scanning...
-0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -A -B -C -D -E -F
0- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 0f
1- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1f
2- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
3- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
4- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
5- : -- -- -- -- -- -- -- -- -- -- -- -- -- 5d -- --
6- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
7- : -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
the number of found I2C devices is 3.