09、SMBus介绍
什么是SMBus?
SMBus(System Management Bus)是一种基于I2C协议的低速通信协议,主要用于在计算机和外部设备之间进行管理和监控。它最初由Intel引入,旨在提供一种简单的通信方式来管理电源、温度、风扇速度等硬件功能。与I2C相比,SMBus有一些额外的规范和功能,例如更严格的时间要求和特殊的命令格式。
一、SMBus的基本特性
- 双向通信:SMBus允许主设备和从设备之间进行双向数据传输。
- 地址寻址:每个SMBus设备都有一个唯一的地址,主设备通过这个地址与特定的从设备进行通信。
- 消息格式:SMBus协议定义了数据传输的格式,包括数据字节、命令字节等。
- 错误检测:SMBus实现了简单的错误检测机制,例如超时和数据完整性检查。
二、SMBus与I2C的区别
虽然SMBus是基于I2C的,但两者有重要区别,主要体现在以下方面:
1. 用途和设计
- I2C:是一种通用的通信协议,可以连接多个设备(最多127个),比如传感器、存储芯片等,用途广泛。
- SMBus:是I2C的简化版,专门用来管理电源或监控系统(比如电池、温度传感器)。它增加了严格的规则,确保设备能稳定工作。
2. 速度差异
- I2C:传输速度较高,通常有100kHz或400kHz两种标准模式,部分设备还能支持更快的速度(比如1MHz)。
- SMBus:速度较低,通常固定在100kHz,有时甚至更慢。
3. 数据规则
- I2C:数据长度灵活,可以传输任意长度的信息(最多32字节),格式也比较自由。
- SMBus:数据格式严格固定,每条信息长度通常不超过32字节,并且字节顺序有明确规定。
4. 错误处理
- I2C:能检测基础错误(比如数据传输中断),但不要求必须处理。
- SMBus:有更严格的错误检测机制,比如超时保护(如果设备没及时响应,直接判定失败)。
5. 设备协作方式
- I2C:主设备(比如CPU)可以随时发起通信,选择任意从设备,灵活性较高。
- SMBus:主设备对从设备响应时间要求更严格(比如必须在限定时间内回复),否则会判定为故障。
总结:I2C像一条“通用高速公路”,能灵活连接多种设备,速度更快;而SMBus像一条“专用检修通道”,虽然速度慢,但规则更严格,专门用来管理硬件状态(如电源、温度等),确保关键设备稳定运行。
三、常用SMBus函数
1. i2c_smbus_read_byte()
作用:从设备读取一个字节数据 参数:
client
:设备句柄(指向设备的指针) 返回值:- 成功返回读到的字节(0~255)
- 失败返回 -1
2. i2c_smbus_write_byte()
作用:向设备写入一个字节 参数:
client
:设备句柄value
:要写入的字节(0~255) 返回值:- 成功返回 0
- 失败返回 -1
3. i2c_smbus_read_byte_data()
作用:从设备的指定寄存器读取一个字节 参数:
client
:设备句柄command
:寄存器地址 返回值:- 成功返回读到的字节(0~255)
- 失败返回 -1
4. i2c_smbus_write_byte_data()
作用:向设备的指定寄存器写入一个字节 参数:
client
:设备句柄command
:寄存器地址value
:要写入的字节(0~255) 返回值:- 成功返回 0
- 失败返回 -1
::: 关键点总结:
所有函数通过 client
参数指定目标设备
读操作返回数据本身(成功)或 -1(失败)
写操作返回 0(成功)或 -1(失败)
带 _data
的函数需要额外指定寄存器地址 command
:::