> For the complete documentation index, see [llms.txt](https://taiphoon-com.gitbook.io/taiphoon.com-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://taiphoon-com.gitbook.io/taiphoon.com-docs/knowledge-base/commication-bus.md).

# 通訊匯流排(I2C, SPI)

### 什麼是通訊匯流排 <a href="#undefined" id="undefined"></a>

通訊匯流排可以理解為一組共享的訊號線與通訊規則，讓飛控上的 MCU 與感測器、記憶體或其他周邊裝置能交換資料。

在飛控系統中，不同匯流排各有不同定位。I2C 與 SPI 通常用在飛控板上或非常靠近飛控的位置，因為它們偏向短距離、低到中等距離的板級通訊，而不是長距離外接周邊鏈路。

### 為什麼需要不同匯流排 <a href="#undefined" id="undefined"></a>

飛控系統同時要處理高速 IMU、氣壓計、磁力計、Flash、距離感測器與其他外設，因此不可能只靠一種通訊方式完成所有任務。

不同匯流排的取捨通常落在幾個面向：速度、接線複雜度、可掛接裝置數量、抗干擾能力與可接受的配線距離。

## I2C <a href="#i2c" id="i2c"></a>

### 什麼是 I2C <a href="#i2c" id="i2c"></a>

I2C（Inter-Integrated Circuit）是一種兩線式序列匯流排，允許多個裝置共用同一組資料線與時脈線。

它的主要優點是接線簡單、節省 MCU 腳位，並且可在同一條匯流排上掛接多個裝置，因此很適合低速到中速、短距離的感測器通訊。

### I2C 的基本訊號 <a href="#i2c" id="i2c"></a>

I2C 最基本使用兩條訊號線：

| 訊號  | 用途            |
| --- | ------------- |
| SCL | 時脈線，由主控端提供時脈。 |
| SDA | 資料線，雙向共享。     |

實務上，I2C 也一定需要電源與地線，但通訊本身的核心只有 SCL 與 SDA 兩條。

### I2C 如何選擇裝置 <a href="#i2c" id="i2c"></a>

I2C 是可定址的匯流排，每個裝置會有自己的位址，主控端透過位址決定要和哪一個裝置通訊。

這種架構讓多個感測器可以共用同一組線路，但前提是同一條匯流排上的每個裝置位址不能衝突；如果兩個裝置使用同樣位址，又無法修改位址，就不能直接掛在同一條 I2C 上。

### I2C 常見速度 <a href="#i2c" id="i2c"></a>

I2C 常見速度通常是 **100 kHz** 與 **400 kHz**，分別對應標準模式與快速模式。

對飛控應用來說，這樣的速度適合氣壓計、磁力計、LED、部分測距儀與其他低速感測器，但通常不適合高更新率、對延遲敏感的主 IMU 資料流。

### I2C 常見用途 <a href="#i2c" id="i2c"></a>

在飛控系統中，I2C 常見於以下情境：

* 板上的氣壓計或次要磁力計。
* 短距離外接的羅盤、LED 或部分測距儀。
* 某些只提供 I2C 介面的低速感測器。

PX4 文件特別指出，I2C 適合短距離、板內或近距離連接，並常用來連接 compass、rangefinder 與 LEDs 等周邊。

### I2C 的限制 <a href="#i2c" id="i2c"></a>

I2C 雖然接線簡單，但它不適合長距離、高干擾或高頻寬場景。

在無人機環境中，I2C 超過大約 10 到 15 公分後，容易因線路電容與雜訊影響而變得不可靠，因此外接模組若距離較遠，通常不建議繼續使用 I2C。

### Pull-up 電阻 <a href="#pull-up" id="pull-up"></a>

I2C 的 SDA 與 SCL 需要透過 pull-up 電阻拉到 3.3V，匯流排才能正常工作。

很多飛控板已經在板上提供這些 pull-up，但如果外接裝置或轉接板的電路設計不同，仍應確認是否存在重複 pull-up、缺少 pull-up，或電壓等級不相容的情況。

### I2C 匯流排鎖死 <a href="#i2c" id="i2c"></a>

I2C 的一個典型問題，是某個裝置可能因干擾、韌體錯誤或傳輸中斷而把 SDA 持續拉低，導致整條匯流排無法再正常工作。

這類情況常被稱為 bus lockup。當它發生時，通常不是單一裝置出問題而已，而是整條 I2C 上的其他裝置都可能一起失效，很多情況下需要重新上電才能恢復。

### 為什麼不建議主 IMU 用 I2C <a href="#imu--i2c" id="imu--i2c"></a>

根據PX4 文件建議，IMU 不應透過 I2C 連接，因為 I2C 的速度不足以支撐高頻率感測與像振動濾波這類需要大量即時資料的工作。

此外，當同一條 I2C 上裝置越多，效能還會進一步下降，因此對姿態控制最關鍵的主 IMU，通常會改用更快、更穩定的 SPI。

## SPI <a href="#spi" id="spi"></a>

### 什麼是 SPI <a href="#spi" id="spi"></a>

SPI（Serial Peripheral Interface）是一種高速序列匯流排，使用獨立的傳送、接收與時脈線，並以片選線決定當前要和哪一個裝置通訊。

相較於 I2C，SPI 接線較多，但換來更高速度、更低延遲與更穩定的板內資料傳輸能力，因此常用於主 IMU、Flash 與其他高速裝置。

### SPI 的基本訊號 <a href="#spi" id="spi"></a>

SPI 最常見的訊號如下：

| 訊號   | 用途              |
| ---- | --------------- |
| SCLK | 時脈線，由主控端提供。     |
| MOSI | 主控端輸出、裝置端輸入。    |
| MISO | 裝置端輸出、主控端輸入。    |
| CS   | 片選線，每個裝置通常各有一條。 |

與 I2C 最大的差異之一是，SPI 沒有裝置位址概念；它是靠 CS 線來指定要啟用哪一個周邊。

### SPI 的速度與全雙工特性 <a href="#spi" id="spi"></a>

SPI 常見速度約在 **1 到 10 MHz**，部分裝置還可支援更高速度。

此外，SPI 是**全雙工**通訊，代表主控端傳送資料給裝置的同時，也能同步接收裝置送回的資料，這對高頻感測器與即時資料交換特別有利。

### SPI 常見用途 <a href="#spi" id="spi"></a>

在飛控系統中，SPI 最常用於：

* 主 IMU（加速度計、陀螺儀）。
* 板上高速感測器。
* 外部或板載 Flash 記憶體。
* 某些需要較高取樣率或較低延遲的周邊。

### SPI 的限制 <a href="#spi" id="spi"></a>

SPI 的主要限制不是速度，而是擴充接線成本與距離。

因為每增加一個 SPI 裝置，通常就需要多一條獨立的 CS 線；另外 SPI 並不是為長線傳輸設計的，通常只適合板上或非常短距離連線，不適合把高速 SPI 拉到機體遠端去接外部模組。

### SPI 為什麼適合主 IMU <a href="#spi--imu" id="spi--imu"></a>

主 IMU 需要高頻率、低延遲且穩定的資料傳輸，以支撐姿態估測、控制迴圈與振動處理。

相較於 I2C，SPI 能提供更高時脈、更少匯流排共享衝突與更好的即時性，因此大多數現代飛控都會讓主 IMU 走 SPI，而不是 I2C。

### I2C 與 SPI 比較 <a href="#i2c--spi" id="i2c--spi"></a>

### 基本差異 <a href="#undefined" id="undefined"></a>

I2C 與 SPI 都常出現在飛控板上，但用途並不相同。

| 項目     | I2C               | SPI                |
| ------ | ----------------- | ------------------ |
| 線數     | 2 條核心訊號線：SCL、SDA。 | 3 條共享線加每裝置 1 條 CS。 |
| 裝置選擇方式 | 位址。               | 片選線 CS。            |
| 典型速度   | 100 kHz、400 kHz。  | 1–10 MHz           |
| 可擴充性   | 多裝置共用兩線，容易擴充。     | 每加一個裝置通常要多一條 CS。   |
| 適合距離   | 很短，板上或近距離。        | 板上或極短距離。           |
| 常見用途   | 氣壓計、磁力計、測距儀、LED。  | 主 IMU、Flash、高速感測器。 |

### 如何選擇 <a href="#undefined" id="undefined"></a>

如果需求是**接線簡單、裝置數量多、資料量不大**，I2C 通常較合適。

如果需求是**高速度、低延遲、高更新率**，尤其是和主 IMU 或高速記憶體有關，SPI 通常會是更好的選擇。

## 與其他匯流排的關係 <a href="#undefined" id="undefined"></a>

### 為什麼外接周邊常改用 CAN 或 UART <a href="#can--uart" id="can--uart"></a>

I2C 與 SPI 雖然很重要，但它們多半是板內或近距離使用的匯流排。

當感測器位置離飛控較遠，或系統環境存在較強電磁干擾時，外接周邊更常改用 UART 或 CAN；其中 CAN 在抗雜訊與長距離可靠性方面通常更有優勢。

### 常見問題 <a href="#undefined" id="undefined"></a>

### I2C 常見問題 <a href="#i2c" id="i2c"></a>

I2C 的典型問題包括：

* 位址衝突，兩個裝置使用相同位址。
* 缺少或重複 pull-up 電阻。
* 線材太長，導致訊號品質下降。
* 某個裝置把匯流排鎖死，造成整條 bus 無法工作。

### SPI 常見問題 <a href="#spi" id="spi"></a>

SPI 的典型問題包括：

* CS 線接錯或漂浮，導致裝置未被正確選取。
* MOSI、MISO、SCLK 對應錯誤。
* 把 SPI 拉到過長外接線路，導致訊號品質下降。
* 多個裝置共用線路時，片選控制不正確造成資料衝突。

### 建議排查順序 <a href="#undefined" id="undefined"></a>

若 I2C 或 SPI 周邊無法正常工作，建議依下列順序檢查：

1. 確認訊號線名稱與實體接線對應正確。
2. 確認電壓等級與供電正常。
3. I2C 要檢查裝置位址與 pull-up 電阻。
4. SPI 要檢查 CS 線是否接對且由正確腳位控制。
5. 確認該飛控韌體是否支援對應裝置與對應匯流排。
6. 必要時使用邏輯分析儀觀察 SCL/SDA 或 SCLK/MOSI/MISO/CS 的實際波形與封包。

### 注意事項 <a href="#undefined" id="undefined"></a>

**注意：** I2C 與 SPI 都不是為長距離外接配線設計的匯流排，若模組需要離飛控較遠，應先重新評估是否改用更適合的介面。

**注意：** 不要因為某個感測器同時支援 I2C 與 SPI，就直接假設兩種模式可以隨意替換；實際還要看飛控板是否有對外提供對應匯流排與韌體是否支援。

**注意：** 主 IMU 與姿態控制高度相關，通常應優先使用 SPI，不建議以 I2C 承擔主要姿態感測來源。
