この投稿では、私が経験したI2C通信で陥ったバグについて紹介します。
下図のようにI2C通信でメモリABC1とメモリABC2を接続し、Write Read (Write実行後、直ぐにRead実行)コマンドを実行しました。その結果、ABC1では正常に通信したのですが、ABC2では通信がうまくできませんでした。原因は、tBUF(新しい伝送を開始する前にバスが空いていなければならない時間)のMin時間に差があったからです。この違いに気付くまで大変時間がかかりました。
ABC1 tBUF = 1.2μs
ABC2 tBUF = 4.7μs
このケースの対策として、Write実行後に5μs待ってからRead実行するようにしました。
I2Cバス規格 UM10204の tBUF 時間
Standard-mode
Fast-mode
Fast-mode Plus
4.7μs
1.3μs
0.5μs
根本原因は、規格およびDatasheetを調べずにStandard-mode ABC1が1.2μsだからABC2も1.2μsと思い込んだことです。
皆さんは、私のようにI2C通信で同じと思わずにDatasheetの仕様をよく確認することをお勧めします。また、MCUおよびHALがクロックストレッチを対応している場合は、クロックストレッチを使うことをお勧めします。