※本記事にはプロモーション(広告)が含まれています。
I2C通信(アイ・スクエア・シー)は、SDA と SCL の2本の線を何台もの部品で共有し、H をプルアップ抵抗で作る通信です。SPI・UART との違いは一覧表、プルアップ抵抗の値は早見表で決められます。
マイコンにセンサや表示器をつなぐとき、ほとんどの場合 I2C・SPI・UART のどれかを使います。解説の多くは「どんな順番でデータを送るか」という手順の話です。
ところが、つないでも動かない原因の多くは手順ではなく電気の側にあります。プルアップ抵抗がない、線が長すぎて波形がゆれる、TX どうしをつないだ、電圧が合っていない、といったものです。この記事は、その電気の違いだけに絞って、図と計算で説明します。

I2C・SPI・UART の違いは「線の数」と「H を誰が作るか」
I2C は2本の線に全部の部品をつなぎ、H はプルアップ抵抗が作ります。SPI は3本の共通の線と、部品ごとの CS で選びます。UART は TX と RX の2本を、相手とたすきがけにつなぎます。
3つの配線を並べると、つなぎ方の違いがはっきりします。
| 方式 | 信号の線 | つなぎ方 |
|---|---|---|
| I2C | SDA(データ)・SCL(クロック) | 全部の部品が同じ2本につながる。相手は「住所(アドレス)」で呼び分ける |
| SPI | SCLK・MOSI・MISO + CS | 3本は共通。相手を選ぶ CS は部品ごとに1本ずつ |
| UART | TX(送る)・RX(受ける) | 自分の TX を相手の RX へ。1対1でつなぐ |
どの方式でも、信号の線とは別に GND(電流の帰り道で、電圧の基準)を必ずつなぎます。信号の電圧は GND を基準にした高さなので、GND がつながっていないと H と L を正しく読めません。
つまり、まず線の数とつなぎ方を見れば、どの方式かと、どこでつまずきやすいかがわかります。

I2C・SPI・UART の電気的な違い一覧
電気で比べるときの大事な違いは、H を作る仕組み(プルアップかプッシュプルか)、クロックの線の有無、伸ばせる配線の長さの3つです。
| 比べる点 | I2C | SPI | UART |
|---|---|---|---|
| 信号の線 | 2本 | 3本+CS | 2本 |
| H を作るのは | プルアップ抵抗 | 送る側の出力 | 送る側の出力 |
| 出力の形 | オープンドレイン | プッシュプル | プッシュプル |
| クロックの線 | ある(SCL) | ある(SCLK) | ない(速さを約束する) |
| 速さの例 | 100kHz・400kHz・1MHz | 数MHz 以上も(部品で決まる) | 9600〜115200bps など |
| 配線の長さ | 基板の中・短い線 | 基板の中・短い線 | 長くするなら RS-232 など |
I2C の速さは仕様書(NXP の UM10204)で決まっています。100kHz(Standard-mode)、400kHz(Fast-mode)、1MHz(Fast-mode Plus)です。SPI には決まった上限がなく、つなぐ部品のデータシートに書かれた最大の速さで決まります。
UART の速さは bps(1秒に何ビット送るか)で表します。9600bps や115200bps がよく使われます。
つまり、I2C は「抵抗しだいで遅くなる」、SPI と UART は「出力が速いぶん、線の長さや電圧に注意」が電気の違いです。

オープンドレインとプッシュプル:I2C だけプルアップ抵抗が要る理由
I2C の出力はオープンドレインで、線を L に下げることしかできません。H は、線と電源の間に入れたプルアップ抵抗が引き上げて作ります。SPI と UART の出力はプッシュプルで、H も L も自分で出せます。
プッシュプルの出力には、電源側と GND 側に2つのスイッチ(トランジスタ)が入っています。上を ON にすれば H、下を ON にすれば L です。自分で電流を押し出せるので、すばやく切り替えられます。
オープンドレインの出力には、GND 側のスイッチしかありません。ON にすると線は L になります。OFF にすると、出力は線から「手を離した」状態になり、線の電圧を決めるのはプルアップ抵抗です。
プルアップ抵抗がないと入力が「浮く」理由と、抵抗の選び方の基本がわかる
つまり、I2C の H は抵抗まかせ。だから抵抗の値で、H に上がる速さが変わります。

