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の状態を読み取る。
(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で決まります。
===
ここでは説明の都合で「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で決まります。
日本語で説明するとややこしいので後日ソースコードで公開することにします。
ここまで
コメント
コメントを投稿