AVR用のコンパクト&高速なI2Cライブラリの実験

メモリの少ないAVR向けにGPIOのみを利用したコンパクトなソフトウェアI2Cライブラリを作ってみた。コンパクト化のためシングル・マスター構成に限定し通信高速化のための立ち上がり信号高速化機能を実装。立ち上がり信号高速化機能とはオープンコレクタ(ドレイン)回路を高速化するために制御線をオープン(HIGH)にする一瞬だけアクティブ駆動させ強制的にHIGHにする機能。タイミングを間違うとスレーブデバイス側の出力回路とショート状態になるので注意が必要であるがプッシュプル回路と同程度まで高速化でき、制御線の外部プルアップ抵抗が不要となるメリットもある。

【続編】
AVR用のコンパクト&高速なI2Cライブラリの改良版

【実際の通信波形(外部プルアップ抵抗無し)】

ATtiny85(16MHz)での実測値では最高速でも800KHz程度止まりであるが、立ち上がり信号高速化機能がない場合、立ち上がり信号がかなりなまり、外部プルアップ抵抗1KΩでもせいぜい頑張って1MHz程度であることや、そもそも1MHzを超える高速クロック対応のデバイスもそうなさそうなので、ほんの少しの高速化よりもプルアップ抵抗が省略できるメリットのほうが大きい。

コンパクト&高速化のためSDA/SCLポートの変更はライブラリを直接書き換える必要がある。ライブラリのコードサイズは340バイト程度。

2017-07-30
read()/write()の戻り値の型をint8_tからuint8_tに型変更し最大データ長を254バイトとした。スレーブが見つからないときは戻り値が255となる。

2017-07-29
I2Cで使用するGPIOをアプリ側で定義できるように変更。その他、全体的に仕様変更を含む最適化をしてみた。また、標準のWire互換クラスを作成&試してみたがコードサイズが大きくなるだけなのでボツとした。メモリの少ないCPUには重すぎる仕様かも...

【サンプル・スケッチ】

【ライブラリ】