なぜ I2C はオープンドレインなのか:何台つないでもぶつからない
オープンドレインでは、だれか1台でも L にすれば線は L になり、全員が手を離したときだけ H になります。これを「ワイヤードAND」と呼び、何台つないでも出力どうしがぶつかりません。
もし I2C がプッシュプルだったら、ある部品が H を出し、別の部品が L を出した瞬間に、電源から GND へ大きな電流が流れてしまいます。出力どうしの「けんか」です。
オープンドレインなら、L を出す部品は線を GND へつなぐだけです。H は抵抗が作るので、L を出す部品があっても、流れる電流は抵抗で決まる小さな値です。3.3V と 2.2kΩ なら、(3.3V−0.4V)÷2.2kΩ≒1.3mA です。
I2C は、この性質を使って、返事の合図(ACK)や、受け手が「ちょっと待って」とクロックを止める仕組みを作っています。
つまり、オープンドレインは「全員で同じ線を使っても壊れない」ための形です。その代わり、H の速さは抵抗に頼ります。

I2C の立ち上がり時間:tr=0.8473×Rp×Cb
I2C の線が L から H へ上がる速さは、プルアップ抵抗 Rp とバスの容量 Cb のかけ算で決まります。仕様書 UM10204 は、30% から70% までの時間を tr=0.8473×Rp×Cb と計算しています。
線と部品の足には、小さなコンデンサがあるのと同じ性質(容量)があります。手を離すと、プルアップ抵抗を通って電流が流れ込み、この容量に電気がたまって、電圧がゆっくり上がっていきます。
I2C は、電源電圧(VDD)の30% 以下を L、70% 以上を H と読みます。そこで、30% になる時間と70% になる時間の差を「立ち上がり時間 tr」と呼びます。
仕様書は、tr の上限を決めています。100kHz で1000ns、400kHz で300ns、1MHz で120ns です。tr がこれを超えないように、抵抗と容量を選びます。
R×C の「時定数」と、63.2% まで上がる理由を、基本から確かめられる
つまり、抵抗を大きくしても、容量が大きくなっても、H に上がるのが遅くなります。

バスの容量 Cb の見積もり方:部品の足・基板の線・ケーブルを足す
バスの容量 Cb は、つないだ部品の足の容量、基板の線の容量、ケーブルの容量を全部足したものです。I2C の仕様書は、Cb を400pF(1MHz では550pF)までと決めています。
UM10204 では、部品の足1本あたりの容量は最大10pF です。部品を3つつなげば、それだけで最大30pF になります。
ここに基板の線の容量と、ケーブルの容量が加わります。ケーブルの容量は意外に大きく、TI の資料(SLLA037A)では、RS-232 用のケーブルで1m あたり約100pF の例が出ています。
| 中身 | 容量(例) | 根拠 |
|---|---|---|
| マイコン・センサA・センサB の足 | 10pF×3=30pF | UM10204 の上限(Ci 最大10pF) |
| 基板の線 | 20pF | 計算用の例(イメージ) |
| ケーブル 50cm | 50pF | 1m あたり100pF とした例 |
| 合計 Cb | 100pF | この記事の計算例に使う値 |
つまり、Cb は「つないだものの足し算」。ケーブルをつなぐと一気に増えます。

I2C のプルアップ抵抗の決め方:下限と上限を計算して間から選ぶ
プルアップ抵抗は、L のときに流れる電流で決まる「下限」と、立ち上がり時間で決まる「上限」の間から選びます。3.3V・400kHz・Cb 100pF なら 967Ω〜3.54kΩ で、2.2kΩ を選びます。
計算例:3.3V・400kHz・Cb 100pF
STEP 1 下限です。I2C の部品は、L のときに3mA を吸い込んでも0.4V 以下にできることが決まっています。抵抗が小さすぎると電流が3mA を超え、L が0.4V まで下がりきらなくなります。
Rp(min)=(3.3V−0.4V)÷0.003A=2.9÷0.003=967Ω。これより大きい抵抗にします。
STEP 2 上限です。400kHz の tr の上限は300ns です。
Rp(max)=300ns÷(0.8473×100pF)=0.0000003÷(0.8473×0.0000000001)=3,541Ω(3.54kΩ)。これより小さい抵抗にします。
STEP 3 です。967Ω〜3.54kΩ の間で、上限に余裕のある 2.2kΩ を選びます。tr=0.8473×2200Ω×100pF=186ns で、300ns の上限に対して余裕があります。L のときの電流は(3.3−0.4)÷2200≒1.3mA で、3mA 以内です。
つまり、プルアップ抵抗は「電流で下限、速さで上限」。2つの式で範囲を出してから選びます。

