start/stop/read/writeの各関数を書いていきます。”tSU_STA”等は規定時間以上待つことを意味します。
void start(void)
{sda(1);
scl(1);
tSU_STA;
sda(0);
tHD_STA;
scl(0);
tLOW;}
void stop(void)
{sda(0);
scl(0);
tLOW;
scl(1);
tSU_STO;
sda(1);
tBUF;}
データ転送関数は、関数に入ってくる時の状態がバラバラなので、次の規則を設けて時間を保証することにする。考え方は、
・関数に入って出るまでにSCLがlow->high->lowの1サイクル動く。この時間をtLOW1, tHIGH1, tLOW2で表す。tLOW1>tSU_DAT, tHIGH1>=tHIGH, tLOW2>tVD_DAT、とする。
・writeは関数に入った直後、readは関数に入ってくるとき、SDAは確定していることを前提とする。そのため、関数から抜けるときに次の転送サイクルのSDAが確定しているようにする。
void write(byte data)
{sda(data);
scl(0);
tLOW1;
scl(1);
tHIGH1;
scl(0);
tLOW2;}
byte read(void)
{scl(0);
tLOW1;
scl(1);
temp=SDA;
tHIGH;
scl(0);
tLOW2;
return temp;}
ここまで