今回の実験では、7.5m以上の配線長で通信に失敗しています。配線長10cmと配線長7.5mを比べるとSCL信号(黄色)が9回目の立ち上がり移行、出力されていません。なぜこのような違いが出るのでしょうか?
正常動作時は、スレーブ側が正しくアドレスを認識していればSDA信号(水色)の9ビット目でLOWを返すことで、正常に応答信号ACKが返答されたと判断し、後続の通信を継続します(図7上側)
今回の通信失敗時は、波形の崩れによりスレーブ側で正しくアドレスが認識できなかったため、スレーブ側はSDA信号の9ビット目でHIを返しています(NACK)。マスター側はスレーブ側からNACKが返されたため、通信を中断しています(図7下側)
通信エラーの原因を調べるには、I2Cペリフェラルのレジスタ内容をデバッガで調べることを推奨します。今回のケースでは、スレーブ側でスレーブアドレスを正常に認識していない可能性があるので、スレーブ側で受信したスレーブアドレスを調べます。STM32G0B1マイコンには、I2C interrupt and status register(I2C_ISR)というレジスタにADDCODE[6:0]:Address match code という項目があり、正常にスレーブアドレスを受信した場合、ここに期待したスレーブアドレスが格納されます。この値を調べることで、スレーブ側が正常にアドレスを受信できたかどうかを調べることができます。
波形崩れの原因は、今回の実験では以下が考えられます(図8)
(1)プルアップ抵抗のドライブ能力不足
(2)信号の反射
(3)クロストーク
波形崩れへの対策としては、下記が挙げられます。
(1)プルアップ抵抗のドライブ能力不足 | 適切なプルアップ抵抗値の選択 |
---|---|
(2)信号の反射 | ダンピング抵抗の挿入 |
(3)クロストーク | SCLとSDA信号の配線を離す |
これらの対策を施すことで波形崩れを改善し、通信の失敗率を下げられる場合もありますが、基本的には短い配線長での使用を推奨します。
Copyright © ITmedia, Inc. All Rights Reserved.