I2Cバスの波形なまりによる通信エラー対策
~はじめての通信~
........
- 更新日
- 2023.05.01
- 公開日
- 2022.05.04
INDEX
こんにちは。私は、組み込み開発を猛勉強中の新米エンジニアです。 今回は、新人研修において、I2Cを使って周辺デバイスと通信をしたときの失敗経験をまとめてみました。
I2Cは、2線式のシリアル通信!
まずは下調べから・・。ということでI2Cとはどんな通信方式なのか、簡単にまとめてみました。
通信方式は?
クロックに同期させてデータ通信を行う同期式シリアル通信のひとつです。周辺デバイス間で情報のやりとりが可能です。
信号線は?
2本の信号線(シリアルクロック端子(SCL)、シリアルデータ端子(SDA))を用いて通信します。それぞれの信号線にはプルアップ抵抗を接続する必要があります。
複数デバイスとの通信にも対応!
どうやってデータのやりとりをするの?
- 役割が、マスタとスレーブに分かれています。
- 通信を開始するときは、マスタからスレーブに対して、データの送信(Write) or 受信(Read) の指示をします。
- マスタは、決められた速度のクロックを出力し、スレーブと同期を図りながらデータ通信を行います。
「1対多」が可能なの?
- マスタ1つに対して、スレーブは複数個、接続することが可能です。
- 個々の識別は、スレーブが保有するアドレスで行われます。。
- マスタは、通信したいスレーブのアドレスとデータ送信/受信要求を出力。アドレスが一致したスレーブのみが、その後の送受信を継続します。
トラブル発生!! 要因は!?
I2Cを理解し、意気揚々とマイコンのプログラムを作成し、通信開始!!
「おや?? 通信できないぞ・・」
トラブル発生! 一つ一つ要因を探っていくことになりました。
- マイコンのレジスタ設定は? ⇒ OK
- 対象となる周辺ICのアドレス・通信速度は? ⇒ OK
「あとは、タイミングか・・」
以下のようなきれいな波形を期待していたのですが・・。
果たして、結果は・・
クロックもデータも波形がなまっている!! なんで・・
波形なまりの原因は?
なぜ、波形がなまったのか?
調べてみました・・。
I2Cマニュアル(*1)を確認したところ、『プルアップ抵抗のサイジング』についての記載がありました。
「これか??」
以下の3つ(Cb, tr, Rp)が重要で、下記の 式(1) で表せるようです。
- バス容量(Cb) = ワイヤ + 接続部およびPINの静電容量
- 信号の立ち上がり時間(tr)の規定値
Standard-mode: 1000ns (max) ← 今回はこのmodeを使用
Fast-mode : 300ns (max) - プルアップ抵抗の最大値(Rp(max))
「なるほど・・。バス容量(Cb)やプルアップ抵抗(Rp)が大きいと、立ち上がり時間(tr)が大きくなるのか。それにより、波形がなまると・・」
回路構成は変更できないので、バス容量(Cb)は変えられません。
なので、プルアップ抵抗値(Rp)を変えてみました。小さくすることで、tr が小さくなり、規定値を満足します。
実際に、Rpを変更し、通信させてみました。
「やったー。通信成功!!」
無事通信することができました。
(*1) NXP社製 I2C バス仕様およびユーザーマニュアル(https://www.nxp.com/docs/ja/user-guide/UM10204.pdf)
対策とまとめ
通信エラーに関して、改めて解決方法を調べたところ、以下の対策がありました。
- バス・バッファICを使って波形のなまりを調整する。
- バス速度が遅いモードに変更する。
- バス容量・プルアップ抵抗値を変更する。
今回、3の対策を実施し解決に至りました。しかし、今後の開発で、1と2の対策を使用することがあるかもしれません。記憶にとどめておく必要がありそうです。
今回の失敗経験で、次の教訓を得ました。
「搭載部品が適切な値かどうか、必ず裏付けをとることが重要である」と。
- 記事の訂正について(2021年5月7日)
掲載していた「期待していた波形」が、期待する波形としては不適切だったため、「観測された波形」と併せて差し替えいたしました。また、文章についても一部変更いたしました。