SMBus 协议详解

目录

  • 往期内容
  • 资料
  • 1. 介绍
    • 1.1 SMBus 与 I2C 协议的差别
    • 1.2 SMBus 应用
  • 2. 协议内容
    • 2.1 符号
    • 2.2 操作标志和函数
  • 专栏


往期内容

  1. IIC框架和协议详解

资料

I2C 资料 (yuque.com):
SMBus 协议详解_第1张图片

1. 介绍

SMBus(系统管理总线)是基于 I2C 协议的一个子集,用于在设备之间提供更严格的电源和系统管理通信标准。它的初衷是用于电池和电源管理相关的设备,如智能电池或充电控制器。尽管 SMBus 和 I2C 协议有相似之处,但它们在几个关键方面有所不同。

1.1 SMBus 与 I2C 协议的差别

  1. 电压范围(VDD)
    • I2C 协议:支持的电压范围非常广,甚至可以讨论高达 12V 的情况。
    • SMBus 协议:规定 VDD 范围较窄,通常在 1.8V 至 5V 之间,主要适用于低功耗设备。
  2. 最小时钟频率与 Clock Stretching
    • Clock Stretching:在 I2C 中,当设备需要更多的处理时间时,它可以将时钟线 SCL 拉低,暂时占用总线,以便完成内部处理。这叫做 Clock Stretching
      • I2C 协议:对时钟频率没有最低限制,Clock Stretching 的持续时间也没有限制。
      • SMBus 协议:规定时钟频率的最小值为 10KHz,而且对 Clock Stretching 的持续时间有严格限制,保证通信的时效性。
  3. 设备地址回应
    • I2C 协议:设备收到自己的地址后,没有强制要求必须发送回应信号(ACK)。
    • SMBus 协议:强制设备在接收到地址后必须发出回应信号。如果设备没有响应,可以用此来判断设备的状态,例如忙碌、故障,或已被移除。
  4. 数据传输格式
    • I2C 协议:仅定义如何传输数据,但没有规定数据的具体格式,数据的格式由设备决定。
    • SMBus 协议:规定了几种标准化的数据传输格式,确保设备之间的数据传输符合一致性要求。
  5. REPEATED START Condition(重复启动条件)
    • 在读取设备(如 EEPROM)时,通常需要先发送存储地址,再读取数据。在标准 I2C 中,这可以通过发送 STOP § 信号终止第一次操作,然后发送 START (S) 信号开始第二次操作。
    • SMBus 协议:允许发送 REPEATED START (S),在写和读之间跳过 STOP 信号,直接发出新的 START 信号,简化操作。
  6. 低功耗版本
    • SMBus Low Power Version:除了标准版本的 SMBus 协议,SMBus 还提供了一个低功耗版本,适用于对功耗要求非常敏感的系统。

1.2 SMBus 应用

SMBus 协议的严格性和标准化使其特别适合于系统管理任务,特别是在低功耗设备、智能电池、充电控制器等电源相关设备的通信中使用。通过定义更严格的时钟频率、地址回应、数据格式等,它能确保设备通信的可靠性和一致性,同时减少额外的控制线使用,从而提高系统集成度。

2. 协议内容

2.1 符号

