本稿が参照しているのは
「I2Cバス仕様およびユーザーマニュアルRev.5.0J-2012年10月9日」
の日本語翻訳11月2日
ですが、I2Cバスの全仕様を実装するのが目的ではないので、以下を前提とします。
(1) マスターは1個で固定。スレーブは複数あって良い。マルチマスターは考慮しない。
(2) SCLはマスターが駆動する。SCLをスレーブが駆動する処理は考慮しない。
と言う前提でI2Cプロトコルを要約すると
(1) データ転送は、SCL=highの時SDAを安定させ、SCL=lowの時SDAを変化させて行うのが基本。
(2) SCL=highの時SDAをhigh->lowとしたらSTART、SCL=highの時SDAをlow->highとしたらSTOP。全てのトランザクションはSTARTで始まりSTOPで終わる。START->STOPの間にSTARTが再びあっても良い。START/STOPはマスター側からしか起こさない。
(3) 送信側が8bitデータを転送した直後、受信側がACK or NACKを返す。マスターが送信側の時はスレーブが受信側だがその逆もある。ACK (NACK)とは、SCL=highの時SDA=low(high)で示す。
これらを前提に、コマンドとか関数にはどう見えるのが使い勝手がいいのか考えることにします。