---
title: シリアルバスプロトコル
url: https://doc.liz6.com/ja/hardware/06-interfaces-and-communication/02-serial-bus-protocols
locale: ja
area: hardware
tags:
- hardware
- interfaces-and-communication
date: 2026-06-30
modified: 2026-07-16
description: 'シリアルバスプロトコル パラレル vs シリアル --- UART (ユニバーサル非同期送受信) 基本概念 UART: 非同期フルデュプレックス、送信側と受信側のボーレートは一致させる必要があります 接続: TXとRXをクロス接続 (フルデュプレックスで同時送受信) MCUA MCUB TX → RX RX ← TX …'
---

# シリアルバスプロトコル

## パラレル vs シリアル

```
パラレル: 複数の線で複数のビットを同時に送信 (1回に8/16/32ビット)
      高速だが、配線が多く、クロックスキューが速度を制限

シリアル: 1本の線でビットを順次送信
      配線が少なく、より高い周波数で動作可能 → 現代の高速インターフェースはすべてシリアル
```

---

## UART (ユニバーサル非同期送受信)

### 基本概念
<svg viewBox="0 0 720 300" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="UART接続とフレーム形式: 非同期フルデュプレックス、TXとRXをクロス接続">
  <defs>
    <marker id="uah" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="300" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">UART: 非同期フルデュプレックス、送信側と受信側のボーレートは一致させる必要があります</text>
  <text x="40" y="54" font-size="12" font-weight="700" fill="#1f2933">接続: TXとRXをクロス接続 (フルデュプレックスで同時送受信)</text>
  <rect x="40" y="64" width="130" height="56" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="105" y="97" text-anchor="middle" font-size="13" font-weight="700" fill="#3730a3">MCU_A</text>
  <rect x="550" y="64" width="130" height="56" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="615" y="97" text-anchor="middle" font-size="13" font-weight="700" fill="#3730a3">MCU_B</text>
  <line x1="170" y1="80" x2="550" y2="80" stroke="#475569" stroke-width="1.6" marker-end="url(#uah)"/>
  <text x="360" y="74" text-anchor="middle" font-size="11" fill="#64748b">TX → RX</text>
  <line x1="550" y1="108" x2="170" y2="108" stroke="#475569" stroke-width="1.6" marker-end="url(#uah)"/>
  <text x="360" y="124" text-anchor="middle" font-size="11" fill="#64748b">RX ← TX</text>
  <text x="40" y="150" font-size="12" font-weight="700" fill="#1f2933">フレーム形式: 1フレームのデータタイミング構造</text>
  <rect x="40" y="160" width="85" height="30" rx="5" fill="#e2e8f0"/>
  <text x="82" y="180" text-anchor="middle" font-size="10" fill="#475569">アイドル (High)</text>
  <rect x="133" y="160" width="65" height="30" rx="5" fill="#4f46e5"/>
  <text x="165" y="180" text-anchor="middle" font-size="10" font-weight="700" fill="#ffffff">Start=0</text>
  <rect x="206" y="160" width="230" height="30" rx="5" fill="#0d9488"/>
  <text x="321" y="180" text-anchor="middle" font-size="11" font-weight="700" fill="#ffffff">D0 D1 D2 D3 D4 D5 D6 D7</text>
  <rect x="444" y="160" width="90" height="30" rx="5" fill="#cbd5e1" stroke="#94a3b8" stroke-dasharray="3 2"/>
  <text x="489" y="180" text-anchor="middle" font-size="10" fill="#475569">パリティ?(オプション)</text>
  <rect x="542" y="160" width="75" height="30" rx="5" fill="#4f46e5"/>
  <text x="579" y="180" text-anchor="middle" font-size="10" font-weight="700" fill="#ffffff">Stop=1</text>
  <rect x="40" y="222" width="640" height="56" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="54" y="244" font-size="12.5" fill="#3730a3">ボーレート(9600 / 115200 / 921600…)は両者で一致させ、誤差は ±2% 以内に抑える必要があります。</text>
  <text x="54" y="264" font-size="12.5" fill="#3730a3">独立したクロック線を持たない非同期通信のため、双方が合意したボーレートに基づいて各ビットを同期します。</text>
</svg>

