I2C 主控(VHDL)

邏輯主頁

程式碼下載

版本 2.2:i2c_master.vhd (14.1 KB)
修正了傳輸結束時的 SDA 小故障(在版本 2.1 中引入)

版本 2.1:i2c_master_v2_1.vhd (14.0 KB)
用時脈致能功能取代了閘控時脈
調整了啟動和停止條件下 SCL 的時序

版本 2.0:i2c_master_v2_0.vhd (13.5 KB)
增加了在同一次傳輸中與不同從屬介接的功能
修正了 ack_error 錯誤,該錯誤導致 ack_error 在發生錯誤時變為「Z」而不是「1」
修正了 ack_error 訊號清除的時序

版本 1.0:i2c_master_v1_0.vhd (12.9 KB)
首次公開發布

特點

  • 內部積體電路 (I2C 或 IIC) 主控組件的 VHDL 原始碼
  • 符合 NXP UM10204 I2C 匯流排規格(針對單主匯流排)
  • 使用者可定義系統時脈
  • 使用者可定義 I2C 序列時脈頻率
  • 產生啟動、停止、重複啟動和確認條件
  • 使用 7-bit 從屬尋址
  • 相容從屬的時脈延長
  • 不建議用於多主控匯流排(無仲裁或同步)
  • 將從屬確認錯誤通知使用者邏輯

介紹

本文詳細介紹了一個用於單一主控匯流排的 I2C 主控元件,該元件採用 VHDL 編寫,適用於 CPLD 和 FPGA。此元件透過平行介面讀取和寫入用戶邏輯。它是使用 Quartus II 11.1 版本設計的。資源需求取決於具體實現。圖 1 展示了一個整合到系統中的 I2C 主控的典型範例。此處提供了一個結合該 I2C 主控來建立 SPI 轉 I2C 橋接器的設計。

圖 1. 範例實現

背景

I2C 匯流排是由 NXP 發明並指定的雙線半雙工資料鏈路。I2C 匯流排的兩條線,SDA 和 SCL,是雙向的,並且是開汲極,由電阻上拉。SCL 是串列時脈線,SDA 是串列資料線。匯流排上的裝置將一條線拉至地以發送邏輯「 0」,將另一條線釋放(使其懸空)以發送邏輯 「1」。

有關更多資料,請參閱下方「附加資料」部分中附帶的 I2C 規範。該規範詳細解釋了協議、電氣規格、上拉電阻的大小等。

工作原理

I2C 主控使用圖 2 所示的狀態機來實現 I2C 匯流排協定。啟動後,組件立即進入 ready 狀態。它會一直等待,直到 ena 訊號閂鎖一個指令。start 狀態會在 I2C 匯流排上產生啟動條件,command 狀態會將位址和 rw 指令傳送到匯流排。然後,slv_ack1 狀態會擷取並驗證從裝置的確認。根據 rw 指令,元件會繼續寫入資料到從屬(wr 狀態)或由從屬接收資料(rd 狀態)。完成後,如果正在寫入,主控會擷取並驗證從屬的回應(slv_ack2 狀態);如果正在讀取,主控會發出自己的回應(mstr_ack 狀態)。如果 ena 訊號閂鎖了另一個指令,主控會立即繼續執行另一個寫入操作(wr 狀態),如果該指令與前一個指令相同,主控會立即繼續執行讀取操作(rd 狀態)。如果與上一個命令不同(例如,寫入後執行讀取操作,或讀取後執行寫入操作,或新的從屬位址),則主控將根據 I2C 規範發出重複啟動訊號( start 狀態)。一旦主機完成讀取或寫入操作,且 ena 訊號未閂鎖新命令,主控將產生停止條件( stop 狀態)並返回 ready 狀態。

圖 2. I2C 主控狀態機

狀態機的時序由通用參數 input_clkbus_clk 衍生,詳情請參閱下文「設定串列時脈速度」部分。計數器產生運轉狀態機的資料時脈以及 scl 本身。

連接埠描述

表 1 描述了 I2C 主控的連接埠。

表 1. 連接埠描述

設定串列時脈速度

元件透過 ENTITY 中宣告的兩個 GENERIC 參數 input_clkbus_clk 來取得串列時脈 sclinput_clk 參數必須設定為輸入系統時脈 clk 的頻率(單位為 Hz)。範例程式碼中的預設設定為 50MHz(元件模擬和測試時的頻率)。bus_clk 參數必須設定為所需的串列時脈 scl 頻率。範例程式碼中的預設設定為 400kHz,對應於 I2C 規格中的快速模式位元率。

傳輸

busy 輸出埠上的低邏輯電平表示元件已準備好接受指令。要啟動傳輸,使用者邏輯需要將所需的從屬位址、rw 指令和寫入資料分別放置在 addrrwdata_wr 連接埠上,並置位 ena 訊號。此指令不會在下一個系統時鐘 clk 上進行計時。相反,組件已經在內部產生 I2C 時序,並根據該時序進行計時。因此,使用者邏輯應等待 busy 訊號置位,以識別這些輸入何時被閂鎖到 I2C 主控中。

然後,I2C 主控執行該指令。完成後,它會被設為 busy 訊號,以指示 data_rd 連接埠上有任何可用的讀取數據,並在 ack_error 連接埠上標記任何錯誤。

