I²C(アイ・スクエアド・シー)バスはオランダのフィリップス(現NXPセミコンダクターズ)によって1982年に開発・公開されたシリアル・バス仕様です.
I²Cは「Inter Integrated Circuit」を「IIC」と略し,さらに重なる「I」を自乗として略して書いたものになっています.
このバスが開発された当時は,まだテレビやラジオの回路が可変抵抗や可変コンデンサ,コイルのコアのネジで調整・設定されて言いた時代でした.I²Cはこれらを置き換え,セットに組み込まれたコントローラや工場のコンピュータから各機能を制御し自動化するためのバスとして使われ始めました.
このような用途のため,当初のクロック周波数は100kHzとなっていて,大量のデータ転送は想定されていませんでした.
私が80年代後半にフィリップスに入社したころ,ラボにはこのコンセプトをデモするCCTV(Computer Controled TV)などのセットが置かれていました.
現在のI²Cの仕様は,フィリップスの半導体部門が分社化・独立したNXPセミコンダクターズが管理しています.この仕様は「I²C-bus specification and user manual[英語]」文書番号UM10204[英語]として公開されており,最新版はRev.7となっています.日本語版はRev.5が「I²Cバス仕様およびユーザーマニュアル」として公開されています.Rev.5とRev.7の違いは図41と図42の変更,表5の追記,マスタ/スレーブの語をI3C同様にコントローラ/ターゲットに変更,さらに第9章の「I3C概要」が追加されている点です(詳細はRev.1の表1:改版履歴を参照).このようにこれらの差分はI²C仕様の主要部分には及んでいないため,日本語版を参考資料として使用可能です.
I²Cの通信は必ず主と従の関係で行われます.これらの役割を指す語として,それぞれコントローラ,ターゲットが使われます[図1].
図1:コントローラとターゲット
ひとつのI²Cバス上に複数のコントローラが存在可能な仕様となっています.
古い仕様書では「マスター/スレーブ」の語が使われていましたが,現在は「コントローラ/ターゲット」に改められています.
I²Cは2線式のシリアル・バスで,ひとつはクロック,もうひとつをデータに使います.データはクロックに同期してやり取りされるため「同期式シリアル・インターフェース」の一つに分類されます.
データの通信方向は送信・受信の両方に対応していますが,1本のデータ線で行うためこれらを同時には行えず,切り替えて使います.このため送受信を同時に行える全二重ではなく,半二重と呼ばれる通信方式となります.
クロックとデータの各信号線はそれぞれSCL(シリアル・クロックライン)とSDA(シリアル・データライン)と呼ばれます.
データはクロック周期に同期して1ビットずつ送信,または受信されます.
I²Cで特徴的な仕様のひとつに,信号が「オープン・ドレイン」という方法で作られる点があります.
多くの通信ではデジタル信号を出力にはプッシュプルと呼ばれる方法が使われます.プッシュプルとはHIGHを出力するときには信号線に規定電圧を出(プッシュ)し,LOWを出力するときにはGNDに引っ張る(プル)方法です[図2-a].
オープンドレインはLOWを出力する「プル」は同様ですが,HIGHを出力するときはハイインピーダンス状態とします.この状態のとき,信号線に接続されたプルアップ抵抗によって規定の電圧が得られるようにします[図2-b].
図2-a:プッシュプル出力
図2-b:オープンドレイン出力
では,なぜこのような出力方式が採用されているのでしょうか?
これはI²Cでは,同じ信号線に対して複数のデバイスの同時出力を可能にするためです.複数のデバイスが出力状態にあるときに,ひとつでもLOWを出力しているものがあれば,信号はLOWになります.
このようなすべてのデバイスがHIGHを出力しているときにはHIGH,そうでなければLOWとなる信号の接続方法は「ワイヤード・アンド」と呼ばれます[図3].
図3:ワイヤード・アンド接続
I²Cではオプションとして「クロック・ストレッチ」や「マルチ・コントローラ」という機能を持っています.これらは同じバス上に接続された複数のデバイスに同時に出力を行わせ,その状態をオープンドレイン接続で管理して実現しています.
I²CのHIGHの電圧は,仕様では特に決められていません.プルアップ抵抗が接続されている電源電圧(VDD)はデバイスによってまちまちです.通信を行う場合は相互に接続されたデバイス間で共通に使用できる電圧で使う必要があります.多くの場合,VDDには5Vや3.3Vなどの電圧が用いられますが,低電圧化が進むSoCチップなどでは1V以下の電圧が使われる例もあります.I²Cの入力における信号電圧はLOWが0.3VDD以下,HIGHが0.7VDD以上と決められているので,互いに違う電圧のI²Cバス同士を接続する際には「信号電圧変換器(VLT:ボルテージ・レベル・トランスレータ)」を使う必要があります.この信号電圧の変換には双方向のオープンドレイン信号であることを考慮したI²Cに使用可能なデバイスを選択する必要があります.
I²Cでは信号のアナログ的な挙動も考慮しておかなければなりません.オープンドレインによる信号出力の変化にかかる時間です.HIGH→LOWでは早く立ち下がりますが,LOW→HIGHではバスの状態によって立ち上がり時間が遅くなります.具体的には接続されているデバイスの数が多くなったり,信号線の長さが長くなるに従ってゆっくり立ち上がります.これは信号線のもつ静電容量が大きくなるために起こります[図4].
許容される静電容量は,I²Cクロックの最大速度を規定する各モードによって上限が決められています.
図4:静電容量と信号の立ち上がり時間
I²Cには使用できる最大クロック周波数によって「モード」が規定されています[表1].
最も基本となるモードはスタンダード・モード(Sm)と呼ばれ,100kHz以下で動作します.
次に400kHzを上限とするファースト・モード(Fm)があります.これらのSm,Fmはほとんどのコントローラやターゲットで対応しています.
さらに1MHz以下のクロックで動作可能なファースト・モード・プラス(Fm+)があり,通信量が多いアプリケーションに使われます.
またその上に3.4MHzを上限とするハイスピード・モード(HS-modeまたはHs)があります.このハイスピード・モードはこの速度での通信への切り替えを行うプロトコルが規定されており,これ以外のモードとの通信を混在させる場合にはブリッジが必要になります.このモード対応のコントローラを搭載したデバイスはあまり多くありません.
特殊な用途向けにウルトラファースト・モードも規定されています.これはクロック上限を5MHzとし,通信方向をコントローラ→ターゲットの1方向に限定していて,他モードと互換性のない仕様となります.
モードについての言及なく「I²C」といった場合には最も一般的なスタンダード・モードやファースト・モードを指していることが多く,このブログでもこれらのモードをベースとして解説をします.
モード | 略称 | 最大クロック周波数 | 備考 |
スタンダード・モード | Sm | 100kHz |
最も普及しているモード 一般にI²Cと言えば400kHzに対応したFmまでを指す |
ファースト・モード | Fm | 400kHz | |
ファースト・モードプラス | Fm+ | 1MHz |
速度,引き込み電流,バス容量を拡張した仕様 この能力を有するコントローラは数多くのマイコンなどに搭載されている |
ハイスピード・モード | Hs | 3.4MHz |
あまり採用例は多くない Sm,Fmと互換.プロトコルによりHsモードへ切替 Sm,Fmデバイスをバスに混在する際はブリッジが必要 |
ウルトラ・ファースト・モード | UFm | 5MHz |
書き込み方向専用の高速化モード 専用コントローラと専用ターゲットで使用.他のI²Cのモードとは互換性なし |
表1:各モードの周波数と特長
I²Cに接続されるデバイスはすべて,2本の信号線(SCLとSDA)に接続されます.
接続は「マルチ・ドロップ」と呼ばれる接続です.どのデバイスも単純に2本線に"ぶら下がっている"ような形で繋ぎます[図5].接続できるデバイスの数は「バス容量」によって制限されます.信号線の長さが長くなるほど,接続されるデバイスの数が多くなるほど,バス容量は大きくなります.
通信は「コントローラ」と「ターゲット」の間で行われます.すべての通信はコントローラが主導します.
I²Cでは一回の転送はコントローラとターゲットの1対1で行います.故意に複数のターゲットに同じアドレスを持たせるような通信も可能ですが,コントローラから見ると「ひとつのアドレスに対しての通信」しか行えません[図6].
コントローラは通信を行うデバイスをターゲット・アドレスで指定し,データの転送方向を指示します.
転送の制御(開始と終了,通信ターゲットと転送方向の指定,SCLへのクロックの出力)はすべてコントローラが行います.
ひとつのI²Cバス上にコントローラが複数存在させることも可能です.これは「マルチ・コントローラ」と呼ばれるI²Cのオプション機能で実現できる構成です.
この構成では,あるコントローラによる転送終了後に別のコントローラが通信可能になります.同時に複数のコントローラが転送を始めてしまった場合を考えてバス調停の手順も決められています.
マルチ・コントローラ構成をとる場合には,接続されるすべてのコントローラがこの調停に対応してなくてはなりません.
しかしマルチ・コントローラ構成を採るシステムはあまり目にすることはないでしょう.マイコンなどに搭載されているI²Cコントローラには,このマルチ・コントローラに対応したものが多く存在しますが,単純なシステムでは単一コントローラ(シングル・コントローラ)がほとんどです.
この稿ではI²Cの基本部分についての解説を行うためシングル・コントローラの場合だけを考えます.
図5:マルチドロップ接続
図6:ひとつのターゲット・アドレスに対しての通信
データ転送がどのように行われるのか,その手順を決めているのがプロトコルです.
I²Cのプロトコルには必須の機能とオプションの機能があります.前の節で述べたマルチ・コントローラはオプション機能です.そこでも述べたように,ここではオプション機能には触れず,必須の機能のみの解説を行います.
I²Cの必須の機能とオプションの機能を[表2]にまとめます.
表2:I²Cの機能.必須/オプション (I²C仕様書(日本語版:rev5.0)より抜粋)
I²Cの通信は一般に次のような構造を持っています.
この応用として,最後の通信終了を介さずに次の通信開始を始めることもできます(リピートスタート).
データ転送部では1バイト〜複数バイトのデータ転送が可能です.
転送開始直後の1バイトは必ずコントローラからターゲットへの転送で,ターゲット・アドレスと以降のデータ転送での転送方向(送信なのか受信なのか)を指定します.
I²Cの仕様では,2バイト目以降のデータ転送のバイト数に特に制限は設けられていません[図7].
同一ターゲットへの通信でデータの送信・受信を切り替えたり,別のターゲットへの通信を行う場合には,改めて通信を開始してターゲット・アドレスと転送方向を指定し直します.
図7:I²Cの通信の基本構造
基本の通信の単位はデータの8ビットのあとに1ビットを追加した9ビットとなっています.データはMSBファーストの8ビット.最後の1ビットは通信をその都度確認するためにデータが送られたのとは逆方向に返されるアクノリッジ・ビットです.I²Cでは常にこの9ビットを単位として転送が行われます[図8].
データは1クロックで1ビットを送信,または受信するようになっています.
データはクロックに同期して変化します.SDAの状態変化(LOWからHIGH,またはHIGHからLOWへの変化)はSCLがLOWの時ににしか許されておらず,SCLがHIGHの間はLOWまたはHIGH状態を維持します[図9].
図8:8ビットのデータ転送に必ず1ビットのアクノリッジが返る
図9:SDA信号の変化は,SCLがLOWの期間中に
通信の開始と終了は,それぞれスタート・コンディション,ストップ・コンディションで通知されます.これが転送の区切りとなります.
先に「SDAの変化はSCLがLOWの時ににしか許されてない」と述べましたが,このスタート/ストップ・コンディションは例外です.
SCLがHIGHとなっている時,SDAがHIGH→LOWに変化すると,これがスタート・コンディションとなります.同様にSCLがHIGHとなっている時にLOW→HIGHへ変化するとストップ・コンディションとなります[図10].
図10:スタート・コンディションとストップ・コンディション
スタート・コンディション後の転送中の状態を「ビジー」と呼び,ストップ・コンディション後の転送が行われていない状態を「フリー」と呼びます.スタート・コンディションはこのフリーの状態で開始されます.
スタート/ストップ・コンディションとSCLの出力はコントローラが行います.
スタート・コンディションに続く9ビットの転送は,ターゲット・アドレスと転送方向の指定に使われます.
さらにそれに続く1回.または複数回の9ビット単位の転送で,データの転送が行われます.
スタート・コンディション,ストップ・コンディションの他にもうひとつ,転送の区切りとなる「リピート・スタート・コンディション」が定義されています.
スタート・コンディションはバスのフリー状態から開始されますが,バスをフリー状態にするには一旦ストップ・コンディションを経なければなりません.
コントローラは連続して転送を行う場合には,このストップ・コンディションの発行を省略可能です.フリー状態を経ずに次の転送を開始するのがリピート・スタート・コンディションです[図11].
図11:リピートスタート・コンディション
前の転送でストップ・コンディションを出さずにスタート・コンディションを発生させるとリピート・スタート・コンディションになります.リピート・スタート・コンディションは機能の点においてスタート・コンディションと全く同じです.以下では特別に「リピート・スタート・コンディション」と言わない限り,スタート・コンディションはリピート・スタート・コンディションを含むものとします.
リピート・スタート・コンディションはマルチ・コントローラ環境で,あるひとつのコントローラがバスの使用権を保持したまま複数の転送を連続して行うために設けられています.これはバスが一旦フリー状態になると,そのタイミングで別のコントローラが転送を開始する可能性があるからです.ストップ・コンディションを介さずにバスをビジー状態にしておくことで,バスの使用権を持ったままにできます.
ここからは(リピート)スタート・コンディションからストップ・コンディションまで,または(リピート)スタート・コンディションから次のリピート・スタート・コンディションまでの単位を便宜的に「トランザクション」と呼ぶことにします.
トランザクション[図12]は必ずスタート・コンディションで開始されます.スタート・コンディションの後にコントローラから送られるデータはターゲット・アドレスと転送方向の指定です.
図12:基本的なI2C転送と波形の例 (ライト・トランザクション例)
ターゲット・アドレスは通信を行うデバイスを指定するための7ビットの情報です.このアドレスが一致したデバイスとの通信が行われます (I²C仕様書には「10ビット・アドレッシング」がオプションとして規定されていますが,ほとんどの場合が7ビットで使われるためこれには言及しません).
7ビットのアドレスに続いて転送方向の指定(R/W)ビットが送られます.このビットが「0」であればコントローラからターゲットへのライト転送,「1」であればターゲットからコントローラへのリード転送となります.
ターゲット・アドレスの7ビットとR/Wビットの1ビットのあとの9ビット目はアクノリッジ・ビットです.このビットはターゲット側から返信されるLOWの信号です.
コントローラから出力されたターゲット・アドレスで指定されたデバイスが存在すれば,そのターゲット・デバイスはアクノリッジ・ビットとしてSDAにLOWを出力します.この間,コントローラはHIGHを出しているので,もしターゲットが存在しなかった場合はSDAはHIGHのまま,つまりターゲットが存在すればアクノリッジ・ビットはLOW,存在しなければHIGHとなります.このアクノリッジ・ビットがLOWであることをACK(アック:アクノリッジ),HIGHであることをNACK(ナック:ノット・アクノリッジ)といいます.
ターゲット・アドレスと転送方向を出力し,ACKが返ってきたら,次はデータの転送が行われます.もしターゲットが存在せず,NACKが返ってきたならここでトランザクションは終了です (コントローラがストップ・コンディション,またはリピートスタート・コンディションを発行します).
データの転送方向がライトなら,次の8ビットの転送はコントローラからターゲットへ,さらにその後に1ビットのアクノリッジ・ビットがターゲットからコントローラへの通信となります.
リード転送であればコントローラはSDAをHIGH状態に保ち,SCLに同期してターゲットから出力される8ビットを読み込みます.このリード転送にも必ずアクノリッジ・ビットが存在します.リード転送のデータに付けられるアクノリッジ・ビットは,コントローラから出力されます.リード転送を継続する場合にはACKを,転送を打ち切る場合にはNACKを返すようにします.
ACK/NACKはI²Cの通信には重要です.ACKによって相手の状態を常に確認しながら通信するようになっているためです.NACKが発生すると通信はそこで終了します.
NACKが発生する条件をI²C仕様書から引用すると以下のようになります.
ひとつのトランザクション内ではデータの転送方向は一定です.このため,あるターゲット・デバイスに何かを書き込んだあとに読み出しを行うような時には,トランザクションを連続で発生させることになります.
例えばあるターゲット・デバイスのレジスタ番号を指定して,そこから読み出しを行うような場合には,ライト転送に続いてリード転送を行う例がそれに当てはまります.
このような転送の場合,ターゲット・デバイスによってはトランザクションの区切りにリピート・スタート・コンディションが必要なものや,逆にリピート・スタート・コンディションでは期待した動作をしないものがあったりします.これはターゲット・デバイスの仕様によるものなので,注意しなければなりません.
I2C バス仕様およびユーザーマニュアル (Rev5.0 日本語版)
https://www.nxp.com/docs/ja/user-guide/UM10204.pdf
I2C バス仕様およびユーザーマニュアル (Rev7.0 英語版)
https://www.nxp.com/docs/en/user-guide/UM10204.pdf
インターフェース 2024年3月号(CQ出版):特集『ゼロから作るシリアル通信[UART/I2C/SPIをPicoで]』
https://interface.cqpub.co.jp/magazine/202403/
トランジスタ技術スペシャル No.161 『測る 量る 計る 回路&テクニック集』付録:「2線シリアル・インターフェース I²C詳解」 - 上記雑誌記事は,この記事から抜粋
https://www.cqpub.co.jp/trs/trsp161.htm
NXPコミュニティ・ブログ:I²Cハードウェア・デバッグ
https://community.nxp.com/t5/NXP-Tech-Blog/I-C-%E3%83%8F%E3%83%BC%E3%83%89%E3%82%A6%E3%82%A7%E3%82%A...
NXPコミュニティ・ブログ:I3C:その次のシリアルバス
https://community.nxp.com/t5/NXP-Tech-Blog/I3C-%E3%81%9D%E3%81%AE%E6%AC%A1%E3%81%AE%E3%82%B7%E3%83%A...
NXPコミュニティ・ブログ:SPIバスの概要
https://community.nxp.com/t5/NXP-Tech-Blog/SPI%E3%83%90%E3%82%B9%E3%81%AE%E6%A6%82%E8%A6%81/ba-p/203...
[初出:インターフェース 2024年3月号(CQ出版)「I2C&SPIをゼロから作る②…I2Cの通信規格」p55-61.ブログ掲載にあたり通信仕様解説部分を抜粋,加筆修正]
変更履歴:
2025-02-03:初版
2025-02-04:「4. 参考資料」の項にブログ記事「I²Cハードウェア・デバッグ」を追
2025-03-05:「2.2 オープンドレイン出力(ワイヤード・アンド)」の項.参照図番号を訂正
=========================
本投稿の「Comment」欄にコメントをいただいても,現在返信に対応しておりません.
お手数をおかけしますが,お問い合わせの際には,NXP代理店,もしくはNXPまでお問い合わせください.
只有注册用户才能在此添加评论。 如果您已经注册,请登录。 如果您还没有注册,请注册并登录。