I2C、SPI、UART 的差異:佈線、速度、使用時機比較

這三種是嵌入式開發中最先遇到的序列通訊。UART 是沒有共用時脈的一對一簡單通訊。SPI 是使用 4 條線的高速匯流排,主控端透過晶片選擇線選擇通訊對象。I2C 則由許多裝置共用 2 條線,以位址選擇通訊對象。區分使用的重點,主要是速度(SPI)、腳位數(I2C)與簡單性(UART)。

項目UARTSPII2C
佈線訊號線 2 條(TX 與 RX)加上接地訊號線 4 條(SCLK、MOSI、MISO)再加上每個裝置各 1 條的晶片選擇(CS)共用的 2 條(SDA 與 SCL)加上接地。需要上拉電阻
時脈非同步。沒有時脈線,雙方需配合鮑率同步。由主控端輸出時脈同步。由主控端輸出時脈
連接形態2 個裝置的一對一1 個主控端與多個從屬端。每個從屬端需要一條 CS 線主控端與從屬端都可有多個,共用 1 條匯流排
位址無以晶片選擇線選擇對象在通訊的開頭傳送 7 位元(也可為 10 位元)的位址
一般的速度9,600~115,200 bit/s,至數 Mbit/s多為 1~50 MHz,也有更高的元件100 kHz(標準)、400 kHz(快速)、1 MHz(快速模式加強版)、3.4 MHz(高速)
通訊方向全雙工全雙工半雙工
錯誤偵測同位位元與框架檢查(選用)機制上不具備每個位元組都會回傳 ACK/NACK
裝置增加時的腳位數每增加一個通訊對象就增加 2 條每增加一個裝置就增加 1 條 CS不會增加
距離只要使用 RS-232 或 RS-485 的驅動器,就能拉長短。在同一塊電路板上短。在同一塊電路板上
主要用途除錯用的主控台、GPS 或藍牙模組、電路板之間的連接快閃記憶體、SD 卡、顯示器、高速 ADC 與感測器低速感測器、EEPROM、即時時鐘、晶片的設定

數值為具代表性的大致參考值,會因世代或產品而異。

適用於什麼情況

UART
想以最簡單的方式連接 2 個裝置時,用於除錯用的主控台,或具備序列通訊的模組。
SPI
需要速度時。例如記憶體、顯示器、高速轉換器等。缺點是裝置增加時腳位也會增加。
I2C
低速裝置多,且腳位少時。例如感測器、小型記憶體、設定用的暫存器等。速度有限,且需要上拉電阻。

常見問題

I2C 與 SPI 哪一個比較快?

SPI。多半可在 1~50 MHz 以上運作,I2C 在一般模式為 100 kHz~1 MHz,在高速模式為 3.4 MHz。

為什麼 I2C 需要上拉電阻?

I2C 的裝置只會將線拉到低電位,或放開使其成為高電位,所以要用電阻將線拉高。如此一來,許多裝置才能安全地共用 2 條線。

UART 需要時脈線嗎?

不需要。UART 是非同步的,所以雙方必須設定為相同的鮑率。鮑率稍有偏差,就可能出現亂碼。

用 SPI 連接許多裝置時,需要幾個腳位?

SPI 除了共用的 SCLK、MOSI、MISO 之外,每個裝置還需要 1 條晶片選擇,所以裝置增加時腳位也會增加。I2C 則不論裝置數量多少都是 2 條。

相關名詞的解說

UART
不使用時脈線,傳送端與接收端以相同鮑率進行通訊的非同步序列通訊電路。以起始位元與停止位元區分字元。
SPI
配合主控端發出的時脈同時進行傳送與接收的同步序列通訊。以晶片選擇線選擇對象,用於連接高速的元件。
I2C
在時脈(SCL)與資料(SDA)兩條線上連接多個裝置,並以位址選擇對象的同步序列通訊。線路為開汲極並以上拉電阻拉高。
GPIO(通用輸入輸出)
通用輸入輸出(General Purpose Input/Output)的接腳。可由軟體設定為輸入或輸出,用於讀取開關與點亮 LED 等。

相關的比較