定番シリアル…I²C&SPIの基本を学ぶ


I²C/SPI/I3C 通信機能を備えるMCX A153マイコンを搭載する開発ボード



★7月25日にメルマガ筆者によるハンズオン・セミナを開催します!詳細は特設ページへ★
組み込みマイコン入門講座 特設ページ


岡野 彰文 Okano Akifumi

 旧フリースケール・セミコンダクタと合併したNXPセミコンダクターズからリリースされた新しいマイコン製品がMCXと名付けられたマイコン・ファミリです.MCXはNXPセミコンダクターズやフリースケール・セミコンダクタの従来品種の後継品種として位置付けられています.
 前回までにMCXマイコンの概要(ファミリの分類,内部ブロック),開発環境 MCU Xpressoの使い方を紹介しました.準備が整うと,いよいよマイコンを動かしてみたくなります.そこで今回は,マイコン活用の第1歩として,シリアル通信の基本について解説します.

■シリアル・バスと言えば?

 まず一般的に有名なのはUSB,それからUART….これらはよく機器間の通信に使われます.マイコンと周辺チップの接続に使われるシリアル・バスと言えば,I²CやSPIがよく使われます.

●みんな知ってるUSB

 USBは機器間の接続に使われます.PCやIoT機器,さらには家電製品と周辺デバイスを接続するためのインターフェースとして一般的です.しかし,機器内や基板内のバスとしては,あまり使われません.USBは,その使い勝手や通信速度の確保のための管理が複雑です.例えば複数の機器を接続するためにはハブが必要であったり,ホット・プラグをサポートし,相手側デバイスを認識するためのプロトコル,さらにホストとなるチップには専用のホスト・コントローラを置いてその制御が必要になるなどのオーバーヘッドが大きくなってしまうためです.

●PCとの通信ならUART

 UART(Universal Asynchronous Receiver/Transmitter)は,調歩同期方式と呼ばれる1方向に1つの信号線を使う方式です.主にマイコンとPCとの通信に使われます.シリアル・データ通信は決められた時間ごとにビットを送信し,それを受信側で受けるのですが,UARTは送受信双方が同期してない状態で使われるため「非同期通信」と呼ばれます.受信側は受け取ったデータを,送信データよりも高いクロックでサンプリング(オーバサンプリング)し,送受信タイミングのズレを相殺します.このような通信方式であるため,互いの通信速度をあらかじめ決めておく必要があります.また,通信速度を上げようとすると,受信側にはより高いクロックが必要となるため,機器内部のチップ間の通信ではあまり使われません.

●チップ間通信と言えばI²CとSPI…これが今回の主役

 I²CとSPIは,共にマイコンと周辺チップ間をつなぐバスとしてよく使われます(表1).データがクロック信号に同期する同期式であるため,チップに内蔵するインターフェース回路が比較的単純に構成できることが大きな理由で,システム設計の観点からもシンプルで使いやすいです.

▲I²C

 I²Cは複数のコントローラ(マスタ)と複数のターゲット(スレーブ)を2本の信号線だけで接続し,双方向の通信(半二重)が可能です.I²Cの良いところは,信号の特性やプロトコルが仕様で決められており,I²Cに対応したチップであれば,1つのバスに多数のチップを接続して使えることです.ただし,多くのチップではビット・レートの上限が400kHzとなっています.

▲SPI

 SPIは基本的に4本の信号線を使い,単一のコントローラと複数のターゲットを接続,双方向の通信(全二重)ができます.SPIの良いところは通信速度が速い点です.チップによって上限は異なりますが,通常は数百k~数十MHzのビット・レートとなっています.ただし,以下の弱点もあります.

      *    *
 このようにI²CとSPIは,それぞれに利点と不利な点があるため適材適所で使われています.では,I²CとSPIについて詳しく見てみましょう.



表1 I²CとSPIの比較…速度や信号線の数について

■I²Cの概要