在 I2C 和 SMBus 通信中,以下符号 (Symbols) 描述了数据传输的结构和流程:

  1. S (Start bit):
    • 定义: 开始位,表示传输的开始。
    • 描述: 当 SDA 线从高电平跳变到低电平,同时 SCL 保持高电平时,传输开始。
  2. Sr (Repeated Start bit):
    • 定义: 重复的开始位,用于在连续传输多个消息时不终止传输的情况下开始新的消息。
    • 描述: 用于不终止通信过程而继续传输数据的情况,重复发出一个 Start 信号。
  3. P (Stop bit):
    • 定义: 停止位,表示传输的结束。
    • 描述: 当 SDA 线从低电平跳变到高电平,同时 SCL 保持高电平时,传输结束。
  4. R/W# (Read/Write bit):
    • 定义: 读/写位,决定当前传输是读还是写操作。
    • 描述:
      • Rd (读): R/W# 位为 1,表示读操作。
      • Wr (写): R/W# 位为 0,表示写操作。
  5. A, N (Acknowledge/Not Acknowledge bit):
    • 定义: 应答位,表明接收方是否成功接收到数据。
    • 描述:
      • A: 接收方发送低电平,表示成功接收到数据并确认。
      • N: 接收方发送高电平,表示未接收到或不需要确认。
  6. Address (7 bits):
    • 定义: I2C 设备地址,通常为 7 位,但可以扩展为 10 位。
    • 描述: 主机发送的 7 位地址用于识别从设备。对于 10 位地址,在传输时需要扩展。
  7. Command Code (8 bits):
    • 定义: 命令字节,用于选择从设备内部的寄存器或特定功能。
    • 描述: 设备接收到命令字节后,通常根据该字节选择特定寄存器或执行相应操作。
  8. Data Byte (8 bits):
    • 定义: 数据字节,用于传输数据。
    • 描述: 每个数据字节为 8 位;如果设备需要传输 16 位数据,则会分为两个字节(如 DataLowDataHigh)。
  9. Count (8 bits):
    • 定义: 块操作中的长度字节。
    • 描述: 当执行块读写操作时,Count 字节表示数据块的长度,即需要读或写的字节数。
  10. […]:
    • 定义: 设备发送的数据。
    • 描述: [..] 表示数据由 I2C 设备发送,通常与 Host Adapter 发送的数据进行区分。没有中括号的表示由 Host Adapter 发送的数据。

这些符号是 I2C 和 SMBus 协议传输过程中重要的数据单位,定义了传输的具体步骤和数据结构,确保主设备与从设备之间的可靠通信。

2.2 操作标志和函数

在 Linux 系统中,SMBus(系统管理总线)通信通常由 I2C 总线驱动程序支持,并且通过 i2c-dev 接口与用户空间的工具进行交互。I2C-tools 是一个用于和 I2C 和 SMBus 设备进行用户空间通信的工具集。SMBus 标准操作可以通过相应的 i2c_smbus_xxx 函数进行实现,这些函数封装了 SMBus 设备与主机之间的标准化通信协议。

事先说明,标黄的表示来自从设备,没标黄的表示I2C控制器

1. SMBus Quick Command

  • S Address R/W# A P
  • 作用: Quick Command 操作发送一个读写命令,而不传输任何数据。通常用于控制设备的某些状态,比如简单的开关操作。
    • 写操作: 主机仅发送设备地址和 R/W 位为 0(写),然后立即发送停止位。
    • 读操作: 主机发送设备地址和 R/W 位为 1(读),然后立即发送停止位。
  • I2C-tools 函数: 无对应函数,直接操作 R/W 位。
  • Functionality flag: I2C_FUNC_SMBUS_QUICK

2. SMBus Receive Byte

  • S Address Rd A DataByte N P
  • 作用: 从设备读取一个字节,读取操作后不需要发送应答信号 (N 表示不回应)。
  • I2C-tools 函数: i2c_smbus_read_byte()
  • Functionality flag: I2C_FUNC_SMBUS_READ_BYTE

3. SMBus Send Byte

  • S Address Wr A DataByte A P
  • 作用: 向设备发送一个字节。
  • I2C-tools 函数: i2c_smbus_write_byte()
  • Functionality flag: I2C_FUNC_SMBUS_WRITE_BYTE

4. SMBus Read Byte

  • S Address Wr A Command Code A

  • Sr Address Rd A DataByte N P

  • 作用: 发送命令字节 (通常是寄存器地址),然后读取设备返回的一个数据字节。

  • I2C-tools 函数: i2c_smbus_read_byte_data()

  • Functionality flag: I2C_FUNC_SMBUS_READ_BYTE_DATA


5. SMBus Read Word

  • S Address Wr A Command Code A

  • Sr Addres Rd A DataByteLow A DataByteHigh N P

  • 作用: 发送命令字节,然后读取两个字节数据(16 位数据,分为 DataLowDataHigh)。

  • I2C-tools 函数: i2c_smbus_read_word_data()

  • Functionality flag: I2C_FUNC_SMBUS_READ_WORD_DATA


