SPI 主控(VHDL)

邏輯主頁

程式碼下載

版本 1.2:spi_master.vhd (8.9 KB)
當匯流排閒置時,SCLK 立即採用 CPOL 輸入的值

版本 1.1:spi_master_v1_1.vhd (8.8 KB)
修正了 ModelSim 模擬錯誤(明確重置 clk_toggles 訊號)

版本 1.0:spi_master_v1_0.vhd (17.0 KB)
首次公開發布

特點

  • 串列週邊介面(SPI)主控元件的 VHDL 原始碼
  • 可配置的從屬數量
  • 可配置的資料寬度
  • 可選的極性和相位
  • 可選的速度
  • 適用於長資料流的連續模式

介紹

本文詳細介紹了一個用於 CPLD 和 FPGA 的 SPI 主控元件,該元件採用 VHDL 語言編寫。此元件使用 Quartus II 9.0 版本設計。資源需求取決於具體實現(即所需的從屬數量和資料寬度)。圖 1 展示了一個整合到系統中的 SPI 主控的典型範例。

圖 1. 範例應用

背景

SPI 通訊方案是一種全雙工資料鏈路,使用四線。主控透過拉低從屬選擇(SS)線來發起傳輸。由主機驅動的串列時脈 (SCLK) 線提供同步時脈來源。主控透過主控輸出、從屬輸入(MOSI)線發送數據,並透過主控輸入、從屬輸出(MISO)線接收數據。

主控可以透過多種技術與多個從屬通訊。在最常見的配置中,每個從屬都有獨立的 SS 線,但與其他從屬共享 SCLK、MISO 和 MOSI 線。當 SS 線未拉低時,每個從屬都會忽略共用線路。此拓樸如上圖 1 所示。

SPI 有四種工作模式,基於兩個參數:時脈極性 (CPOL)和時脈相位(CPHA)。主控和從屬必須使用相同的模式才能清楚地通訊。如果 CPOL 為零,則 SCLK 通常為低電平,第一個時脈沿為上升沿。如果 CPOL 為 1,則 SCLK 通常為高電平,第一個時脈沿為下降沿。 CPHA 定義資料對齊。如果 CPHA 為零,則第一個資料位元在 SS 下降沿寫入,並在第一個 SCLK 沿讀取。如果 CPHA 為 1,則資料在第一個 SCLK 沿寫入,並在第二個 SCLK 沿讀取。圖 2 中的時序圖描述了四種 SPI 模式。

圖 2. SPI 時序圖

連接埠描述

表 1 描述了 SPI 主控的連接埠。從屬的數量由 GENERIC 參數 slaves 在 ENTITY 中聲明,發送和接收資料匯流排寬度由 GENERIC 參數 d_width 聲明。

表 1. 連接埠描述

時脈

clockclk_div 輸入定義 SCLK 的頻率(即 SPI 資料速率)。clock 是用來操作元件內部同步邏輯的系統時脈。clk_div 整數輸入允許使用者設定目前傳輸發生的相對速度。clk_div 是 SCLK 轉換之間的時脈週期數,如公式 1 所示。

clk_div 連接埠設定為 1 時,SCLK 頻率為 clock 頻率的一半,並設定為可實現的最大資料速率。enable 引腳將 clk_div 的值閂鎖到元件中以啟動每個傳輸,因此可以調整各個從裝置的資料速率。

clk_div 連接埠設定為恆定值可永久設定資料速率。如果 clk_div 設定為 0,則元件預設值為 1。因此,將 clk_div 連接埠設定為低電平可使元件始終以最大速度運作。

極性和相位

enable 引腳在每次傳輸開始時閂鎖 cpolcpha 的標準邏輯值。這允許使用獨立的 SPI 模式與各個從屬進行通訊。如果所有從屬都需要相同的模式,則只需將 cpolcpha 綁定到相應的邏輯電平即可。

傳輸

busy 輸出埠上的低邏輯電平表示元件已準備好接受指令。元件在 enable 輸入被宣告的第一個時脈上升沿閂鎖傳輸的設定、位址和資料。在接下來的 clock 上,元件宣告 busy 訊號並開始執行傳輸。完成後,元件會在 rx_data 連接埠輸出接收到的資料。該資料將保留在連接埠上,直到元件從後續傳輸接收到新資料。元件將 busy 設定為低電位以通知使用者資料可用,並且元件立即準備好執行另一條指令。

圖 3 顯示了典型傳輸的時序圖。此 SPI 主控實例化了四個從屬,資料寬度為 4-bit。它將資料「1001」傳輸到工作在 SPI 模式 3(CPOL = 1,CPHA = 1)的從裝置 2。主控接收資料「1010」。

圖 3. 典型事務時序圖

連續模式

在最後一個接收位元期間,SPI 主控讀取 cont 標示。如果該標示為低,則組件以上述方式完成通訊。如果該標示為高,則元件閂鎖 tx_data 連接埠上的數據,並在目前資料用盡後無縫地繼續傳輸新資料。當目前資料的最後一位完成傳輸時(即新資料的第一位出現在 mosi 連接埠上),元件會在 rx_data 連接埠上輸出第一個接收資料區塊,並將 busy 訊號解除宣告一個時脈週期,以指示該接收資料可用。接收資料將保留在 rx_data 連接埠上,直到新資料通訊完成並且元件呈現後續的接收資料區塊。

