SPI(Serial Peripheral Interface) 接口根據時鐘極性(CPOL)和時鐘相位(CPHA)的不同組合,共有 4種工作模式。這些模式決定了數據采樣和傳輸的時序關系,是SPI通信中必須正確配置的關鍵參數。以下是詳細解析:
1. SPI的4種工作模式
SPI模式由兩個參數定義:
- CPOL(Clock Polarity):時鐘空閑時的電平狀態。
CPOL=0
:空閑時為低電平。CPOL=1
:空閑時為高電平。
- CPHA(Clock Phase):數據采樣的時鐘邊沿。
CPHA=0
:在時鐘的第一個邊沿(上升沿或下降沿)采樣數據。CPHA=1
:在時鐘的第二個邊沿采樣數據。
組合后形成4種模式:
模式 | CPOL | CPHA | 空閑時鐘 | 數據采樣邊沿 | 數據切換邊沿 |
---|---|---|---|---|---|
Mode 0 | 0 | 0 | 低電平 | 第一個上升沿(SCK從低→高) | 下降沿(SCK從高→低) |
Mode 1 | 0 | 1 | 低電平 | 第一個下降沿(SCK從高→低) | 上升沿(SCK從低→高) |
Mode 2 | 1 | 0 | 高電平 | 第一個下降沿(SCK從高→低) | 上升沿(SCK從低→高) |
Mode 3 | 1 | 1 | 高電平 | 第一個上升沿(SCK從低→高) | 下降沿(SCK從高→低) |
2. 模式對比與波形示例
Mode 0(最常用)
- 波形特點:
- 空閑時SCK為低電平。
- 數據在SCK上升沿被采樣,下降沿切換。
- 典型應用:多數傳感器(如BME280)、FLASH芯片(如W25Q64)。
Mode 1
- 波形特點:
- 空閑時SCK為低電平。
- 數據在SCK下降沿被采樣,上升沿切換。
- 典型應用:部分ADC芯片(如MCP3008)。
Mode 2
- 波形特點:
- 空閑時SCK為高電平。
- 數據在SCK下降沿被采樣,上升沿切換。
- 典型應用:較少見,某些特定射頻模塊。
Mode 3
- 波形特點:
- 空閑時SCK為高電平。
- 數據在SCK上升沿被采樣,下降沿切換。
- 典型應用:部分EEPROM(如AT25系列)。
3. 如何選擇SPI模式?
- 查閱器件手冊:從設備的SPI模式是固定的,必須與主設備匹配。
- 例如:BMP280傳感器默認Mode 0,而ADXL345支持Mode 0和Mode 3。
- 觀察時序圖:
- 確認數據采樣邊沿與時鐘極性/相位的對應關系。
- 實驗調試:
- 若通信失敗,可嘗試切換模式(常見錯誤:Mode 0與Mode 3混淆)。
4. SPI的其他關鍵配置
除了模式,還需配置以下參數:
- 時鐘頻率(SCK):從設備支持的最大頻率(如10 MHz)。
- 數據位順序(MSB/LSB First):通常MSB優先。
- 片選信號(CS):高電平有效或低電平有效。
5. 代碼示例(STM32配置SPI Mode 0)
// STM32 HAL庫配置SPI Mode 0
SPI_HandleTypeDef hspi;
hspi.Instance = SPI1;
hspi.Init.Mode = SPI_MODE_MASTER;
hspi.Init.Direction = SPI_DIRECTION_2LINES;
hspi.Init.DataSize = SPI_DATASIZE_8BIT;
hspi.Init.CLKPolarity = SPI_POLARITY_LOW; // CPOL=0
hspi.Init.CLKPhase = SPI_PHASE_1EDGE; // CPHA=0
hspi.Init.NSS = SPI_NSS_SOFT;
hspi.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32;
HAL_SPI_Init(&hspi);
6. 常見問題
- 模式不匹配:主從設備模式不一致導致數據讀取錯誤。
- 時鐘頻率過高:從設備無法響應,表現為數據丟失。
- 片選信號未控制:未拉低CS導致通信無響應。
總結
SPI的4種模式通過CPOL和CPHA組合定義,需嚴格匹配從設備要求。Mode 0和Mode 3最為常見,Mode 1和Mode 2多用于特定器件。配置時務必結合時序圖和手冊驗證!