6. SMBus Write Byte

  • S Address Wr A Command Code A DataByte A P

  • 作用: 发送命令字节和一个数据字节。

  • I2C-tools 函数: i2c_smbus_write_byte_data()

  • Functionality flag: I2C_FUNC_SMBUS_WRITE_BYTE_DATA


7. SMBus Write Word

  • S Address Wr A Command Code A

  • DataByteLow A DataByteHigh A P

  • 作用: 发送命令字节和两个数据字节 (16 位)。

  • I2C-tools 函数: i2c_smbus_write_word_data()

  • Functionality flag: I2C_FUNC_SMBUS_WRITE_WORD_DATA


8. SMBus Block Read

  • S Address Wr A Command Code A

  • Sr Address Rd A BlockCount=N A …

  • DataByte1 A DataByte2 A…DataByteN N P

  • 作用: 发送命令字节,读取多个字节的数据。首先读取一个表示块长度的字节 (Block Count),然后读取指定数量的数据字节。

  • I2C-tools 函数: i2c_smbus_read_block_data()

  • Functionality flag: I2C_FUNC_SMBUS_READ_BLOCK_DATA


9. SMBus Block Write

  • S Address Wr A Command Code A ByteCount=N A

  • DataByte1 A DataByte2 A … DataByteN A P

  • 作用: 发送命令字节、块长度字节 (Byte Count),然后发送多个数据字节。

  • I2C-tools 函数: i2c_smbus_write_block_data()

  • Functionality flag: I2C_FUNC_SMBUS_WRITE_BLOCK_DATA


10. I2C Block Read

  • S Address Wr A Command Code A

  • Sr Address Rd A

  • DataByte1 A == DataByte2== A … DataByteN N P

  • 作用: 连续读取多个字节数据,与 SMBus Block Read 不同的是设备不发出第一个长度字节。

  • I2C-tools 函数: i2c_smbus_read_i2c_block_data()

  • Functionality flag: I2C_FUNC_SMBUS_READ_I2C_BLOCK


11. I2C Block Write

  • S Address Wr A Command Code A

  • DataByte1 A DataByte2 A … DataByteN A P

  • 作用: 连续发送多个字节数据,区别在于发送的数据中不包含长度字节。

  • I2C-tools 函数: i2c_smbus_write_i2c_block_data()

  • Functionality flag: I2C_FUNC_SMBUS_WRITE_I2C_BLOCK


12. SMBus Block Write-Block Read Process Call

  • S Address Wr A Command Code A ByteCount=N A

  • DataByte1 A DataByte2 A … DataByteN A P…

  • Sr Address Rd A ByteCount=N A…

  • DataByte1 A DataByte2 A … DataByteN N P

  • 作用: 先发送一块数据,再读取一块数据。常用于对多个寄存器的读写。

  • Functionality flag: I2C_FUNC_SMBUS_BLOCK_PROC_CALL


13. Packet Error Checking (PEC)

SMBus 协议详解_第2张图片

  • 作用: 用于错误检测,数据传输前会计算一个 8 位的 CRC-8 校验码 (PEC),数据传输完成后在发送停止位 (P) 前发送 PEC 字节,确保数据的完整性。
  • 应用: 任何需要高数据完整性的操作均可启用 PEC,确保主机和设备之间的传输无错误。

SMBus 提供了比标准 I2C 协议更严格的传输格式和功能集,特别适合系统管理类任务,同时它在低功耗设备中也有应用。这些函数通过 I2C-tools 调用可以方便地与设备进行通信,利用其功能标志 (Functionality flag) 可以检测当前驱动是否支持所需的操作。

专栏

设备树和总线专栏讲解
感兴趣也可以看看这里面的文章哦

你可能感兴趣的:(#,IIC子系统,嵌入式驱动开发,嵌入式,linux驱动开发,arm开发,SMBus协议)