●歴史とその仕様

 I²C(アイ・スクエアド・シー)バスは,オランダのフィリップス(現NXPセミコンダクターズ)によって1982年に開発,公開されたシリアル・バス仕様です.I²CはInter Integrated CircuitをIICと略し,さらに重なるIを自乗として略して記したものになっています.
 現在のI²Cの仕様はNXPセミコンダクターズが管理しています.この仕様は「I²C-bus specification and user manual」文書番号:UM10204として公開されており,最新版はRev.7となっています.
 日本語版はRev.5が「I²Cバス仕様およびユーザーマニュアル」として公開されています.これらの差分はI²C仕様の主要部分には及んでいないため,日本語版を参考資料として使用可能です注1

注1:Rev.5とRev.7の違いは図41と図42の変更,表5の追記,マスタ/スレーブの語をI3C同様にコントローラ/ターゲットに変更,さらに第9章の「I3C概要」が追加されている点(詳細はRev.1の表1:改版履歴を参照).

●コントローラ/ターゲット

 I²C通信は必ず主と従の関係で行われます.これらの役割を指す語として,それぞれコントローラ,ターゲットが使われます(図1).1つのI²Cバス上に複数のコントローラまたはターゲットが存在可能な仕様となっています.



図1 I²C通信は必ず主と従の関係で行われる

●物理的/電気的特徴
▲信号線はSDAとSCLの2本

 I²Cは2線式のシリアル・バスで,1つをクロック,もう1つをデータに使います.データはクロックに同期してやり取りされます.データの通信方向は送信/受信の両方に対応していますが,1本のデータ線で行うため,送受信を同時に行えず,切り替えて使います.このため送受信を同時に行える全二重ではなく,半二重と呼ばれる通信方式となります.  クロックとデータの各信号線はそれぞれSCL(シリアル・クロック・ライン)とSDA(シリアル・データ・ライン)と呼ばれます.データはクロック周期に同期して1ビットずつ送信,または受信されます.

▲オープン・ドレイン出力(ワイヤード・アンド)

 I²Cで特徴的な仕様の1つに,信号がオープン・ドレインという方法で作られる点があります.多くの通信では,ディジタル信号の出力にはプッシュプルと呼ばれる方法が使われます.プッシュプルとは“H”レベル電圧を出力する際には信号線に規定電圧を出し(プッシュ),“L”レベル電圧を出力する際にはGNDに引っ張る(プル)方法です[図2(a)].  オープン・ドレインは“L”を出力するプルは同様ですが,“H”を出力する際にはハイ・インピーダンス状態とします.この状態のとき,信号線に接続されたプルアップ抵抗によって規定の電圧が得られるようにします[図2(b)].



(a)プッシュプル方式

(b)オープン・ドレイン方式
図2 I²Cにおけるデータ線はオープン・ドレイン方式…図はICの出力端子

では,なぜこのような出力方式が採用されているのでしょうか.I²Cでは,同じ信号線に対して複数のデバイスへの同時出力を可能にするためです.複数のデバイスが出力状態にあるときに,1つでも“L”を出力しているものがあれば,信号は“L”になります.
 図3のように接続されている全デバイスが“H”を出力しているときには“H”,そうでなければ“L”となる信号の接続方法はワイヤード・アンドと呼ばれます.



図3 ワイヤード・アンド…複数のデバイスが1本のデータ線につながる

 I²Cではオプションとして,クロック・ストレッチやマルチコントローラという機能を持っています.これらは同じバス上に接続された複数のデバイスに同時に出力を行わせ,その状態をオープン・ドレイン接続で管理しています.

●クロック周波数

 I²Cでは,使用できる最大クロック周波数によってモードが規定されています(表2).最も基本となるのはスタンダード・モード(Sm)と呼ばれ,100kHz以下で動作します.次に400kHzを上限とするファースト・モード(Fm)があります.これらのSm,Fmは,ほとんどのコントローラやターゲットとなるデバイスで対応しています.さらに,1MHz以下のクロックで動作するファースト・モード・プラス(Fm+)があり,通信量が多いアプリケーションに使われます.上記のようなSm,Fm,さらにFm+が一般的によく使われます.



表2 I²Cでは,使用できる最大クロック周波数によってモードが規定されている

 これらのクロック周波数に制限を加えているのは,I²Cがオープン・ドレイン出力を使っているためです.信号線の長さや接続されるデバイスの数が多くなると,信号線の静電容量が増えます.この信号線を“H”に変化させる際には,プルアップ抵抗によって電流が制限されるため,信号の立ち上がりに時間が掛かります(図4).各モードでは許容できる静電容量や引き込み電流を規定することによってその動作を保証しています.



