ここからいよいよI2C-COMを実装して行きます。
当面Arduinoのスケッチを書くことになるのですが、その準備作業としてSCL、SDAを操作する関数を作ることにします。ここで考慮したいのが、関数にどこまで機能を持たせるかです。高機能で書きやすいのと低機能で細かく制御できるのとのバランスをどこに置くかと言ういつもの問題です。底辺の最初の設計を間違うと後々まで響くので慎重に検討します。
===
まず、後で困らないようにSCL, SDAのタイミング規定を確認しておきます。Standard-mode CLK=max.100kHzを前提とします。
ここではSCLはmasterからだけ出力し、SDAもmasterから出力するときの規定だけ気にすれば良いので(slaveが規定を逸脱したらどこかでエラーになることを期待する)、守らねばならない規定は次のようになります。
(1) SCL自身の規定
0<fCLK<100kHz, tLOW>4.7us, tHIGH>4.0us
(2) SCLとSDAの関係に関する規定
小解説:
set up timeとは、信号Aのある時点に対して信号Bが前もって確定しておかねばならない時間
hold timeとは、信号Aのある時点以降も信号Bが確定しておかねばならない時間
===
プログラムで意識しやすいように、タイミング規定を(1) SDA -> SCL、(2) SCL -> SDA、に分類します。
(1) SDA -> SCL
tHD.STA>4.0us:START condition時、SDA=fallからSCL=fallまで
tSU.DAT>250ns:データ転送時、SDAが確定してからSCL=riseまで
(2) SCL -> SDA
tSU.STA>4.7us:REPEATED START condition時、SCL=riseからSDA=fallまで
tHD.DAT>0:データ転送時、SCL=fallからSDAが次に変化するまで
tSU.STO>4.0us:STOP condition時、SCL=riseからSDA=riseまで
===
長くなるのでここまで