首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MCU SPI 總線外接 5 個從機所需引腳數計算

     編輯:程式設計疑難解答

單主機 MCU 透過 SPI 總線外接 5 個從機設備,總共需要多少 MCU 引腳?本文解析 SPI 信號線定義、片選線分配、引腳數計算與擴展方案。

SPI 核心信號線 (4 線制)

信號全稱方向 (主機視角)功能
SCLK/SCKSerial Clock輸出同步時鐘,主機產生
MOSI/SDOMaster Out Slave In輸出主機發送資料
MISO/SDIMaster In Slave Out輸入主機接收資料
CS/SS/NSSChip Select / Slave Select輸出選中特定從機 (低電平有效)

引腳數計算

  • 共享線:SCLK、MOSI、MISO — 3 條 (所有從機並聯共用)。
  • 片選線 (CS):每個從機獨立一條 — 5 條 (5 個從機)。
  • 主機總計:3 + 5 = 8 個 GPIO。
  • 每個從機:SCLK、MOSI、MISO、CS — 4 個引腳。

註:最佳回答稱「主機 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      │
└──────────────┘                └─────────┘      └─────────┘               └─────────┘

GPIO 不足時的擴展方案

方案原理額外引腳支援從機數複雜度
3-to-8 解碼器 (74HC138)3 根 GPIO 控制 8 片選3 (省 2)8低
I/O 擴展芯片 (MCP23S17, SPI; PCF8574, I2C)串列總線擴展 GPIO2 (I2C) / 1 (SPI CS)16/8中
鏈式 SPI (Daisy Chain)從機串聯,單 CS1 CS (共用)多 (資料鏈長)高 (協議修改)
多路複用器 (CD4051/74HC4051)類比開關切換 CS/MISO3 控制 + 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;
}

時序與電氣注意事項

  • CS 設置/保持時間:SCK 首個邊沿前 CS 需拉低 (tSU),末個邊沿後保持 (tH)。
  • 模式 (CPOL/CPHA):主從機必須一致 (Mode 0/1/2/3)。
  • 總線電容:多從機並聯增加 MISO 電容,可能需降低時鐘頻率或加緩衝驅動。
  • 上拉電阻:CS 線建議上拉 (4.7k-10k),防止主機復位時浮空誤選從機。

總結

5 從機 SPI:主機 8 GPIO (3 共享 + 5 CS),每從機 4 引腳。GPIO 緊張時首選 74HC138 解碼器 (3 線控 8 片選),或 I/O 擴展芯片。軟體層面封裝片選管理函數,確保同一時間僅一片選有效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved