次にどう実装するかを考えます。当然今までの検討は実装することをイメージして進めているわけですが、最終段階で、できると思ってたことができなかったりすると後戻りが大きいので、一つのレイヤーの実装イメージができたら実際に動作を確認してから次のレイヤーの構想・開発に進めることが大事です。
前回までで、以下に示す7種の動作をI2Cで実現する(1)のと、これらを使って言語で使い勝手の良い関数を作る(2)ことを進めれば良いことがわかります。本稿では(1)を進めます。
S:START
P:STOP
R:7bitのslave addressにRと識別する1bitをつけて1byte writeしてACKを待つ
W:7bitのslave addressにWと識別する1bitをつけて1byte writeしてACKを待つ
T:8bitのregister address/dataを1byte writeしてACKを待つ
K:slaveから8bit送ってきたらACKを返す
N:slaveから8bit送ってきたらNACKを返す
上記のS, P,,,Nの動作をI2Cに落とし込むのに、ここではArduinoをベースに考えます。「一気通貫に動くところまで進めてから後のことを考える。一個一個を完璧にするようなことはしない」と言う方針に則り、手元にあってIDEに習熟して動作が簡単に確認できる物を使います。もちろんどんなCPU、言語、を使っても構いませんし、やってくれる人がいると嬉しいのですが。
ArduinoでI2Cを動作させるのに、Wireライブラリがあることがわかります。ところがこのライブラリの関数には以下のようなものがあるのですが、いたって使い勝手が悪いのです。ここまで読み進めていただいた方にはお分かりでしょうからクドクド申しません。
===
begin()
requestFrom()
beginTransmission()
endTransmission()
write()
available()
read()
SetClock()
onReceive()
onRequest()
===
せっかくI2Cプロトコルを一番primitiveなところまで分解したのにまた高級言語の壁に突き当たってしまいました。
そこでネットを色々探って知った、Software I2C libraryと言うライブラリを明日以降に試してみることにします。
ここまで