單主機 MCU 透過 SPI 總線外接 5 個從機設備,總共需要多少 MCU 引腳?本文解析 SPI 信號線定義、片選線分配、引腳數計算與擴展方案。
| 信號 | 全稱 | 方向 (主機視角) | 功能 |
|---|---|---|---|
| SCLK/SCK | Serial Clock | 輸出 | 同步時鐘,主機產生 |
| MOSI/SDO | Master Out Slave In | 輸出 | 主機發送資料 |
| MISO/SDI | Master In Slave Out | 輸入 | 主機接收資料 |
| CS/SS/NSS | Chip Select / Slave Select | 輸出 | 選中特定從機 (低電平有效) |
註:最佳回答稱「主機 9 個,從機 4 個」,可能包含 中斷/資料就緒 (IRQ/DRDY) 線或 Reset 線。純 SPI 通訊主機需 8 個 GPIO。
MCU (Master) Slave 1 Slave 2 ... Slave 5
┌──────────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐
│ GPIO_SCLK ───┼────────────────┤ SCK │ │ SCK │ ... │ SCK │
│ GPIO_MOSI ───┼────────────────┤ MOSI │ │ MOSI │ │ MOSI │
│ GPIO_MISO ───┼────────────────┤ MISO │ │ MISO │ │ MISO │
│ GPIO_CS1 ────┼────────────────┤ CS │ │ │ │ │
│ GPIO_CS2 ────┼────────────────┤ │ │ CS │ │ │
│ GPIO_CS3 ────┼────────────────┤ │ │ │ ... │ │
│ GPIO_CS4 ────┼────────────────┤ │ │ │ │ │
│ GPIO_CS5 ────┼────────────────┤ │ │ │ │ CS │
└──────────────┘ └─────────┘ └─────────┘ └─────────┘
| 方案 | 原理 | 額外引腳 | 支援從機數 | 複雜度 |
|---|---|---|---|---|
| 3-to-8 解碼器 (74HC138) | 3 根 GPIO 控制 8 片選 | 3 (省 2) | 8 | 低 |
| I/O 擴展芯片 (MCP23S17, SPI; PCF8574, I2C) | 串列總線擴展 GPIO | 2 (I2C) / 1 (SPI CS) | 16/8 | 中 |
| 鏈式 SPI (Daisy Chain) | 從機串聯,單 CS | 1 CS (共用) | 多 (資料鏈長) | 高 (協議修改) |
| 多路複用器 (CD4051/74HC4051) | 類比開關切換 CS/MISO | 3 控制 + 1 公共 | 8 | 中 |
// 選中特定從機
void spi_select(uint8_t slave_idx) {
for (int i = 0; i < NUM_SLAVES; i++) {
gpio_write(cs_pins[i], i == slave_idx ? 0 : 1); // 低電平選中
}
}
// 收發一個位元組
uint8_t spi_transfer(uint8_t slave_idx, uint8_t tx_byte) {
spi_select(slave_idx);
uint8_t rx = spi_hal_transfer(tx_byte); // HAL 庫函數
spi_select(0xFF); // 取消選中 (所有 CS 拉高)
return rx;
}
5 從機 SPI:主機 8 GPIO (3 共享 + 5 CS),每從機 4 引腳。GPIO 緊張時首選 74HC138 解碼器 (3 線控 8 片選),或 I/O 擴展芯片。軟體層面封裝片選管理函數,確保同一時間僅一片選有效。