図4 静電容量が増えると信号の立ち上がりに時間が掛かる

●接続トポロジ…どのデバイスも2本線にぶら下がっている状態となる

 I²Cに接続されるデバイスは全て,2本の信号線(SCLとSDA)に接続されます.接続形態はマルチドロップと呼ばれます.どのデバイスも単純に2本線に「ぶら下がっている」ような形でつなぎます(図5).接続できるデバイスの数はバス容量によって制限されます.信号線が長くなるほど,接続されるデバイスの数が多くなるほど,バス容量は大きくなります.



図5 マルチドロップという接続形態…複数のデバイスが2本の線にぶら下がりデータをやり取りする

 通信はコントローラとターゲットの間で行われます.全ての通信はコントローラが主導します.I²Cでは1回の転送はコントローラとターゲットの1対1で行います.故意に複数のターゲットに同じアドレスを持たせるような通信も可能ですが,コントローラから見ると「1つのアドレスに対しての通信」しか行えません(図6).
 コントローラは通信を行うデバイスをターゲット・アドレスで指定し,データの転送方向を指示します.転送の制御(開始と終了,通信ターゲットと転送方向の指定,SCLへのクロックの出力)は全てコントローラが行います.



図6 全ての通信制御はコントローラが行う(開始/終了,ターゲットの指定,転送方向の指定,SCLへのクロック出力)

●プロトコル
▲3つの動作

 データ転送がどのように行われるのか,その手順を決めているのがプロトコルです.I²Cの通信は一般に次のような構造を持っています.

・通信開始
・データ転送
・通信終了

 この応用として,最後の通信終了を介さずに次の通信開始を始めることもできます(リピート・スタート).
 データ転送部では1~複数バイトのデータ転送が可能です.転送開始直後の1バイトは必ずコントローラからターゲットへの転送で,ターゲット・アドレスと以降のデータ転送での転送方向(送信なのか受信なのか)を指定します.
 I²Cの仕様では,2バイト目以降のデータ転送のバイト数に,特に制限は設けられていません(図7).同一ターゲットへの通信でデータの送信/受信を切り替えたり,別のターゲットへの通信を行う際には,改めて通信を開始してターゲット・アドレスと転送方向を指定し直します.



図7 I²Cのプロトコル…通信開始,データ転送,通信終了からなる.データ転送を続けるモードもある

▲データの転送単位

 基本の通信の単位は,データの8ビットのあとに1ビットを追加した9ビットとなっています.データはMSBファーストの8ビット.最後の1ビットは通信をそのつど確認するために,データが送られたのとは逆方向に返されるアクノリッジ・ビットです.I²Cでは常にこの9ビットを単位として転送が行われます(図8).データは1クロックで1ビットを送信,または受信するようになっています.

▲データの変化点

 データはクロックに同期して変化します.SDAの状態変化(“L”→“H”または“H”→“L”への変化)は,SCLが“L”のときにしか許されておらず,SCLが“H”の間は“L”または“H”を維持します(図9).



図8 データの転送単位…基本の8ビットと,戻りの1ビット



図9 データSDAは,クロックSCLが“L”の間に状態を変化させる

●転送の開始と終了
▲スタート/ストップ・コンディション

 通信の開始/終了は,それぞれスタート・コンディション,ストップ・コンディションで通知されます.これが転送の区切りとなります.  先ほど「SDAの変化はSCLが“L”のときににしか許されてない」と述べましたが,このスタート/ストップ・コンディションは例外です.SCLが“H”となっているとき,SDAが“H”→“L”に変化するとスタート・コンディションとなります.同様にSCLが“H”となっているときに“L”→“H”へ変化するとストップ・コンディションとなります(図10).



図10 通信の開始と終了はクロックSCLが“H”の間にSDAを変化させる

 スタート/ストップ・コンディションとSCLの出力はコントローラが行います.スタート・コンディションに続く9ビットの転送は,ターゲット・アドレスと転送方向の指定に使われます.