在一個傳輸期間可以執行多個讀取和寫入操作(以及它們的任意組合)。如果在目前指令完成時置位 ena 訊號,I2C 主控會閂鎖 addrrwdata_wr 的新值,並立即執行新指令。busy 訊號仍會置位一個 scl 週期,以指示 data_rd 連接埠上有任何可用的讀取數據,然後再次置位,以指示新命令已閂鎖並正在執行。

傳輸範例

圖 3 顯示了典型傳輸的時序圖。使用者邏輯提供位址「1010101」,rw 指令「0」(表示寫入)以及寫入資料「10011001」。它置位 ena 訊號以閂鎖這些值。一旦 busy 訊號置位,使用者邏輯就會發出新的指令。位址仍為「1010101」,但接下來的指令為讀取指令(rw =「1」)。ena 訊號保持置位。當 I2C 主控完成第一個命令後,它會置位 busy 訊號以指示該命令完成。由於 ena 訊號已置位,I2C 主控會閂鎖新指令並重新置位 busy 訊號。一旦 busy 訊號重新置位,使用者邏輯就會識別出第二個指令正在執行,並置位 ena 訊號以結束該指令之後的傳輸。I2C 主控完成讀取命令的執行,將讀取的資料(「11001100」)輸出到 data_rd 連接埠,並再次取消 busy 訊號。

圖 3. 典型傳輸時序圖

若要使用新指令繼續傳輸,ena 訊號和新輸入必須不遲於目前指令的最後一個資料位元出現。因此,建議在 busy 訊號指示目前指令已閂鎖後立即發出新指令。ena 訊號可以保持有效,直到傳輸的最後一個指令閂鎖完畢。

用於控制 I2C 主控的使用者邏輯範例

以下一段使用者邏輯程式碼示範了一種管理包含多個讀寫操作的傳輸的簡單技巧。此範例實作會計數 busy 訊號轉換次數,以便在適當的時間向 I2C 主控發出指令。狀態「get_data」執行所有必要的操作,以便在單一傳輸中透過 I2C 匯流排發送一次寫入、一次讀取、第二次寫入和第二次讀取,就像從從屬的多個暫存器中檢索資料一樣。

example_code.txt (2.3 KB)

確認錯誤

每次傳送位元組後,I2C 匯流排的接收端必須發出確認或不確認訊號。如果 I2C 主控收到從屬的錯誤回應,它會透過在 ack_error 連接埠上標記錯誤來通知使用者邏輯。I2C 主控不會自動嘗試重新發送訊息,因此使用者邏輯必須決定是否重新發送命令和/或採取任何其他措施。下一個傳輸開始時,ack_error 連接埠將被清除。

時脈延長

I2C 規格第 3.1.9 節定義了一個選用功能,即從屬可以將 scl 保持為低電平,從而暫停傳輸。某些從屬設計為在繼續操作之前需要更多時間儲存接收到的資料時才執行此操作。此 I2C 主控組件與此功能的從屬相容。它不需要控制 I2C 主控的使用者邏輯進行任何操作。

重置

reset_n 輸入連接埠必須為邏輯高電平,I2C 主控元件才能運作。此連接埠上的邏輯低電平會非同步重置元件。重置期間,組件將 busy 連接埠保持高電平,以指示 I2C 主控組件不可用。sclsda 連接埠將假定呈現高阻抗狀態,data_rdack_error 輸出埠將清除。重置結束後,當 I2C 主控組件準備好再次通訊時,busy 連接埠將置低。

結論

此 I2C 主控是可編程邏輯元件,可透過簡單的平行介面與 I2C 從屬進行通訊。它符合 NXP I2C 單主控匯流排規範,並包含可選的時脈延長功能。

附加資料

UM10204, I2C-bus specification and user manual, NXP (1.3 MB)

相關主題

SPI 轉 I2C 橋接器 (VHDL) – 此該設計使用上面描述的 I2C 主控來實現 SPI 轉 I2C 橋接器。

溫度感測器 TCN75A Pmod 控制器(VHDL)– 此設計使用上面描述的 I2C 主控來配置和收集來自 Microchip TCN75A 溫度感測器的數據。

溫度感測器 ADT7420 Pmod 控制器(VHDL)– 此設計使用上面描述的 I2C 主控來配置和收集來自 ADI ADT7420 溫度感測器的數據。

電容式感測 AD7156 Pmod 控制器 (VHDL) – 此設計使用上面描述的 I2C 主控來配置和收集來自 ADI AD7156 電容數位轉換器的數據。

色彩感測器 Pmod 控制器 (VHDL) – 此設計使用上面描述的 I2C 主控來配置和收集來自 AMS TCS3472 彩色光數位轉換器的數據。

羅盤 Pmod 控制器 (VHDL) – 此設計使用上面描述的 I2C 主控來配置和收集來自 Memsic MMC34160PJ 磁力儀的數據。

ADC AD7991 Pmod Controller (VHDL) – 此設計使用上述 I2C 主設備從 ADI AD7991 4 通道、12-bit類比數位轉換器收集資料。

濕度和溫度感測器 Pmod 控制器 (VHDL) – 此設計使用上述 I2C 主控來配置和檢索 TI HDC1080 濕度計的溫度和濕度數據。

即時時脈 MCP79410 Pmod 控制器(VHDL)– 此設計使用上述 I2C 主控來控制 Microchip MCP79410 即時時脈/日曆。