常見介面 I2C, SPI, UART 教材

本頁整理嵌入式系統與 IoT 裝置最常見的三種通訊介面:I2C、SPI、UART。內容包含基本原理、接線方式、時序觀念、常見除錯方法,以及 Python / MicroPython 範例與常用模組。

I2C SPI UART Raspberry Pi Pico W ESP32

一、為什麼要學通訊介面

  • 感測器、螢幕、記憶體、GPS、藍牙模組都需要與主控板交換資料。
  • 不同模組不一定使用同一種通訊方式。
  • 選對介面可以降低接線難度、提升速度,並減少除錯時間。
  • 理解介面後,便能從 datasheet、接線圖與時序圖判斷模組的通訊需求。

二、先記住的總結

  • I2C:兩條線、可掛多裝置,常用於多感測器與低速周邊。
  • SPI:速度快、全雙工、常用於顯示器與高速周邊。
  • UART:最直觀、最像序列埠,常用於除錯、GNSS、藍牙與數據機模組連接。
建議的學習順序可先從 UART 開始,再進入 I2C,最後學習 SPI,以便循序掌握序列通訊、位址機制與時序控制。

三、三種介面的整體比較

項目 I2C SPI UART
線數2 條主線(SDA, SCL)至少 4 條(MOSI, MISO, SCLK, CS)2 條主線(TX, RX)
拓樸多主/多從匯流排單主多從較常見點對點
位址機制有裝置位址通常靠 CS 選擇裝置無位址概念
速度低到中
全雙工通常可雙向,但不如 SPI 典型
適合裝置感測器、RTC、EEPROMTFT、ADC、Flash、RF 模組GPS、藍牙、序列除錯
上手門檻中偏高

四、I2C 介面

1. 基本觀念

2. I2C 為什麼常用於感測器

3. 常見問題

4. 重要術語

術語說明
Start Condition主機開始一筆 I2C 傳輸的訊號。
Stop Condition主機結束一筆 I2C 傳輸的訊號。
ACK / NACK接收端是否確認收到資料。
7-bit address最常見的裝置位址格式。
Pull-up resistorSDA、SCL 常需要上拉到高電位。

5. Raspberry Pi Python 範例概念

from smbus2 import SMBus

I2C_BUS = 1
DEVICE_ADDR = 0x48
REGISTER = 0x00

with SMBus(I2C_BUS) as bus:
data = bus.read_byte_data(DEVICE_ADDR, REGISTER)
print("read:", data)

6. Pico W MicroPython 掃描 I2C 位址

from machine import Pin, I2C

i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=400000)
print('devices:', [hex(x) for x in i2c.scan()])
實作時可先使用 i2c.scan() 確認匯流排上可偵測到的裝置位址,再進入寄存器讀寫。

五、SPI 介面

1. 基本觀念

2. SPI 的特點

3. 為什麼 SPI 比較快

4. 實作時要特別注意

5. SPI Mode 概念

ModeCPOLCPHA說明
Mode 000最常見,時脈閒置低,前緣取樣
Mode 101時脈閒置低,後緣取樣
Mode 210時脈閒置高,前緣取樣
Mode 311時脈閒置高,後緣取樣

6. MicroPython 範例

from machine import Pin, SPI

spi = SPI(0, baudrate=1000000, polarity=0, phase=0,
sck=Pin(18), mosi=Pin(19), miso=Pin(16))
cs = Pin(17, Pin.OUT)

cs.value(0)
spi.write(b'\x9F')
chip_id = spi.read(3)
cs.value(1)

print(chip_id)
SPI 裝置最常見的錯誤不是「完全沒接好」,而是 mode 設錯、CS 切換時機不對、或 baudrate 太高。

六、UART 介面

1. 基本觀念

2. UART 最常見的參數

參數常見值說明
Baud rate9600, 115200每秒傳輸符號速率
Data bits8資料位元數
ParityNone / Even / Odd同位檢查
Stop bits1 或 2結束位元

3. UART 適合哪些場景

4. MicroPython 範例

from machine import UART, Pin
import time

uart = UART(0, baudrate=115200, tx=Pin(0), rx=Pin(1))

while True:
uart.write('hello from pico\n')
if uart.any():
msg = uart.read()
print(msg)
time.sleep(1)

5. Raspberry Pi Python 範例

import serial

ser = serial.Serial('/dev/serial0', 115200, timeout=1)
ser.write(b'hello from pi\n')
print(ser.readline().decode(errors='ignore'))
UART 很適合用於「Pico W 傳資料給 Raspberry Pi」這類情境,因為資料內容可直接以字串形式觀察與除錯。

七、常用元件與模組範例

下面整理一些常見且容易取得的模組。這些連結可作為查閱 datasheet、接線圖與函式庫範例的起點。

1. I2C 常用元件

元件 / 模組簡要說明參考連結
BME280 常見的環境感測器,可量測溫度、濕度與氣壓,常用於 IoT 入門、環境監測與小型氣象站。 Adafruit BME280 資訊
SSD1306 OLED 常見的小型單色 OLED 顯示器,常拿來顯示感測值、IP 位址、系統狀態。 Monochrome OLED Breakouts
ADS1115 16-bit ADC 模組,當主控板類比輸入不足或需要較高解析度時很常使用。 Adafruit ADS1115 / ADC Breakouts

2. SPI 常用元件

元件 / 模組簡要說明參考連結
MicroSD Card Breakout 常用來做資料記錄,例如把感測資料、影像紀錄或實驗結果存入記憶卡。 Adafruit MicroSD SPI / SDIO Breakout
MCP3008 8 通道 10-bit ADC,常見於 Raspberry Pi 需要讀取類比感測器時的入門模組。 MCP3008 SPI ADC 資訊
ST7735 TFT Display 彩色 TFT 顯示器,適合做即時數值、圖形介面或小型儀表板。 1.8" TFT Display Breakout

3. UART 常用元件

元件 / 模組簡要說明參考連結
NEO-6M / Ultimate GPS 類 GPS 模組 可透過 UART 輸出經緯度、時間、速度等 NMEA 資訊,適合定位與移動物件專題。 Adafruit Ultimate GPS
HC-05 Bluetooth 經典藍牙序列模組,可把 UART 資料轉成藍牙通訊,常用於手機控制與無線序列橋接。 HC-05 AT Commands Tutorial
SIM800L GSM / GPRS 可用 UART 控制發送 SMS、撥號與行動資料連線,適合遠距通知與行動通訊主題。 SIM800L GSM Module Tutorial
若要建立基礎模組組合,可從 I2C 的 BME280 與 OLED、SPI 的 MicroSD 或 TFT、UART 的 GPS 與藍牙模組開始。

八、接線觀念與電壓注意事項

裝置成功供電不代表通訊一定成功;電壓、共地、腳位與協定參數都必須同時正確。

九、如何選擇 I2C、SPI、UART

情境建議介面原因
多個低速感測器I2C接線省、可共用匯流排
高速顯示器或外部記憶體SPI速度高、時序直接
模組除錯與字串傳輸UART容易理解、終端機可直接觀察
兩塊板子先做簡單通訊實驗UART最容易做出第一個成功結果

十、常見除錯方法

1. I2C 除錯

2. SPI 除錯

3. UART 除錯

4. 進階工具

加入 logic analyzer 觀察時序波形,有助於對照程式碼、腳位訊號與協定行為。