2018年10月24日 星期三

DIY - ESP32:ESP32 SPI 驅動 IO 介紹(十五)

DIY - ESP32:ESP32 SPI 驅動 IO 介紹(十五):

ESP32 SOC 基本上有內置 4個 SPI(Serial Peripheral Interface)接口,包括 SPI0(Serial Peripheral Interface 0)、SPI1(Serial Peripheral Interface 1)、HSPI( High-speed Serial Peripheral Interface)和 VSPI(Very High-speed Serial Peripheral Interface)接口,SPI0 是已用於 Flash Memory 緩存,SPI1 用於寫入 Flash 晶片,ESP32 將連接的 SPI Flash 設備映射到記憶體, SPI0 和 SPI1 使用相同的硬體線,HSPI 和 VSPI 可以自由使用。

ESP32 SOC 內部功能框圖
ESP32 的 SPI 總線,與連接到一個主機的所有 SPI 設備共用。SPI 總線由 MISO、MOSI、SCLK 和可選的 Quadwp 和 Quadhd 信號組成。SPI 從設備並聯連接到這些信號。
  • MISO: 也稱為 q,這是將串行流輸入到 ESP32 中。
  • MOSI:也稱為 d,這是來自 ESP32 的串行流的輸出。
  • SCLK: 時鐘信號。 每個數據位在該信號的正或負邊沿輸出或輸出。
  • Quadwp :防寫信號,僅用於 4 位元(qio/qout)事務。
  • Quadhd:保持信號,僅用於 4 位元(qio/qout)事務。
  • CS:每個 SPI 從設備都有自己的片選(CS)線,當發生到/從 SPI 從設備的傳輸時,該線被啟動。一個 CS 活動的實例,來自和/或發生的設備的資料傳輸,以及 CS 再次變為非活動狀態。事務是原子的,因為它們永遠不會被另一個事務中斷。

ESP32 SPI 控制器的 IO 接口:
Pin Name
HSPI (GPIO Number)
VSPI (GPIO Number)
MISO
12
19
MOSI
13
23
SCLK
14
18
CS0*
15
5
QUADWP
2
22
QUADHD
4
21

SPI 設備連接
SPI 通訊階段處理:SPI 總線上的通訊處理由五個階段組成,其中任何階段都可以跳過:
  • 命令階段(Command): 在此階段,命令(0-16位)被輸出。
  • 地址階段(Address): 在此階段,地址(0-64位)被輸出。
  • 寫階段:主設備將數據發送到從設備。
  • 虛擬階段: 該階段是可配置的,用於滿足時序要求。
  • 閱讀階段: 從站將數據發送給主站。

SPI 命令和位址階段:
在命令和位址階段,spi_transaction_t 結構中的 cmd 和 addr 欄位將發送到匯流排,而不會同時讀取任何內容, 命令和位址階段的缺省長度在 spi_device_interface_config_t 和 spi_bus_add_device 中設置。 當 spi_transaction_t 中未設置標誌 SPI_TRANS_VARIABLE_CMD 和 SPI_TRANS_VARIABLE_ADDR 時,驅動程式會自動將這些階段的長度設置為分別初始化設備時設置的預設值。

如果命令和位元址階段的長度需要變數,則聲明一個 spi_transaction_ext_t 描述符,在基數成員的標誌中設置標誌 SPI_TRANS_VARIABLE_CMD 或/和 SPI_TRANS_VARIABLE_ADDR,並像往常一樣配置 base 的其餘部分。 然後每個階段的長度將是 spi_transaction_ext_t 中設置的 command_bits 和 address_bits。

命令(Command)和地址(Address)階段是可選的,因為不是每個 SPI 設備都需要發送命令和或位址。這反映在設備配置中,當 command_bits 或 address_bits 欄位設置為零時,不執行命令或位址階段。

SPI 讀寫階段:
並非每個事務都需要寫入數據以及要讀取的數據。 當 rx_buffer 為 NULL(並且未設置 SPI_USE_RXDATA)時,將跳過讀取階段。 當 tx_buffer 為 NULL(並且未設置 SPI_USE_TXDATA)時,將跳過寫入階段。

SPI 寫入單指令和 2-Byte 數據的時序
SPI 讀入 2-Byte 數據的時序
全雙工/半雙工模式:
在全雙工模式(Full Duplex Mode)下,讀寫階段被組合,SPI 主機同時讀寫數據。 總長度由決定 command_bits + address_bits + trans_conf.length,而 trans_conf.rx_length 只確定接收到緩衝區的數據長度。

在半雙工模式(Half Duplex Mode)下,主機(Host)具有獨立的寫和讀階段。 寫入階段和讀取階段的長度分別由 trans_conf.length 和 trans_conf.rx_length 決定。

參考網址:https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/spi_master.html

沒有留言:

張貼留言