関数のイメージを作るためにI2Cバスプロトコルを最小単位に分解してみます。
1. START: SCL=high, SDA=fall
2. STOP: SCL=high, SDA=rise
3. write_low: SDA=low, SCL=low>high>low。ACKをmasterから出すときもこれ。
4. write_high: SDA=high, SCL=low>high>low。NACKをmasterから出すときもこれ。
5. read: SCL=low>high>lowの時SDAを読む。slaveから出るACK/NACKもこれ。
できるだけ関数は減らすことを考えます。引数を持つようにすれば関数の数は減りますが、引数に固定値を入れるくらいなら関数を分けるのと同じなので、引数に変数を使うメリットがあるかどうかで考えます。
・1と2は引数を使って一緒にすると分かりにくく間違いが起きそうなので一緒にはしない。
・3と4は変数引数を使えると便利なので一緒にする。
よって関数は次の4つを作ることにします。
1. void start(void)
2. void stop(void)
3. void write(byte)
※引数の形式はbyteであるが、0x00の時は0b(ACK)、それ以外の時は1b(NACK)を書く。
4. byte read(void)
※返り値の形式はbyteであるが、実際には1bitであり、0x00(ACK)か否か(NACK)で判断すること。
ここまで