マイコン(MCU)システム開発入門編

第8回:I2C 通信を使う場合の留意点

マイコンに外部デバイスを接続する場合、しばしば使われるのが I2C 通信(Inter-Integrated Communication)です。多くのセンサや液晶表示器など I2C で接続するデバイスはたくさんあります。

1. I2C 通信の基本構成

I2C 通信では図1のような基本構成で使われます。親(Master または Controller)と子(Slave または Target)の2つのデバイスで構成され、通信はすべて親が主導権を持って行います。子は最大 127 台接続できます。親が複数接続される場合もありますが、通信の衝突検出など複雑になるため、ほとんどの場合親は1台で構成されます。多くの場合親がマイコンで、子がセンサなどのデバイスとなります。したがってマイコンが主導権を持って通信を行います。

通信に使われる線はクロック(SCL)とデータ(SDA)の2本で構成され、この2本の線にすべてのデバイスが接続されます。この構成で通信できるように Wired OR 構成とするため、必ずプルアップ抵抗が必要となります。

図1:I2C 通信の基本構成

この I2C 通信を使う場合の留意点はつぎのようになります。

1、ハードウェア面の留意点

(1) 電圧レベルの統一

I2C 通信で接続するデバイスには、電圧が 3.3V のものと、5V のものがあります。多くは 3.3V ですが、ここに 5V 系を接続すると最悪デバイスを壊してしまいます。3.3V 系に 5V を接続する場合には、レベル変換をする必要があります。I2C 用の双方向レベルシフタ IC がありますから、これを使えば簡単に接続できます。

(2) プルアップ抵抗の値

SDA、SCL はいずれもオープンドレイン出力のため、プルアップ抵抗をつけないと信号が High にならず通信不能となります。

このプルアップ抵抗の値は I2C の規格では図2のような計算で求めることになっています。グラフは式をもとに作成したものです。ここで問題は配線の浮遊容量を計測することが難しいということです。このため通常はグラフの点線で囲った範囲を目途にして抵抗値を決めます。通信速度が高速になるほど、抵抗値を低くする必要があることが分かります。

図2:プルアップ抵抗値の求め方

(出典)https://www.nxp.com/docs/en/user-guide/UM10204.pdf

このプルアップ抵抗値により波形がどのようになるかの実際の例が図-3となります。いずれも通信速度は 100kHz で上側は抵抗値が 100kΩ の場合、下側は抵抗値が 2.2kΩ の場合です。

上側は波形が完全になまっており、確実に通信エラーが発生します。下側はきれいな矩形波になっていますから、正常に通信はできています。しかし、波形をよく見てみると、スレーブからの ACK の信号が完全に Low になり切れていないことがわかります。この現象がスレーブ側の Low の電圧レベルによるものか、または、2.2kΩ という抵抗値が過負荷になっていてドライブし切れていないかを判別して、過負荷の場合には抵抗値の再検討が必要です。

このようにプルアップ抵抗値は大き過ぎても、小さ過ぎても問題が起きますから注意が必要です。

図3:プルアップ抵抗値による信号波形の違い

抵抗値:100kΩ
通信速度:100kHz

波形はなまりエッジが遅れるため、正常にデータサンプリングができなくなり、通信エラーとなる。

波形はなまりエッジが遅れるため、正常にデータサンプリングができない波形

抵抗値:2.2kΩ
通信速度:100kHz

波形はきれいな短形波となり、正常に通信できる。
スレーブからの ACK 信号が完全に Low になり切れておらず、過負荷になっているかも。

波形はきれいな短形波となり、正常に通信できる

(3) I2C 配線の距離

I2C は配線容量に敏感で長い配線(50cm 以上)では波形の立ち上がりが遅くなり通信エラーが起きやすくなります。配線が長くなる場合にはプルアップ抵抗の値に特に注意する必要があります。

(4) プルアップ抵抗の重複

複数モジュールが接続されている場合、モジュールにプルアップ抵抗を内蔵しているものがあります、これらをそのまま接続してしまうと抵抗が重複して並列接続されますから、低すぎる抵抗値になってしまう可能性があるので注意が必要です。

(5) アドレスの競合

I2C のアドレスには7ビットと 10-bit の場合がありますが、最近ではほとんどが7ビットアドレスとなっていますので、7ビットモードのみで考えても問題ないと思われます。

ここで、スレーブとして接続するデバイスの多くは、アドレスが固定となっています。同じアドレスを持つデバイスを複数接続する場合、アドレス変更ジャンパやアドレス指定ピンでアドレスを変更する必要があります。変更ができないデバイスは同じ I2C ラインに接続することはできません。マイコン側で複数の I2C モジュールがある場合には、別々に分けることで接続することが可能です。

2. ソフトウェア面の留意事項

I2C を使う場合にソフトウェアで留意することは次のようになります。

(1) I2C 通信処理にはライブラリを使う

I2C 通信のソフトウェアは、多くのマイコンでライブラリが用意されていますので、特に支障がなければライブラリを使ってプログラムを作成するようにします。I2C 通信を直接プログラムで作成するのは結構複雑なプログラムになることを覚悟して進める必要があります。

直接 I2C 通信のプログラムを作成する場合には、I2C 通信は低速度ですから、通信完了をセンスで待つ方式では無駄時間が多くなってしまいます。そこで基本的に割り込みを使って処理を進めるようにします。またバイト送受信ごとに ACK を確認し、次のデータを処理するという複数手順で進みますから、ステートマシンとして順次進める必要があります。

(2) エラーハンドリング

ライブラリを使う場合でも、応答なしや、通信途中でハングアップするのを防止するため、タイムアウト機能を設けるようにします。特にハングアップしてしまうと、電源をオフしないと元に戻らないデバイスも多いので、特に注意が必要です。

(3) スレーブを構成する場合

マイコンでスレーブ側の機能を構成する場合は、特に受信割り込み処理を高速にする必要があります。これが遅いとデータの取りこぼしがおきてしまいます。また、受信データ処理に長時間かかる場合には、クロックストレッチを使ってマスタからの送信を抑制するようにします。また、スレーブのアドレスを決める場合、次のアドレスは予約されていますので使えません。

0x00 ~ 0x07、0x78 ~ 0x7F、 したがって 0x08 ~ 0x77 の範囲のアドレスとします。

(4) 初期化時のピン指定を慎重に

マイコンにより、I2C に使用できるピンが固定されているものもありますから、ピン指定はハードウェアを確認して慎重にする必要があります。

以上がマイコンで I2C 通信を使う場合の留意事項となります。

PDF 資料請求

特別連載_MCU_8:I2C 通信を使う場合の留意点

著者プロフィール

後閑 哲也 Tetsuya Gokan

経歴 1971年 東北大学卒業後 大手通信機メーカにて各種の制御装置を開発
2003年 有限会社マイクロチップ・デザインラボ設立
現在の活動
  • マイコンや計測制御システムの開発コンサルタント、グローバル電子(株)顧問
  • 神奈川工科大学 非常勤講師としてモノづくりの基礎を指導
  • 書籍や雑誌記事の執筆
書籍
(技術評論社)
  • 電子工作の素(改定新版)
  • MCC、C言語によるPICプログラミング大全
  • マイコンの使い方がよくわかる本
  • 逆引きPIC電子工作やりたいこと事典
  • IoT電子工作やりたいこと事典

特別連載「マイコン(MCU)システム開発入門編」リンク

特別連載