嵌入式系統通訊基礎概念
本文介紹嵌入式系統中常見的硬體通訊介面,說明 MCU 與感測器、儲存晶片、顯示器、通訊模組等周邊元件之間,如何透過 UART、I2C、SPI、CAN、RS-485 等介面交換資料。
1. 為什麼嵌入式系統需要通訊介面?
在嵌入式系統中,MCU 通常不會單獨工作。它需要和許多外部元件溝通,例如:
- 感測器:溫度、壓力、加速度、電流、電壓。
- 儲存元件:EEPROM、Flash、SD card。
- 顯示元件:LCD、OLED。
- 通訊模組:Wi-Fi、Bluetooth、GPS、4G / 5G。
- 電源管理晶片:PMIC、Battery Gauge。
- 馬達與致動器控制晶片。
不同周邊的速度、距離、腳位數、抗干擾能力與通訊模式不同,因此會使用不同的通訊介面。
2. 硬體通訊的核心分類
理解 UART、I2C、SPI、CAN、RS-485 前,先掌握幾個基本分類會比較容易。
2.1 並列通訊 vs. 序列通訊
並列通訊
並列通訊會同時使用多條資料線傳送多個位元,例如 8-bit、16-bit 或更寬的資料匯流排。
特點
- 一次可傳送多個位元。
- 需要較多腳位與較複雜佈線。
- 高速時容易遇到線長差異、訊號同步、電磁干擾等問題。
- 常見於短距離、高頻寬或晶片內部匯流排。
序列通訊
序列通訊會將資料位元依序傳送,通常使用較少訊號線。
傳統低速板上序列介面速度可能低於並列匯流排,但現代高速序列介面可以透過高頻率、差動訊號與編碼技術達到非常高的傳輸率,例如 USB、PCIe、SATA、Ethernet 等。
常見嵌入式序列介面:
- UART:TX / RX
- I2C:SDA / SCL
- SPI:SCK / MOSI / MISO / CS
- CAN、RS-485:常見為差動訊號線
2.2 同步通訊 vs. 非同步通訊
同步通訊
同步通訊通常會有時脈訊號,接收端依照時脈邊緣讀取資料。
常見例子:
- I2C
- SPI
非同步通訊
非同步通訊沒有共用時脈線,雙方必須事先約定相同的傳輸速率,也就是 鮑率 (Baud Rate)。
常見例子:
- UART
2.3 單工、半雙工、全雙工
| 模式 | 說明 | 常見例子 |
|---|---|---|
| 單工 (Simplex) | 只能單向傳輸,發送端與接收端角色固定。 | 單向感測器輸出 |
| 半雙工 (Half-Duplex) | 可雙向傳輸,但同一時間只能一方傳送。 | I2C、RS-485 常見用法 |
| 全雙工 (Full-Duplex) | 可同時雙向傳輸。 | UART、SPI |
2.4 單端訊號 vs. 差動訊號
單端訊號
單端訊號是用一條訊號線相對於 GND 的電位高低表示資料。
常見例子:
- UART TTL
- I2C
- SPI
差動訊號
差動訊號使用兩條線之間的電壓差表示資料,抗干擾能力較好,適合較長距離或雜訊較多的環境。
常見例子:
- CAN
- RS-485
- USB
- Ethernet
3. UART:通用非同步收發器
UART (Universal Asynchronous Receiver-Transmitter) 是一種簡單、常見的點對點非同步通訊介面。
它常用於 MCU 與電腦、模組或另一顆 MCU 之間的資料交換。
3.1 UART 接線概念
最基本 UART 通訊通常需要:
- TX:Transmit,發送資料。
- RX:Receive,接收資料。
- GND:共地。
兩端連接時通常要交叉:
- A 的 TX 接 B 的 RX。
- A 的 RX 接 B 的 TX。
- A 的 GND 接 B 的 GND。
實務上除了接線正確,也要確認雙方電壓準位相容。例如 3.3V TTL、5V TTL 與 RS-232 level 不可直接混接,必要時需使用 level shifter 或對應收發器。
3.2 UART 資料怎麼傳?
UART 沒有 clock 線,因此雙方要先設定相同鮑率,例如 9600、115200、921600 bps。
UART 傳送一筆資料時,通常會在資料位元前後加上 start bit 與 stop bit,讓接收端知道資料從哪裡開始、到哪裡結束。
| 欄位 | 作用 |
|---|---|
| Idle / 閒置 | 線路閒置時通常維持 High。 |
| Start Bit / 起始位元 | 線路拉 Low,表示一筆資料開始。 |
| Data Bits / 資料位元 | 實際傳送的資料,常見為 8-bit。 |
| Parity Bit / 同位檢查位元 | 可選,用於簡單錯誤檢查。 |
| Stop Bit / 停止位元 | 回到 High,表示一筆資料結束。 |
flowchart LR
Idle["閒置:High"] --> Start["起始位元:Low"]
Start --> Data["資料位元"]
Data --> Parity["同位檢查:可選"]
Parity --> Stop["停止位元:High"]
Stop --> Idle2["回到閒置或傳下一筆"]
3.3 UART 常見應用
- MCU 偵錯 console。
- USB-UART 轉接器。
- GPS 模組。
- Bluetooth 模組。
- Wi-Fi / 4G / 5G 模組 AT command。
- 兩顆 MCU 之間的簡單資料傳輸。
3.4 UART 優缺點
| 項目 | 說明 |
|---|---|
| 優點 | 簡單、線少、好除錯、硬體支援普遍。 |
| 限制 | 通常是點對點,沒有內建位址,雙方 baud rate 必須一致。 |
4. I2C:積體電路匯流排
I2C (Inter-Integrated Circuit) 是一種同步、半雙工、匯流排式的通訊協定,適合短距離、低到中速的板上通訊。
它最大的特色是:只用 SDA 與 SCL 兩條線,就能掛多個裝置。
4.1 I2C 接線與拓撲
I2C 主要使用兩條線:
- SCL (Serial Clock):時脈線,通常由主控端 (Controller) 產生 clock。
- SDA (Serial Data):資料線,用來傳送位址、命令與資料。
SDA 與 SCL 通常是 開路汲極 (Open-Drain) 架構,需要上拉電阻,讓匯流排閒置時維持高電位。
4.2 I2C 資料怎麼傳?
I2C 通訊由主控端 (Controller) 主導。主控端產生 SCL clock,並透過 SDA 傳送位址、命令與資料。
一個簡化的 I2C 寫入流程如下:
sequenceDiagram
participant C as 主控端
participant T as 目標裝置
C->>T: START
C->>T: 位址 + 寫入位元
T-->>C: ACK
C->>T: 暫存器 / 命令
T-->>C: ACK
C->>T: 資料 Byte
T-->>C: ACK
C->>T: STOP
重點概念:
- START:主控端 (Controller) 宣告一次交易開始。
- Address + R/W bit:指定要通訊的目標裝置 (Target),以及這次是讀取或寫入。
- ACK / NACK:接收方回應是否收到。
- Data Byte:實際傳輸的資料。
- STOP:主控端 (Controller) 宣告交易結束。
4.3 I2C 位址與 ACK
I2C 目標裝置 (Target) 會有位址,常見為 7-bit address。主控端送出位址後,只有位址符合的目標裝置會回應 ACK。
這也是 I2C 可以在同一組 SDA / SCL 上掛多個裝置的原因。
4.4 I2C 多主控仲裁
I2C 支援多主控,但實務上較常見的是單主控、多目標裝置 (Single-Controller, Multi-Target)。
若多個主控端 (Controller) 同時嘗試傳送,I2C 會透過 open-drain 線路特性與仲裁機制處理。
簡化概念如下:
flowchart TD
C1["主控端 A 嘗試送出 High"] --> Check["主控端 A 讀回 SDA 狀態"]
C2["主控端 B 同時送出 Low"] --> Bus["SDA 被拉成 Low"]
Bus --> Check
Check --> Lose["主控端 A 發現送出與讀回不同,失去仲裁"]
Bus --> Continue["主控端 B 繼續傳輸"]
這個機制讓匯流排不會因為兩個主控端同時發送而直接失控。
4.5 I2C 常見應用
- 溫溼度感測器。
- 加速度計 / 陀螺儀。
- RTC 時鐘晶片。
- EEPROM。
- 小型 OLED 顯示器。
- PMIC 控制介面。
- Battery Gauge。
4.6 I2C 優缺點
| 項目 | 說明 |
|---|---|
| 優點 | 只需 SDA / SCL 兩條線即可掛多個裝置,適合低速感測器與控制介面。 |
| 限制 | 速度不如 SPI,需處理上拉電阻、位址衝突、匯流排電容與裝置相容性。 |
5. SPI:序列周邊介面
SPI (Serial Peripheral Interface) 是一種高速、同步、通常全雙工的板上通訊介面。
它常用於需要較高頻寬的周邊,例如 Flash、顯示器、ADC、DAC。
5.1 SPI 接線概念
標準 SPI 常見四種主要訊號:
- SCK (Serial Clock):時脈,由主控端 (Controller) 輸出。
- MOSI (Master Out, Slave In):主控端傳給周邊裝置的資料線。在現代去爭議術語中也稱為 COPI (Controller Out Peripheral In)。
- MISO (Master In, Slave Out):周邊裝置傳給主控端的資料線。在現代去爭議術語中也稱為 CIPO (Controller In Peripheral Out)。
- CS / SS (Chip Select / Slave Select):片選線,用來選定目標周邊裝置 (Peripheral)。
5.2 SPI 資料怎麼傳?
SPI 由主控端 (Controller) 主導。主控端先透過 CS 選定周邊裝置 (Peripheral),再輸出 SCK clock。每個 clock 週期中,資料可以同時透過 MOSI (COPI) 送出,並透過 MISO (CIPO) 收回。
sequenceDiagram
participant C as 主控端
participant P1 as 周邊裝置 1
participant P2 as 周邊裝置 2
C->>P1: CS1 拉 Low(選取周邊裝置 1)
Note over P2: CS2 維持 High(周邊裝置 2 未選取)
C->>P1: SCK 開始輸出時脈
C->>P1: COPI (MOSI) 傳送資料
P1-->>C: CIPO (MISO) 同步回傳資料
C->>P1: CS1 拉 High(交易結束)
重點概念:
- CS 拉 Low:選取目標周邊裝置。
- SCK:由主控端產生 clock。
- MOSI:主控端傳資料給周邊裝置。
- MISO:周邊裝置傳資料給主控端。
- CS 拉 High:結束此次交易。
5.3 SPI 模式:CPOL / CPHA
不同 SPI 裝置可能要求不同 clock 極性與取樣時機,常用 CPOL / CPHA 表示,也就是 SPI Mode 0、1、2、3。
這篇只需要知道:
SPI 主控端與周邊裝置的 mode 設定必須一致,否則可能會讀到錯誤資料。
詳細波形與 setup / hold timing 可留到進階文章或 datasheet 再看。
5.4 SPI 常見應用
- SPI Flash。
- SD card 模組。
- LCD / OLED 顯示器。
- ADC / DAC。
- Ethernet 控制器。
- 高速感測器。
5.5 SPI 優缺點
| 項目 | 說明 |
|---|---|
| 優點 | 速度快、協定簡單、通常可全雙工傳輸。 |
| 限制 | 腳位較多,多個周邊裝置時通常需要多條 CS 線;不同裝置的 SPI mode 需正確設定。 |
6. CAN:車載與工控常見匯流排
CAN (Controller Area Network) 常見於車用電子、機器人與工業控制。
CAN 適合多節點、抗干擾、可靠度要求較高的控制網路。
6.1 CAN 匯流排概念
CAN 通常使用差動訊號線,例如 CAN_H 與 CAN_L,多個節點掛在同一條 bus 上。
6.2 CAN 資料怎麼傳?
CAN 不是用傳統「裝置位址」指定接收者,而是每個訊息帶有 Identifier。各節點根據 identifier 判斷要不要接收與處理該訊息。
簡化概念:
flowchart TD
NodeA["節點 A 傳送 ID 0x100 訊息"] --> Bus["CAN 匯流排"]
Bus --> NodeB["節點 B:ID 符合,接收並處理"]
Bus --> NodeC["節點 C:ID 不符,忽略"]
Bus --> NodeD["節點 D:ID 符合,接收並處理"]
CAN 也有硬體仲裁機制,當多個節點同時發送時,identifier 優先權較高的訊息會先成功送出。
入門階段只要先理解:CAN 是多節點差動 bus,訊息用 identifier 區分,且具有仲裁與錯誤偵測能力。
6.3 CAN 常見應用
- 車用 ECU。
- BMS 電池管理系統。
- 機器人控制。
- 工業控制。
- 馬達控制網路。
7. RS-485:工業長距離通訊常見實體層
RS-485 是常見於工業環境的差動實體層標準,常搭配 Modbus RTU 等上層協定使用。
RS-485 本身比較像「電氣層 / 實體層規格」,不是完整的通訊協定。實際資料格式通常由 Modbus RTU 或自訂協定決定。
7.1 RS-485 匯流排概念
RS-485 常見為半雙工多點匯流排,多個節點共用一對差動線。
7.2 RS-485 資料怎麼傳?
在常見半雙工 RS-485 中(例如搭配 Modbus 協定),通常採用單一用戶端 (Client) 與多個伺服器 (Server) 的架構,同一時間只允許一個節點發送,其他節點接收。
sequenceDiagram
participant C as 用戶端
participant B as RS-485 匯流排
participant S as 伺服器
C->>B: 切換為 Tx 模式
C->>S: 傳送請求封包
C->>B: 釋放匯流排(切回 Rx 模式)
S->>B: 切換為 Tx 模式
S-->>C: 回傳回應封包
S->>B: 釋放匯流排(切回 Rx 模式)
實務上,RS-485 常需要控制 transceiver 的 DE / RE 腳位,以切換傳送與接收方向。不過詳細時序可以留到進階文章再談。
7.3 RS-485 常見應用
- Modbus RTU。
- PLC。
- 工業感測器。
- 電表。
- 馬達控制器。
- 長距離設備通訊。
在低速與良好線材條件下,RS-485 傳輸距離可達約 1200 公尺。
8. UART、I2C、SPI、CAN、RS-485 比較表
| 特性 | UART | I2C | SPI | CAN | RS-485 |
|---|---|---|---|---|---|
| 定位 | 點對點序列通訊 | 短距離板上匯流排 | 高速板上周邊介面 | 多節點控制匯流排 | 工業差動實體層 |
| 時脈 | 非同步,無 clock 線 | 同步,SCL | 同步,SCK | 協定內同步機制 | 依上層協定,常見 UART-like |
| 典型線路 | TX / RX / GND | SDA / SCL / GND | SCK / MOSI / MISO / CS / GND | CAN_H / CAN_L | A / B 差動線 |
| 雙工 | 通常全雙工 | 半雙工 | 通常全雙工 | 半雙工概念 | 常見半雙工 |
| 多裝置能力 | 原生不適合多點 | 支援多目標裝置 (Target) | 多周邊裝置 (Peripheral) 需多 CS 或 daisy-chain | 支援多節點 | 支援多點 |
| 速度 | 從低速到數 Mbps,依硬體而定 | 常見 100 kbit/s 到 3.4 Mbit/s | 可達數 MHz 到數十 MHz | 依 CAN / CAN FD 規格 | 與距離、線材、協定有關 |
| 距離 | 短距離 | 短距離板上 | 短距離板上 | 車用 / 工控距離 | 工業長距離 |
| 抗干擾 | 普通 | 普通 | 普通 | 較佳 | 較佳 |
| 常見用途 | Console、模組 AT command | 感測器、RTC、EEPROM | Flash、LCD、ADC/DAC | 車用、BMS、馬達控制 | Modbus RTU、PLC、工業設備 |
9. 選型建議
| 需求 | 常見選擇 |
|---|---|
| MCU 與電腦除錯 console | UART |
| MCU 控制 Wi-Fi / GPS / 4G 模組 | UART |
| 多個低速感測器共用少量腳位 | I2C |
| 小型 EEPROM、RTC、PMIC 控制 | I2C |
| 高速 Flash、顯示器、ADC / DAC | SPI |
| 車用或多節點控制網路 | CAN |
| 工業長距離多點通訊 | RS-485 |
| 只想要最簡單的點對點通訊 | UART |
| 需要線少又能掛多個低速裝置 | I2C |
| 需要高速、低協定負擔 | SPI |
10. 總結
嵌入式通訊介面的選擇,通常取決於以下因素:
- 需要幾條線?
- 是否需要掛多個裝置?
- 速度需求多高?
- 傳輸距離多遠?
- 環境雜訊是否嚴重?
- 是否需要錯誤偵測與仲裁?
- 軟硬體實作成本能接受多少?
簡單記法:
- UART:最簡單,適合點對點與除錯。
- I2C:線少,適合多個低速板上裝置。
- SPI:速度快,適合高頻寬周邊。
- CAN:可靠、抗干擾,適合車用與多節點控制。
- RS-485:適合工業長距離多點通訊。
相關概念延伸閱讀
- 程式設計基礎概念與運作原理:理解驅動硬體通訊的程式邏輯。
- 網路通訊基礎概念與協定原理:對比板上通訊與網際網路通訊的差異。