圖 4 描繪了使用連續模式的傳輸時序圖。此 SPI 主控實例化了四個從屬,資料寬度為兩位。元件閂鎖初始資料「10」後,cont 連接埠保持高電平,tx_data 連接埠呈現新資料「01」。元件閂鎖新資料後,將 busy 連接埠設為低電平,這表示 conttx_data 連接埠可以清零,並且第一個接收資料「01」已出現在 rx_data 連接埠上。傳輸完成後,busy 訊號再次解除宣告,新的 rx_data「10」可用。

圖 4. 連續模式下的傳輸時序圖

連續模式可以透過永久執行來處理非常長的資料流。將 cont 連接埠設定為低電平將停用連續模式。

重置

reset_n 輸入連接埠必須為邏輯高電平,SPI 主控元件才能運作。此連接埠上的低電平訊號會非同步重置組件。重置期間,組件將 busy 連接埠和所有 ss_n 輸出保持為高電位。mosi 輸出呈現高阻抗態,rx_data 輸出埠清零。重置解除後,busy 連接埠會在下一個時脈週期解除宣告,指示 SPI 主控元件已準備好進行通訊。

總結

此 SPI 主控是一個靈活的可編程邏輯元件,可透過單一平行介面與多個從屬進行通訊。它允許與使用者指定數量的從屬進行通訊,這些從屬可能需要獨立的 SPI 模式、資料寬度和串行時脈速度。

相關主題

SPI 從屬(VHDL)

SPI 3 線主控(VHDL)

SPI 轉 I2C 橋接器 (VHDL)

加速計 ADXL345 Pmod 控制器(VHDL)- 本設計使用本頁所述的 SPI 主控組件與 ADI 的 ADXL345 加速度計進行通訊。本設計也示範如何使用此 SPI 主控的連續模式功能。

加速計 ADXL362 Pmod 控制器(VHDL)- 本設計使用本頁所述的 SPI 主控元件與 ADI 的 ADXL362 加速度計進行通訊。本設計也示範如何使用此 SPI 主控的連續模式功能。

環境光感測器 Pmod 控制器 (VHDL) - 本設計使用本頁描述的 SPI 主控元件與 TI 的 ADC081S021 類比數位轉換器通訊,以從 Vishay Semiconductor 的 TEMT6000X01 環境光感測器收集數據。

ADC AD7476A Pmod 控制器 (VHDL) - 本設計使用了此 SPI 主控元件的一個版本,該版本已修改,包含第二條 MISO 數據線。透過兩條資料輸入線,設計可同時與兩個獨立的 ADI AD7476A 12-bit ADC 進行通訊(接收資料)。

DAC AD5541A Pmod 控制器 (VHDL) - 本設計使用上述 SPI 主控與 ADI 的 AD5541A 單通道 16-bit 數類比轉換器進行通訊。

DAC AD5628 Pmod 控制器(VHDL)- 本設計使用上述 SPI 主設備與 ADI AD5628 12-bit 數類比轉換器進行通訊。它配置轉換器並發送命令、位址和資料來控制轉換器的 8 個通道。

DAC AD7303 Pmod 控制器(VHDL)- 本設計使用了此 SPI 主控元件的一個版本,該版本已修改,包含第二條 MOSI 資料線。此設計可同時控制兩個獨立的 ADI AD7303 雙通道 8-bit DAC。

DAC DAC121S101 Pmod 控制器 (VHDL) - 本設計使用了此 SPI 主控元件的一個版本,該版本已修改,包含第二條 MOSI 資料線。透過這兩條資料輸出線,此設計可同時將資料傳送至兩個獨立的 TI DAC121S101 12-bit 數位類比轉換器。

數位電位器 AD5160 Pmod 控制器(VHDL)- 此設計使用上述 SPI 主控來控制 ADI AD5160 數位電位器。

陀螺儀 L3G4200D Pmod 控制器 (VHDL) - 本設計使用上述 SPI 主控來設定和擷取 STM L3G4200D 陀螺儀的資訊。此外,本設計也示範如何使用此 SPI 主控的連續模式功能。

搖桿 JSTK2 Pmod 控制器 (VHDL) - 本設計使用上述 SPI 主控從嵌入在搖桿模組中的 PIC16F1618 微控制器發送命令並檢索資料。

NAV Pmod 控制器 (VHDL) - 此導航設計使用上述 SPI 主控從 STM LPS25HB 壓力感測器和 LSM9DS1 iNEMO 慣性模組(3 軸加速度計、陀螺儀和磁力計)檢索數據,總共提供 10 個自由度。

熱電偶 Pmod 控制器(VHDL)- 設計使用上述 SPI 主控從 ADI(Maxim) MAX31855 熱電偶數位轉換器檢索資訊。