I2C slave simulatorを作る(1)(内容が古くなりましたが記録として残します)

slave simulatorを作る前に、I2Cプロトコルをもう一度おさらいします。

(1) SCL=highのとき、SDA=fallを検出すると"START condition"と認識する。
(2) SCL=highのとき、SDA=riseを検出すると"STOP condition"と認識する。
(3) SCL=riseのとき、receiver側がSDAの状態を読み取る。
(4) SCL=fallのとき、transmitter側がSDAの次の状態を出し始める。

slaveがreceiverまたはtransmitterのときの動作で書き直すと

receiverのとき
(3') SCL=riseのとき、SDAの状態を読み取る。
(4') SCL=fallのときは何もしない。

transmitterのとき
(3'') SCL=riseのときは何もしない。
(4'') SCL=fallのとき、SDAにデータを載せ始める。

ではreceiver/transmitterはいつ切り替わるのか?

===
ここでは説明の都合で「8bitデータをtransmitterからreceiverに送り、transmitterがACKかNACKを返すまで」を「バイト転送」と定義しておきます。

仕様では「全てのtransactionはSTARTで始まりSTOPで終わる」とありますが、transactionの中身を分解すると

「START、slave address7bit+R/W1bitのバイト転送(1)、バイト転送(2)(の連続)、STOP」

となります。バイト転送(2)の向き、つまりslaveがreceiverなのかtransmitterなのかはその前のR/W bitで決まります。

日本語で説明するとややこしいので後日ソースコードで公開することにします。

ここまで





コメント

このブログの人気の投稿

i2c-tools 備忘録(内容が古くなりましたが記録として残します)

python-smbus(内容が古くなりましたが記録として残します)

I2Cシミュレータを作る