### パラメータ
| パラメータ | 一般的な値 |
|------|--------|
| ボーレート | 9600, 19200, 38400, 57600, 115200 |
| データビット | 8 (最も一般的), 7 |
| ストップビット | 1, 2 |
| パリティビット | None, Even, Odd |
| フロー制御 | None, RTS/CTS (ハードウェア) |

### 応用
```
デバッグ用シリアル (printf 出力をPCへ)
GPS/Bluetooth モジュール (AT コマンド)
レガシー周辺機器との通信

利点: シンプル、安価、信頼性が高い
欠点: 1対1のみ、低速、標準的なアプリケーション層がない
```

---

## I2C (Inter-Integrated Circuit)

### 基本概念
```
同期、ハーフデュプレックス、マルチマスター・マルチスレーブ
2本の線: SCL (クロック) + SDA (データ)

    Vcc
     │
    Rp  Rp          ← プルアップ抵抗 (必須!)
     │   │
     ├───┼────────── SDA
     │   │
    ┌┴┐ ┌┴┐
    │マスター│ │スレーブ1│ │スレーブ2│ ...
    └─┘ └─┬┘ └─┬┘
          │    │
          ├────┼──── SCL
          │    │
         GND  GND

SCL: マスターがクロックを供給
SDA: 双方向データ (オープンドレイン、ワイヤードAND)
各スレーブには一意の 7bit (または 10bit) アドレスがある
```

### 通信プロセス
```
スタートコンディション: SCL が High の間に SDA が Low に遷移
  送信: 7bitアドレス + R/W bit → スレーブが ACK で応答
  転送: 8bitデータ + ACK ...  (連続して可能)
ストップコンディション: SCL が High の間に SDA が High に遷移

ACK: 9番目のクロックで SDA=0 (受信側が確認)
NACK: 9番目のクロックで SDA=1 (応答なし)

速度モード:
  Standard: 100 kHz
  Fast:     400 kHz  (最も一般的)
  Fast+:    1 MHz
  High Speed: 3.4 MHz
```

### 応用
```
センサー (温度/湿度/IMU/照度...)
EEPROM/FRAM メモリ
RTC (リアルタイムクロック)
PMIC (電源管理)
OLED ディスプレイ
ほぼすべての低速周辺機器

利点: 2本の線で済み、複数デバイスで共有可能
欠点: 速度が遅い、プルアップ設計が必要で消費電力が大きくなる、アドレス競合の可能性
```

### プルアップ抵抗の選択
```
R が小さすぎる → 消費電力が大きい (シンク電流が大きい)
R が大きすぎる → 立ち上がりエッジが遅すぎる → 速度が制限される

経験則:
  100kHz: 4.7kΩ
  400kHz: 2.2kΩ
  1MHz:   1kΩ またはそれ以下

計算: Rmax = tr / (0.8473 × Cbus)
     tr = 300ns (100kHz モード)
     Cbus = バス容量 (チップ + PCB配線)
```

---

## SPI (Serial Peripheral Interface)