▲リピート・スタート・コンディション

 他にも転送の区切りとなるリピート・スタート・コンディションが定義されています.1つ前の転送においてストップ・コンディションを出さずにスタート・コンディションを発生させると,リピート・スタート・コンディションになります.
 ここからは(リピート)スタート・コンディションからストップ・コンディションまで,または(リピート)スタート・コンディションから次のリピート・スタート・コンディションまでの単位を便宜的にトランザクションと呼ぶことにします.

●トランザクションの構造

 トランザクションは,必ずスタート・コンディションで開始されます(図12).スタート・コンディションのあとにコントローラから送られるデータはターゲット・アドレスと転送方向の指定です.



図12 トランザクションの構造…アドレス,転送方向,データなどで構成される

 ターゲット・アドレスは通信を行うデバイスを指定するための7ビットの情報です.このアドレスが一致したデバイスとの通信が行われます.7ビットのアドレスに続いて転送方向の指定(R/W)ビットが送られます.このビットが,

・‘0’であればコントローラからターゲットへのライト転送
・‘1’であればターゲットからコントローラへのリード転送

となります.ターゲット・アドレスの7ビットとR/Wビットの1ビットのあとの9ビット目はアクノリッジ・ビットです.このビットはターゲット側から返信される“L”の信号です.
 コントローラから出力されたターゲット・アドレスで指定されたデバイスが存在すれば,そのターゲット・デバイスはアクノリッジ・ビットとしてSDAに“L”を出力します.この間,コントローラは“H”を出しているので,もしターゲットが存在しなかった場合はSDAは“H”のまま,つまりターゲットが存在すればアクノリッジ・ビットは“L”,存在しなければ“H”となります.このアクノリッジ・ビットが“L”であることをACK(アック:アクノリッジ),“H”であることをNACK(ナック:ノット・アクノリッジ)と言います.
 データの転送方向がライトなら,次の8ビットの転送はコントローラからターゲットへ,さらにその後に1ビットのアクノリッジ・ビットがターゲットからコントローラへの通信となります.

●実際の通信ではデバイスごとに仕様が微妙に異なることもある

 1つのトランザクション内では,データの転送方向は一定です.このため,あるターゲット・デバイスに何かを書き込んだあとに読み出しを行うときには,トランザクションを連続で発生させることになります.例えばあるターゲット・デバイスのレジスタ番号を指定して,そこから読み出しを行うような場合には,ライト転送に続いてリード転送を行う例がそれに当てはまります.このような転送の場合,ターゲット・デバイスによってはトランザクションの区切りにリピート・スタート・コンディションが必要な品があります.逆にリピート・スタート・コンディションを入れると期待した動作をしない品があったりもします.これはターゲット・デバイスの仕様によるものなので,注意しなければなりません.

■SPIの概要

●歴史

 SPIバスはアメリカのモトローラ(現NXPセミコンダクターズ)によって提唱されたシリアル・バス仕様です.仕様が策定されたのは1980年代半ばとされています.SPIはSerial Peripheral Interfaceの略で,プロセッサと周辺チップとの接続に使われる4線式のシリアル・バスとして開発されました.この派生仕様としての3線式SPIバスも存在しますが,基本となっているのは元の4線式です.

●主従の関係をコントローラ/ターゲット,またはメイン/サブノード(サブ)と表現する

 SPIでも主と従の関係で転送が行われます.これまで,それぞれにマスタ/スレーブの語が一般に使われていましたが,現在はコントローラ/ターゲットに改められています.これまでの役割名の頭文字「M/S」をそのまま当てはめて,メイン/サブノード(サブ)とも呼ばれます(本記事では以降,メイン/サブノードと表現する).
 SPIバスは4本の信号線を使った同期式シリアル・インターフェースです.同期式シリアル・インターフェースとは,クロック信号に同期してデータを送受する方法で,信号線のうちの1本をクロックに使います.
 データには2本,メインからサブノードへと,サブノードからメインへの転送にそれぞれ1本使います.
 もう1本はチップ・セレクトと呼ばれる信号です.SPIでは転送対象を指定するためのアドレス指定を行う方法がありません.そのためチップ・セレクト信号を使って,転送対象のデバイスを指定します(図13).



