SMBus 協議¶
以下是 SMBus 協議的總結。 它適用於該協議的所有版本(1.0、1.1 和 2.0)。 本軟體包不支援的某些協議特性將在本文件末尾簡要描述。
有些介面卡只理解 SMBus (系統管理匯流排) 協議,它是 I2C 協議的子集。幸運的是,許多裝置只使用相同的子集,這使得將它們放在 SMBus 上成為可能。
如果您為某些 I2C 裝置編寫驅動程式,請儘可能嘗試使用 SMBus 命令(如果裝置僅使用 I2C 協議的該子集)。 這使得可以在 SMBus 介面卡和 I2C 介面卡上使用裝置驅動程式(在 I2C 介面卡上,SMBus 命令集會自動轉換為 I2C,但大多數純 SMBus 介面卡根本無法處理普通的 I2C 命令)。
下面是 SMBus 協議操作的列表以及執行它們的函式。 請注意,SMBus 協議規範中使用的名稱通常與這些函式名稱不匹配。 對於傳遞單個數據位元組的某些操作,使用 SMBus 協議操作名稱的函式會執行完全不同的協議操作。
每種事務型別對應一個功能標誌。在呼叫事務函式之前,裝置驅動程式應始終(僅一次)檢查相應的功能標誌,以確保底層 I2C 介面卡支援相關事務。有關詳細資訊,請參見I2C/SMBus 功能。
符號說明¶
S |
起始條件 |
Sr |
重複起始條件,用於從寫入模式切換到讀取模式。 |
P |
停止條件 |
Rd/Wr (1 位) |
讀/寫位。Rd 等於 1,Wr 等於 0。 |
A, NA (1 位) |
確認 (ACK) 和不確認 (NACK) 位 |
Addr (7 位) |
I2C 7 位地址。 請注意,可以擴充套件它以獲得 10 位 I2C 地址。 |
Comm (8 位) |
命令位元組,通常選擇裝置上的暫存器的資料位元組。 |
Data (8 位) |
純資料位元組。 DataLow 和 DataHigh 表示 16 位字的低位元組和高位元組。 |
Count (8 位) |
包含塊操作長度的資料位元組。 |
[..] |
I2C 裝置傳送的資料,與主機介面卡傳送的資料相反。 |
SMBus 快速命令¶
這會在 Rd/Wr 位的位置向裝置傳送一個位
S Addr Rd/Wr [A] P
功能標誌:I2C_FUNC_SMBUS_QUICK
SMBus 接收位元組¶
這從裝置讀取單個位元組,而不指定裝置暫存器。 有些裝置非常簡單,以至於此介面就足夠了。 對於其他裝置,如果要讀取與上一個 SMBus 命令中相同的暫存器,則這是一個簡寫形式
S Addr Rd [A] [Data] NA P
功能標誌:I2C_FUNC_SMBUS_READ_BYTE
SMBus 傳送位元組¶
此操作與“接收位元組”相反:它向裝置傳送單個位元組。 有關更多資訊,請參見“接收位元組”。
S Addr Wr [A] Data [A] P
功能標誌:I2C_FUNC_SMBUS_WRITE_BYTE
SMBus 讀取位元組¶
由 i2c_smbus_read_byte_data() 實現
這從裝置的指定暫存器讀取單個位元組。 暫存器透過 Comm 位元組指定
S Addr Wr [A] Comm [A] Sr Addr Rd [A] [Data] NA P
功能標誌:I2C_FUNC_SMBUS_READ_BYTE_DATA
SMBus 讀取字¶
由 i2c_smbus_read_word_data() 實現
此操作與“讀取位元組”非常相似; 同樣,資料是從裝置的指定暫存器讀取的,該暫存器透過 Comm 位元組指定。 但是這次,資料是一個完整的字(16 位)
S Addr Wr [A] Comm [A] Sr Addr Rd [A] [DataLow] A [DataHigh] NA P
功能標誌:I2C_FUNC_SMBUS_READ_WORD_DATA
請注意,方便函式 i2c_smbus_read_word_swapped() 可用於讀取兩個資料位元組順序相反的情況(不符合 SMBus 標準,但非常流行。)
SMBus 寫入位元組¶
由 i2c_smbus_write_byte_data() 實現
這向裝置的指定暫存器寫入單個位元組。 暫存器透過 Comm 位元組指定。 這與“讀取位元組”操作相反。
S Addr Wr [A] Comm [A] Data [A] P
功能標誌:I2C_FUNC_SMBUS_WRITE_BYTE_DATA
SMBus 寫入字¶
由 i2c_smbus_write_word_data() 實現
這與“讀取字”操作相反。 16 位資料被寫入裝置的指定暫存器,該暫存器透過 Comm 位元組指定
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P
功能標誌:I2C_FUNC_SMBUS_WRITE_WORD_DATA
請注意,方便函式 i2c_smbus_write_word_swapped() 可用於寫入兩個資料位元組順序相反的情況(不符合 SMBus 標準,但非常流行。)
SMBus 程序呼叫¶
此命令選擇一個裝置暫存器(透過 Comm 位元組),向其傳送 16 位資料,並返回讀取 16 位資料
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A]
Sr Addr Rd [A] [DataLow] A [DataHigh] NA P
功能標誌:I2C_FUNC_SMBUS_PROC_CALL
SMBus 塊讀取¶
由 i2c_smbus_read_block_data() 實現
此命令從裝置的指定暫存器讀取最多 32 個位元組的塊,該暫存器透過 Comm 位元組指定。 資料量由裝置在 Count 位元組中指定。
S Addr Wr [A] Comm [A]
Sr Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P
功能標誌:I2C_FUNC_SMBUS_READ_BLOCK_DATA
SMBus 塊寫入¶
由 i2c_smbus_write_block_data() 實現
與“塊讀取”命令相反,這會將最多 32 個位元組寫入裝置的指定暫存器,該暫存器透過 Comm 位元組指定。 資料量在 Count 位元組中指定。
S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P
功能標誌:I2C_FUNC_SMBUS_WRITE_BLOCK_DATA
SMBus 塊寫入 - 塊讀取程序呼叫¶
SMBus 塊寫入 - 塊讀取程序呼叫是在規範的修訂版 2.0 中引入的。
此命令選擇一個裝置暫存器(透過 Comm 位元組),向其傳送 1 到 31 個位元組的資料,並返回讀取 1 到 31 個位元組的資料
S Addr Wr [A] Comm [A] Count [A] Data [A] ...
Sr Addr Rd [A] [Count] A [Data] ... A P
功能標誌:I2C_FUNC_SMBUS_BLOCK_PROC_CALL
SMBus 主機通知¶
此命令從充當主裝置的 SMBus 裝置傳送到充當從裝置的 SMBus 主機。 它與“寫入字”的形式相同,只是命令程式碼替換為警報裝置的地址。
[S] [HostAddr] [Wr] A [DevAddr] A [DataLow] A [DataHigh] A [P]
這在 Linux 核心中以下列方式實現
支援 SMBus 主機通知的 I2C 匯流排驅動程式應報告 I2C_FUNC_SMBUS_HOST_NOTIFY。
I2C 匯流排驅動程式透過呼叫
i2c_handle_smbus_host_notify()觸發 SMBus 主機通知。如果其他人沒有指定另一個主機,則可以觸發 SMBus 主機通知的裝置的 I2C 驅動程式會將 client->irq 分配給主機通知 IRQ。
目前無法從客戶端檢索資料引數。
資料包錯誤校驗 (PEC)¶
資料包錯誤校驗是在規範的修訂版 1.1 中引入的。
PEC 在使用它的傳輸中新增一個 CRC-8 錯誤校驗位元組,緊接在終止 STOP 之前。
地址解析協議 (ARP)¶
地址解析協議是在規範的修訂版 2.0 中引入的。 它是使用上述訊息的更高層協議。
ARP 將裝置列舉和動態地址分配新增到協議。 所有 ARP 通訊都使用從裝置地址 0x61 並需要 PEC 校驗和。
SMBus 警報¶
SMBus 警報是在規範的修訂版 1.0 中引入的。
SMBus 警報協議允許多個 SMBus 從裝置共享 SMBus 主裝置上的單箇中斷引腳,同時仍允許主裝置知道哪個從裝置觸發了中斷。
這在 Linux 核心中以下列方式實現
支援 SMBus 警報的 I2C 匯流排驅動程式應呼叫
i2c_new_smbus_alert_device()以安裝 SMBus 警報支援。可以觸發 SMBus 警報的裝置的 I2C 驅動程式應實現可選的 alert() 回撥。
I2C 塊事務¶
以下 I2C 塊事務與 SMBus 塊讀取和寫入操作類似,只是它們沒有 Count 位元組。 SMBus 層支援它們,並且此處為了完整起見進行了描述,但 SMBus 規範 NOT 定義了它們。
I2C 塊事務不限制傳輸的位元組數,但 SMBus 層限制為 32 個位元組。
I2C 塊讀取¶
由 i2c_smbus_read_i2c_block_data() 實現
此命令從裝置的指定暫存器讀取一個位元組塊,該暫存器透過 Comm 位元組指定
S Addr Wr [A] Comm [A]
Sr Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
功能標誌:I2C_FUNC_SMBUS_READ_I2C_BLOCK
I2C 塊寫入¶
由 i2c_smbus_write_i2c_block_data() 實現
與“塊讀取”命令相反,這會將位元組寫入裝置的指定暫存器,該暫存器透過 Comm 位元組指定。 請注意,支援 0、2 或更多位元組的命令長度,因為它們與資料無法區分。
S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P
功能標誌:I2C_FUNC_SMBUS_WRITE_I2C_BLOCK