### 基本概念
<svg viewBox="0 0 720 340" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="SPI接続図: 同期フルデュプレックス、マスターがクロックとチップセレクトを制御、4本の信号線">
  <defs>
    <marker id="spah" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker>
  </defs>
  <rect width="720" height="340" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">SPI: 同期フルデュプレックス、マスターがクロックとチップセレクトを独占 (最低4本の線)</text>
  <rect x="40" y="50" width="130" height="180" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="105" y="134" text-anchor="middle" font-size="13" font-weight="700" fill="#3730a3">MCU</text>
  <text x="105" y="152" text-anchor="middle" font-size="11" fill="#4f46e5">(マスター)</text>
  <rect x="550" y="50" width="130" height="180" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="615" y="134" text-anchor="middle" font-size="13" font-weight="700" fill="#115e59">周辺機器</text>
  <text x="615" y="152" text-anchor="middle" font-size="11" fill="#0f766e">(スレーブ)</text>
  <line x1="170" y1="85" x2="550" y2="85" stroke="#4f46e5" stroke-width="1.6" marker-end="url(#spah)"/>
  <text x="360" y="78" text-anchor="middle" font-size="11" font-weight="700" fill="#4f46e5">SCK · クロック (マスター→スレーブ)</text>
  <line x1="170" y1="125" x2="550" y2="125" stroke="#4f46e5" stroke-width="1.6" marker-end="url(#spah)"/>
  <text x="360" y="118" text-anchor="middle" font-size="11" font-weight="700" fill="#4f46e5">MOSI · マスター送信、スレーブ受信</text>
  <line x1="550" y1="165" x2="170" y2="165" stroke="#0d9488" stroke-width="1.6" marker-end="url(#spah)"/>
  <text x="360" y="158" text-anchor="middle" font-size="11" font-weight="700" fill="#0f766e">MISO · スレーブ送信、マスター受信</text>
  <line x1="170" y1="205" x2="550" y2="205" stroke="#64748b" stroke-width="1.6" marker-end="url(#spah)"/>
  <text x="360" y="198" text-anchor="middle" font-size="11" font-weight="700" fill="#475569">CSn · チップセレクト (スレーブごとに1本)</text>
  <text x="40" y="248" font-size="12" font-weight="700" fill="#1f2933">スレーブが複数の場合の接続方法: 2つの方式</text>
  <rect x="40" y="256" width="310" height="34" rx="6" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="54" y="277.5" font-size="11.5" fill="#3730a3">独立 CSn: 各スレーブに1本のチップセレクト線、SCK/MOSI/MISO は共有</text>
  <rect x="370" y="256" width="310" height="34" rx="6" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="384" y="277.5" font-size="11.5" fill="#115e59">ジャイアントチェーン: スレーブの MISO → 次のスレーブの MOSI に直列接続、CSn は1本共用</text>
  <rect x="40" y="300" width="640" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="54" y="321.5" font-size="12.5" fill="#3730a3">マスターがクロックとチップセレクトを独占; アドレス機構はなく、CSn でスレーブを識別。</text>
</svg>

### クロックモード (CPOL, CPHA)
```
CPOL=0: SCK はアイドル時に Low
CPOL=1: SCK はアイドル時に High
CPHA=0: 最初のエッジでサンプリング
CPHA=1: 2番目のエッジでサンプリング

最も一般的: Mode 0 (CPOL=0, CPHA=0) と Mode 3 (CPOL=1, CPHA=1)

双方で一致させる必要があります! そうしないと通信が破綻します。
```

### 特徴
```
利点:
  ✓ フルデュプレックス (同時送受信)
  ✓ 高速 (数十 MHz、場合によっては 100MHz+)
  ✓ アドレス機構がない → オーバーヘッドなし
  ✓ 柔軟 (任意のフレーム長)

欠点:
  ✗ 配線が多い (スレーブ n 個に対して n+3 本)
  ✗ 標準的なプロトコル層がない (物理層/リンク層のみ定義)
  ✗ スレーブ側のフロー制御 (ACK) がない
  ✗ 距離が短い (PCB レベル)

応用: Flash (NOR/NAND), ADC/DAC, ディスプレイ, 以太网 PHY
```

---

## 3つのバスの比較

| 特性 | UART | I2C | SPI |
|------|------|-----|-----|
| 線数 | 2 (TX+RX) | 2 (SCL+SDA) | 4 (SCK+MOSI+MISO+CS) |
| 通信方式 | 非同期 | 同期 | 同期 |
| デュプレックス | フルデュプレックス | ハーフデュプレックス | フルデュプレックス |
| 速度 | < 1Mbps | < 3.4Mbps | 数十 Mbps |
| マルチスレーブ | なし | あり (アドレス) | あり (CSn) |
| 距離 | 長い (RS-232) | PCB/短距離 | PCB |
| 複雑さ | 最も簡単 | 中程度 | 比較的簡単 |
| フロー制御 | なし/ハードウェア | ACK/NACK | なし |
| 典型的な用途 | デバッグ/無線モジュール | センサー | Flash/ディスプレイ/高速 |

---

## 速查: どのプロトコルを選ぶべきか

```
センサー読み取り (低速、多数のデバイス) → I2C
高速データ転送 (Flash/SD/ディスプレイ) → SPI
デバッグ情報、無線モジュール → UART
複数バイトレジスタの読み書き → I2C (アドレス+データ) または SPI
バッテリー駆動 (最低消費電力) → I2C (静止状態でほぼゼロ消費)
耐ノイズ性 (長距離差分) → RS-485 (UART の物理層バリアント)
```

---
*キーワード: UART, I2C, SPI, ボーレート, SCL, SDA, MOSI, MISO, CS, プルアップ抵抗, ACK*