定番の4.7kΩ の落とし穴:400kHz では Cb 75pF までしか使えない
I2C のプルアップ抵抗は4.7kΩ がよく使われますが、400kHz では Cb が約75pF を超えると立ち上がりが遅すぎます。速さを上げるときは、抵抗を小さくし直します。
Rp(max)=tr÷(0.8473×Cb)の式を、Cb について並べかえると、ある抵抗で使える Cb の上限がわかります。Cb(max)=tr÷(0.8473×Rp)です。
| 抵抗 | 100kHz(tr 1000ns) | 400kHz(tr 300ns) |
|---|---|---|
| 2.2kΩ | 537pF | 161pF |
| 3.3kΩ | 358pF | 107pF |
| 4.7kΩ | 251pF | 75pF |
| 10kΩ | 118pF | 35pF |
100kHz のときに4.7kΩ で動いていた回路を、そのまま400kHz に上げると、Cb が75pF を超えたとたんに仕様の外になります。部品を1つ増やしたり、ケーブルをつないだりしたときも同じです。
表の値は仕様書の式による上限です。100kHz の列にある400pF 超えの値(537pF)は、Cb の上限400pF を超えるので、実際には400pF までです。
つまり、「4.7kΩ で動いた」は、そのときの速さと容量で動いただけ。条件が変わったら計算し直します。

4.7kΩ と2.2kΩ の波形を比べる:同じ400kHz・100pF
Cb 100pF で比べると、30% から70% までの時間は、4.7kΩ で約398ns、2.2kΩ で約186ns です。400kHz の上限300ns に入るのは2.2kΩ だけです。
4.7kΩ:tr=0.8473×4700Ω×100pF=0.8473×0.00000047=398ns。300ns を超えます。
2.2kΩ:tr=0.8473×2200Ω×100pF=186ns。300ns に入ります。
立ち上がりが遅いと、H になりきる前に次のクロックが来たり、ノイズで H と L の境目を何度もまたいだりして、データを読み違えるおそれがあります。L へ下がるときは、部品のスイッチが直接 GND へつなぐので速く、問題になりにくいです。
つまり、I2C の波形が「なまって」見えたら、まず抵抗と容量を疑います。

I2C のプルアップ抵抗の早見表(上限と下限)
答えだけ知りたいときは、バスの容量と速さから上限を、電源電圧から下限を表で引き、その間の E24 の値を選びます。
| バスの容量 Cb | 100kHz | 400kHz | 1MHz(Fm+) |
|---|---|---|---|
| 50pF | 23.6kΩ | 7.08kΩ | 2.83kΩ |
| 100pF | 11.8kΩ | 3.54kΩ | 1.41kΩ |
| 200pF | 5.90kΩ | 1.77kΩ | 708Ω |
| 400pF | 2.95kΩ | 885Ω(※) | 354Ω |
| 下限 3.3V | 967Ω | 967Ω | 145Ω |
| 下限 5V | 1.53kΩ | 1.53kΩ | 230Ω |
上限の値は、tr÷(0.8473×Cb)を3けたで切り捨てました。下限は(VDD−0.4V)÷IOL で、IOL は100kHz と400kHz で3mA、1MHz(Fast-mode Plus)で20mA です。
つまり、上限と下限が逆転したら「抵抗では解けない」合図。容量を減らす設計に戻ります。

SPI の線と CS:CS を L にした部品だけが返事をする
SPI は、SCLK(クロック)・MOSI(マイコンから部品へ)・MISO(部品からマイコンへ)の3本を共通にし、CS(チップセレクト)を L にした部品だけと通信します。部品が1つ増えるごとに、CS の線も1本増えます。
SPI の CS は、ふつう L で「選ぶ」という意味です(Analog Devices の解説)。CS が H の部品は、何もしません。
MISO は、全部の部品が同じ1本を使います。選ばれていない部品が MISO に H や L を出すと、選ばれた部品の返事とぶつかってしまいます。そこで、選ばれていない部品は MISO から手を離します。これをハイインピーダンス(電気的に切り離した状態)と呼びます。
MOSI・MISO は、新しい資料では SDO・SDI や COPI・CIPO と書かれることもあります。部品のデータシートでは、どちらが「出す線」かを矢印やピンの説明で確かめます。
つまり、SPI は「共通の3本+部品ごとの CS」。部品が多いと、マイコンのピンが CS で足りなくなります。

SPI の配線の長さ:速い信号は、長い線で波形がゆれる
SPI はプッシュプルで切り替わりが速いぶん、線が長いと信号が線の端ではね返り、波形がゆれます(リンギング)。線を短くし、送る側に数十Ωのダンピング抵抗を入れると、ゆれを抑えられます。
信号の切り替わりが速いと、線は「ただの導線」ではなく、信号が行って帰ってくる道として働きます。線の端で信号の一部がはね返り、もとの信号と重なって、上下にゆれる波形になります。
SCLK がゆれて、H と L の境目を2回またぐと、受ける部品はクロックを2回数えてしまいます。データが1ビットずれて、読んだ値がおかしくなります。
| 対策 | やること |
|---|---|
| 線を短くする | 基板の中で、部品をマイコンの近くに置く |
| ダンピング抵抗 | 送る側の出力のすぐ近くに、数十Ωの抵抗を直列に入れる |
| 速さを下げる | クロックを遅くすると、ゆれがおさまるのを待てる |
| GND を近くに通す | 信号の帰り道を短くする |
ダンピング抵抗が波形のゆれ(リンギング)を止める理由と、値の考え方がわかる
つまり、SPI は「速いけれど、長い線が苦手」。基板の外へ長く引き出すなら、別の方式を考えます。

