今天了解了一下SPI總線:
1.SPI內部結構
??🔌 SPI 四大核心引腳功能詳解??
1. ??MOSI
(Master Output Slave Input)??
- ??功能??:??主機輸出數據線??
- ??工作流程??:
- 主機內部發送數據寄存器 (
TxDR
) 的數據 → 移位寄存器 → ??數據控制單元?? → 通過MOSI引腳輸出至從機。
- 主機內部發送數據寄存器 (
- ??關鍵控制??:
- 數據控制單元受 ??“順序”?? 設置(MSB/LSB優先)和 ??“極性/相位”?? 配置(時鐘邊沿采樣)影響。
- ??用戶代碼關聯??:
// 用戶代碼中MOSI配置(PB5) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_5; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP; // 復用推挽輸出
2. ??MISO
(Master Input Slave Output)??
- ??功能??:??主機輸入數據線??
- ??工作流程??:
- 從機返回的數據 → 通過MISO引腳 → ??接收數據寄存器 (
RxDR
)??。
- 從機返回的數據 → 通過MISO引腳 → ??接收數據寄存器 (
- ??狀態監測??:
- ??
RxNE
(Receive Not Empty)?? 標志:當RxDR
收到新數據時置1,觸發中斷或供CPU讀取。
- ??
- ??用戶代碼關聯??:
// 用戶代碼中MISO配置(PB4) GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; // 輸入上拉
3. ??SCK
(Serial Clock)??
- ??功能??:??主機輸出的同步時鐘??
- ??控制單元??:
- ??時鐘控制模塊?? 生成SCK信號,受以下參數控制:
- ??波特率??:時鐘頻率(由PCLK分頻)。
- ??極性 (CPOL)??:
CPOL=0
:空閑時SCK為低電平CPOL=1
:空閑時SCK為高電平
- ??相位 (CPHA)??:
CPHA=0
:數據在時鐘??第一個邊沿??采樣CPHA=1
:數據在時鐘??第二個邊沿??采樣
- ??時鐘控制模塊?? 生成SCK信號,受以下參數控制:
- ??用戶代碼關聯??:
SPI_InitStruct.SPI_CPOL = SPI_CPOL_Low; // CPOL=0 SPI_InitStruct.SPI_CPHA = SPI_CPHA_1Edge; // CPHA=0
4. ??NSS
(Slave Select)?
?
- ??功能??:??從機片選信號??(低電平有效)
- ??工作模式??:
- ??硬件模式??:
- 由SPI控制器自動控制(圖示中 ??“內部NSS”??)。
- ??軟件模式??:
- 用戶通過GPIO手動控制(圖示中 ??“軟/硬NSS”?? 選擇)。
- ??硬件模式??:
- ??關鍵場景??:
- 傳輸開始前:拉低NSS選中從機。
- 傳輸結束后:拉高NSS釋放從機。
- ??用戶代碼關聯??:
// 用戶代碼中使用PA0模擬NSS(軟件控制) GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET); // 選中從機(W25Q64) SPI_Cmd(SPI1, ENABLE); // 啟動SPI傳輸
?? ??輔助功能模塊關聯引腳??
??中斷系統??:
- ??
TxE
(Transmit Empty)??:發送寄存器空 → 可寫入新數據。 - ??
RxNE
(Receive Not Empty)??:接收寄存器非空 → 可讀取數據。 - ??
OVR
(Overrun)??:數據覆蓋錯誤 → 需清除標志。
// 用戶代碼中輪詢標志位 while(SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET); // 等待TxE
- ??
??通信方向選擇??:
- 支持多模式(圖中紅框區域):
- ??2線全雙工??:同時使用MOSI和MISO(標準SPI)。
- ??2線只收??:僅用MISO(從機到主機)。
- ??單線模式??:半雙工通信(共用單數據線)。
SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
- 支持多模式(圖中紅框區域):
??主從控制??:
- ??主/從模式??:決定SCK由誰生成(主機:SCK輸出;從機:SCK輸入)。
SPI_InitStruct.SPI_Mode = SPI_Mode_Master; // 主機模式
📝 ??引腳功能總結表??
??引腳?? | ??方向?? | ??核心功能?? | ??關鍵關聯模塊?? |
---|---|---|---|
??MOSI?? | 主機→從機 | 主機輸出數據 | 發送數據寄存器 → 數據控制單元 |
??MISO?? | 從機→主機 | 主機輸入數據 | 接收數據寄存器 → RxNE中斷 |
??SCK?? | 主機→從機 | 提供同步時鐘 | 時鐘控制(CPOL/CPHA) |
??NSS?? | 主機→從機 | 從機選擇控制(低有效) | 軟/硬NSS選擇 → 內部控制邏輯 |
💡 深入理解引腳配置
此處用的PA15上電后默認功能不是普通IO,所以可以改用其它IO口,或重映射。
2.SPI總線電路結構
3.SPI總線通信流程
3.1收發流程
數據傳輸順序有兩種:
3.2時鐘模式
極性與相位:
當SCK開始與結束的電平為低時,極性為低;當SCK開始與結束的電平為高時,極性為高
- 相位=第1邊沿采集(CPHA=0):數據在SCK的第一個邊沿(即CPOL變化的第一個邊沿)被采樣。
- 相位=第2邊沿采集(CPHA=1):數據在SCK的第二個邊沿(即CPOL變化的第二個邊沿)被采樣。