図13 SPI通信に必要な信号線は4本

●4本の信号名

 信号名はさまざまな名前で呼ばれる場合があります.次の信号名はOSHWA注2による呼称です.

・SDO:データ出力
・SDI:データ入力
・SCK:シリアル・クロック
・CS:チップ・セレクト

 上記では,SDO,SDIの名称は各チップにおけるデータ入出力の方向が基準になっています.この場合,各ピン名としては明確で良いのですが,メイン/サブノード間での信号の方向を示すには不便です,  これに代わって回路図上などでよく使われる信号名には以下のようなものもあります.本記事ではこれらの語に統一します.

・MOSI:メインからサブノードへのデータ(Main Out Sub In)
・MISO:サブノードからメインへのデータ(Main In Sub Out)
・SCLK:シリアル・クロック
・CS:チップ・セレクト

 これらの信号のうちMISOだけはサブノードからメインへの信号で,それ以外は全てメインからサブノードへの信号となります.通信中に信号の方向が切り替わることはありません.

注2 OSHWA (Open Source Hardware Association) は,オープンソース・ハードウェアを推進する非営利団体のこと.

●ちなみに…4本ではない変化型もある

 信号本数を節約するため,例えば片方向だけの通信が行われる場合,いずれかのデータ線が省略される場合があります.  また,送受信を時多重にしてデータ線を1本だけで使うことができるようにしたターゲットも存在します.この場合,メイン側ではMOSIとMISOを,抵抗を用いてショートして信号をまとめます.

●非転送時のハイ・インピーダンス状態

 信号はプッシュプルで出力されます.また,非データ転送時のMOSI,MISOの出力はハイ・インピーダンス状態に置かれます.これは複数のサブノードが並列に接続された際に,他の通信に影響を与えないようにするためです.

●クロック周波数に規定はない

 クロック周波数に特に規定はありません.通常は100kHz~数MHzのクロックが使われる場合が多く,上限はサブノード・デバイスの仕様によって決められます.高レートでのデータ転送が必要なアプリケーションでは,数十MHzのクロックが使われることもあります.また,メモリ・デバイスなどでは,MOSIやMISOのデータ線を複数用いて転送レートを上げる応用例もあります.

●プロトコル

 データ転送手順を決めるプロトコルも特に厳密な決まりはなく,サブノード・デバイスごとに自由に決められています.メイン側となるマイコンでは,さまざまなサブノード・デバイスをサポートするための設定が用意されています.
 基本の転送手順は,転送先のサブノードに接続されたCSをアサートしてから転送を始めます.CSデアサートで転送が終了します.CSのアサートとデアサートは,“L”と“H”の信号で行われますが,この極性はサブノード・デバイスの仕様で規定されます. データのビット順については,多くのデバイスではMSBファーストとなっていますが,これにも例外があります.転送単位とするビット数も特に決まっていません.2~16ビットとしている解説を見たことがありますが,もっと大きいビット長を単位としたサブノードも存在する(例えば64ビットなど)ため,この限りではありません.

●モード

 SPIには「モード」と呼ばれる設定があります.これはクロックの極性とエッジの選択の組み合わせを指しており,それぞれに2つの設定で4つのモードが存在します(図14).多様なメーカや設計の異なるデバイス間で,簡単かつ確実に通信を行うための重要な仕組みです.メインとサブが「どのタイミングでデータをやり取りするか」という共通のルール(モード)を決めることで,スムーズなデータ転送を実現しています.



図14 SPIでは4つのモードをクロック極性とエッジ選択の組み合わせで決める

 クロック極性(Polarity)はCPOLと呼ばれる設定で,データ非転送時のSCLKが“L”か“H”かを決める設定です.メイン側の設定ではを0に設定すると“L”,1なら“H”になります. エッジの選択(phase)はCPHAと呼ばれます.データのラッチ(取り込み)を最初のクロック・エッジで行うか,2番目のエッジで行うかを決める設定です. 0の設定で最初のエッジ,1の設定で2番目のエッジを選択します.CPOLとCPHAを組み合わせてモード0~3のように表す場合もあります(表3).これに加えてチップ・セレクトの極性が逆のサブノードも存在するので注意が必要です.



