I2C ACK のはなし
I2C の ACK とは
I2Cプロトコルでは、スレーブ側が応答として DATA ラインを使って ACK応答を返します。その詳細を書いてみます。
ハード的には
I2Cのはなしにも書きましたが、I2Cラインはオープンドレイン出力+プルアップで構成されています。特にDATA ラインはACK受信のため頻繁に送信ラインと受信ラインを切り替えています。ハードではオープンドレインポートと入力ポートからなっていますので、マスター側がACKを確認するにはオープンドレインを OFF ( 出力オープン状態)にしてプルアップ抵抗による High 状態にします。スレーブがACKとして Lowを返すと DATAラインが Lowになりますので、確認できます。
ここで注意したいのは、DATAラインを変化できるのは CLOCK ラインが Lowの期間だけ というきまりがあることです。マスター側もスレーブ側も CLOCKの Lowのタイミングで信号を変化させているのが判るかと思います。 スレーブが反応しなくて ACK を返さない時は DATAラインをマスター側が受信状態にして High にしますが、ACKがないので DATAラインは Highのままです。
ACKがある場合は DATAラインは受信に切り替えた時にすこし High側に上がっていきますが、スレーブ側の ACKによって途中で Lowにされ、ひげのような信号が見えます。(プルアップ抵抗の値や、通信速度で見えない時もあります)。マスター側が CLOCKを Lowにするタイミングでスレーブは ACKを停止してLowにするのをやめます。
ソフト的には
DATAライン、CLOCKラインを制御する時にバイト単位で同一のポートを使う場合、ビット操作が瞬間他のビットに影響を与えるような時は、バイト単位で操作しないと CLOCKが一瞬 Lowになってしまったりして、CLOCKが余分に送られてしまう場合があります。また、受信に切り替える時にも同様の事が起こると LowにしていたつもりのCLOCKがHighになって、同様なトラブルが起きます。
RENESASではI2Cバスのいろいろなトラブルについてのページが用意されていますので、参考にされると良いかと思います。
本ブログの I2Cトラブルのはなし も参照ください。
| 固定リンク
「DIGITAL」カテゴリの記事
- I2C信号を見る はなし(2022.09.13)
- TTL レベルのはなし ふたたび(2022.02.13)
- 2022 新年あけましておめでとうございます。(2022.01.04)
- 12Bit DAコンバーターのはなし(2016.08.12)
- D ラッチとD フリップフロップのはなし(2014.10.30)
コメント