UART のしくみ:クロックの線がない代わりに速さを約束する
UART は、クロックの線を持たない代わりに、送る側と受ける側で「1秒に何ビット送るか(bps)」を同じにしておきます。115200bps なら、1ビットは8.68µs です。
何も送っていないとき、TX の線は H のままです。送り始めの合図として1ビットぶん L にし(スタートビット)、そのあと8ビットのデータを下の位から順に送り、最後に H のストップビットで終わります。
1ビットの時間は、1÷115200=0.00000868秒=8.68µs です。9600bps なら1÷9600≒104µs です。
受ける側は、スタートビットの L を見つけたら、自分の時計で8.68µs ごとに線の電圧を読みます。両方の速さがずれていると、読む位置が少しずつずれて、最後のほうのビットを読み違えます。
つまり、UART で文字化けするときは、まず両方の bps の設定がそろっているかを見ます。

UART の電圧:TTL(3.3V・5V)と RS-232 は別もの
マイコンの UART は、0V と電源電圧(3.3V か5V)で H と L を表す「TTL レベル」です。パソコンや古い機器の RS-232 は、±5〜15V で、しかも 1 がマイナス・0 がプラスと向きが逆です。
TI の資料(SLLA037A)によると、RS-232 の送る側は、0 を+5〜+15V、1 を−5〜−15V で出します。受ける側は、+3V 以上を 0、−3V 以下を 1 と読み、その間は決まりません。
| 種類 | 1(H) | 0(L) | マイコンに直接 |
|---|---|---|---|
| TTL 3.3V | 約3.3V | 約0V | 3.3V のマイコンならつなげる |
| TTL 5V | 約5V | 約0V | 3.3V のマイコンには注意 |
| RS-232 | −5〜−15V | +5〜+15V | つながない(変換 IC を通す) |
RS-232 の機器とマイコンをつなぐときは、MAX232 などの変換 IC を間に入れます。MAX232 は5V 1つで動き、3kΩ の負荷で ±5V 以上(標準 ±7V)を出し、受ける側は ±30V まで耐えます(TI のデータシート)。
「USB シリアル変換器」にも、TTL 用と RS-232 用があります。マイコンにつなぐのは TTL 用で、さらに3.3V か5V かを、マイコンの電圧に合わせます。
差動の方式が、長い線でもノイズに強い理由が図でわかる
つまり、UART は「TX と RX」と「電圧の種類」の2つをそろえる。RS-232 はマイコンに直接つなぎません。

実物で確かめる:オシロで I2C の立ち上がりを測る
計算した立ち上がり時間は、オシロスコープで確かめます。SCL と GND にプローブを当て、30% と70% の電圧にカーソルを置いて、その間の時間が上限以下かを見ます。
例の回路(2.2kΩ・100pF)なら、計算では約186ns です。400kHz の上限300ns より短ければ OK です。
オシロの画面の時間軸・電圧軸の読み方と、カーソルでの測り方がわかる
つまり、計算した値を、実物の波形で「答え合わせ」します。

よくある失敗4つ:プルアップ・TX と RX・電圧・GND
I2C・SPI・UART が動かないときに多い失敗は、I2C のプルアップ抵抗がない、UART の TX どうしをつないだ、RS-232 をマイコンに直接つないだ、GND をつないでいない、の4つです。
失敗1:I2C にプルアップ抵抗がない
センサの小さな基板(モジュール)には、プルアップ抵抗が付いているものと、付いていないものがあります。どちらにも付いていないと、SDA・SCL が H に上がりません。逆に、何枚もの基板にそれぞれ付いていると、並列になって抵抗が小さくなりすぎることもあります。
失敗2:UART の TX と TX をつないだ
名前が同じ TX どうしをつなぐと、送る線どうしがぶつかり、どちらも相手の声を聞けません。自分の TX は相手の RX へ、自分の RX は相手の TX へ、たすきがけにつなぎます。
失敗3:RS-232 をマイコンに直接つないだ
RS-232 は±5〜15V なので、3.3V のマイコンの入力に直接つなぐと、壊れることがあります。変換 IC を通します。
失敗4:GND をつないでいない
別の電源で動いている機器どうしをつなぐとき、信号の線だけつないで GND を忘れると、電圧の基準がそろわず、H と L を正しく読めません。
GND が「0V の線」ではなく「電流の帰り道」である理由がわかる
つまり、動かないときは、手順を疑う前に「プルアップ・TX と RX・電圧・GND」の4つを見ます。