表3 SPIにおける4つのモード

●データをラッチするエッジ

 データはクロックに同期して送受信されますが,クロックの立ち上がり/立ち下がりのどちらかのエッジで変化します.図15に立ち下がりでデータが変化する例を示して説明します.メイン側デバイスが出力するSCLKの立ち下がりのタイミングに合わせて,メイン側はMOSIの,サブノード側はMISOの出力を変化させます.次のデータは次の立ち下がりで切り替わりますが,それまでの間は安定した状態になります.クロックの立ち上がりは,ちょうどこの期間に起こるため,このタイミングに合わせて互いのデータの取り込みを行います.これが「ラッチを行うエッジ」です.



図15 データの変化はクロックの立ち上がり/立ち下がりどちらかのエッジで行う…図では立ち下がりで変化させている

●データ転送

 チップ・セレクトがアサートされたのち,クロックに同期してデータを送受信します.サブノードは自身のチップ・セレクトがアサートされたことを受け,クロックに合わせてデータを取り込む,または出力します.図16はSPI転送の一例です.CSアサート中のクロックに合わせてデータがやり取りされます.



図16 SPIにおけるデータ転送の例

●接続トポロジ
▲チップ・セレクトによる並列接続とデイジーチェーン

 複数のサブノードは図17のように接続します.サブノードごとにチップ・セレクトを用意し,それぞれの信号で送受信先を指定しながら通信を行います.
 CS信号の本数を節約するために,縦続接続(デイジーチェーン)を行って,ビット長を拡張した1つのサブノードと見なして通信を行う方法も使われます(図18).



図17 SPI接続…サブノードが複数あるとき



図18 信号の本数を節約するための継続接続の例

 先にも述べましたが,複数種類のサブノードを同じSPIバスに接続する際には注意が必要です.デバイスごとにモードやチップ・セレクトの極性,さらにデータ・ビット長が同一とは限りません.このため各サブノードへの通信のたびに設定を切り替えたり,ハードウェアでの調整が必要だったりする場合があります.

■参考文献■

(1)NXP Tech Blog:「I²Cバスの概要 (日本語ブログ)」
-- https://community.nxp.com/t5/NXP-Tech-Blog/I-Cバスの概要-日本語ブログ/ba-p/2036898
(2)NXP Tech Blog:「SPIバスの概要 (日本語ブログ)」
-- https://community.nxp.com/t5/NXP-Tech-Blog/SPIバスの概要-日本語ブログ/ba-p/2036964

本記事に記載されている社名,および製品名は,一般に開発メーカの登録商標,または商標です.


・組み込みマイコン入門講座
-- https://interface.cqpub.co.jp/mcu-hands-on/

・登録内容の変更,メール・マガジン配信中止はこちらからお願いします.
-- https://cc.cqpub.co.jp/system/auth/



★メルマガ筆者によるボード付きハンズオン・セミナ開催を開催します★
I²CとSPIの良いとこ取り!次世代2線式シリアル通信「I3C」
・開催日  :2025年7月25日 10:00-17:00
・受講料  :5,000円(ボード・お弁当付き,税込み)
・使用ボード:FRDM-MCXA153(NXPセミコンダクターズ)
・講師   :岡野 彰文氏(NXPジャパン株式会社 プリンシパル・フィールド・アプリケーション・エンジニア)
※セミナ受講時に使用したFRDM-MCXA153はそのままお持ち帰り頂けます.
申し込みページはこちら


Interface 表紙

CQ出版社オフィシャルウェブサイトはこちらからどうぞ

CQ出版の雑誌・書籍のご購入は、ウェブショップで!


CQ出版社 新刊情報



POWER ELECTRONICSシリーズ

スイッチング電源[3]LLC共振コンバータの設計

Interface 2025年 7月号

プログラム改善ビフォーアフター[技100]

別冊CQ ham radio QEX Japan No.55

巻頭企画 八重洲無線 SCU-LAN10+αで作るパーフェクトなリモート環境

CQ ham radio 2025年 6月号

初夏の電波伝搬攻略ガイド

トランジスタ技術 2025年 6月号

プロ並み入門!自分だけの実験ラボ