0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

驱动之路#42:I2C协议与SMBus协议是什么关系?

BSP调试从0到1 来源:嵌入式分享 作者:嵌入式分享 2026-06-07 17:57 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前面几篇文章,我们简单聊了 I2C通信机制,也聊了为什么 I2C 总线需要上拉电阻

但在看 Linux I2C 驱动时,很多新手又会遇到一个新名词:SMBus

比如内核里经常能看到这些接口

i2c_smbus_read_byte_data()i2c_smbus_write_byte_data()i2c_smbus_read_word_data()

这时候就容易懵:

我不是在学 I2C 吗?怎么突然冒出来一个 SMBus?SMBus 和 I2C 是一个东西吗?I2C 设备能不能用 SMBus 接口访问?

今天就简单捋一捋它们之间的关系。


1. 先说结论

一句话总结:

SMBus 是基于 I2C 发展出来的一套系统管理总线规范,可以理解为 I2C 的“专用化、标准化子集”。

也就是说,SMBus 不是凭空冒出来的新总线,它和 I2C 关系非常近。

它复用了 I2C 的很多基础机制,比如:

SDA / SCL 两根线;起始信号 Start;停止信号StopACK / NACK 应答;高位在前传输;主从设备通信模型。

所以,从底层通信形式看,SMBus 很像 I2C。

但 SMBus 又不是完全等于 I2C。

I2C 更像一个通用通信协议,灵活性很高;SMBus 则是在 I2C 基础上加了一些限制和标准流程,主要服务于系统管理场景。

简单类比一下:

I2C像普通公路,什么车都能跑;SMBus 像基于公路规划出来的通勤专用道,规则更明确,限制也更多。

所以可以粗略理解为:SMBus ⊂ I2C

wKgZO2ohUCaAElNIAAAQ7MJVyGw708.png

但这句话也不能理解得太绝对,因为两者在电气特性、超时机制、命令格式等细节上还是有差异。


2. SMBus 为什么会诞生?

I2C 最早是为芯片之间的低速通信设计的,优点是简单、灵活、成本低。

但也正因为它太灵活,不同厂商在使用时可能会各玩各的。

比如:

通信速率怎么定?寄存器怎么访问?命令格式怎么设计?错误怎么处理?设备超时怎么办?

这些问题如果完全交给厂商自由发挥,普通传感器场景可能还能接受,但在 PC、服务器、电源管理、硬件监控这些场景中,就会比较麻烦。

因为系统管理类设备更强调:

兼容性;可靠性;低功耗;故障检测;标准命令格式。

比如温度传感器电源芯片电池管理芯片、风扇控制芯片,如果每个厂商都定义一套完全不同的通信方式,系统软件适配起来就会很痛苦。

所以,Intel 在 I2C 的基础上制定了 SMBus,也就是System Management Bus,系统管理总线

它的目标很明确:给系统管理类外设制定一套更统一、更标准的通信规则。


3. SMBus 和 I2C 到底哪里像?

SMBus 和 I2C 最像的地方,是它们的底层通信方式。

两者都使用:

SDA:数据线;SCL:时钟线。

也都采用主从结构。主机发起通信,从设备根据地址响应。

一次典型通信过程依然是:

Start -> 地址 -> 读/写位 -> ACK -> 数据 -> ACK/NACK ->Stop

所以你会发现,很多 SMBus 设备挂在 I2C 控制器下面也能正常访问。

这也是为什么在 Linux 驱动里,我们经常直接通过 I2C adapter 去访问 SMBus 类设备。

从驱动开发角度看,很多时候你并不需要特别纠结“它到底是 I2C 还是 SMBus”,而是要看设备手册提供了什么访问方式。


4. SMBus 和 I2C 又有什么不同?

虽然 SMBus 基于 I2C,但它比 I2C 更“规矩”。I2C 更偏通用,很多地方可以由设备厂商自定义。

SMBus 则规定了更多标准操作,比如常见的:

Read Byte;WriteByte;Read ByteDataWriteByteDataRead WordDataWriteWordDataBlock Read;BlockWrite

这就是为什么 Linux 内核里会有一堆i2c_smbus_xxx()接口。

比如:

i2c_smbus_read_byte_data(client, reg);

它的含义一般是:向某个设备的某个寄存器地址读取 1 字节数据

类似地:

i2c_smbus_write_byte_data(client, reg,val);

通常表示:向某个设备的某个寄存器地址写入 1 字节数据。

这些接口把常见的寄存器读写操作封装好了,用起来比手动组织i2c_msg更简单。


5. 为什么 Linux I2C 驱动里经常用 SMBus 接口?

这是很多初学者最容易疑惑的地方。

明明设备树里挂的是 I2C 设备,驱动里为什么调用的是i2c_smbus_read_xxx()

原因很简单:Linux 内核里的 SMBus 接口,本质上是一组基于 I2C adapter 的便捷访问函数。

对于很多简单 I2C 外设,比如温度传感器、RTC、GPIO 扩展芯片、PMIC 的部分寄存器访问,通信格式通常就是:

写寄存器地址 -> 读/写寄存器数据

这种模式非常常见。

所以内核提供了 SMBus 风格的 API,让驱动开发者不用每次都手动构造struct i2c_msg

比如普通 I2C 读写可能要自己组织 message:

structi2c_msg msgs[2];

而 SMBus 接口一行就能完成简单寄存器读写:

val= i2c_smbus_read_byte_data(client, reg);

所以很多时候,用 SMBus API 并不代表这个设备只能跑 SMBus,而是因为这个访问方式刚好满足需求。

这也是 Linux I2C 驱动里非常常见的写法。


6. SMBus 设备能不能接到 I2C 总线上?

一般来说,很多 SMBus 设备可以挂到 I2C 总线上使用。

原因是 SMBus 基于 I2C,底层时序和总线结构很接近。

但要注意:不是所有 I2C 设备都能无脑当 SMBus 设备用。

因为 SMBus 对通信速率、超时、命令格式、电气特性等有自己的要求。

有些 I2C 设备通信格式比较特殊,比如需要连续传输大量数据,或者使用不标准的寄存器访问流程,这时就不一定适合用 SMBus API。

所以工程上不要死记:

SMBus设备一定能接 I2C;I2C 设备一定能接 SMBus。

更稳妥的判断方式是:

看芯片手册;看 Linux 驱动已有实现;看控制器是否支持对应传输方式;看通信时序是否匹配。

7. 开发中怎么选择?

实际写驱动时,可以简单按这个原则来判断。

如果设备只是普通寄存器读写,比如:

读 1 字节寄存器;写 1 字节寄存器;读 2 字节状态值;写 2 字节配置值。

那可以优先考虑i2c_smbus_xxx()这类接口。比如:

ret= i2c_smbus_read_byte_data(client, reg);

如果设备通信流程比较复杂,比如:

一次传输多个 i2c_msg;需要 repeatedstart需要读写大块数据;设备协议不是标准寄存器访问;需要精确控制传输过程。

那更适合直接使用:

i2c_transfer()

简单说就是:

简单寄存器访问:优先看 SMBus API;复杂 I2C 时序:使用 i2c_transfer()。最终依据:芯片手册定义的通信格式 + I2C adapter 支持的功能。

这也是 Linux 驱动里很常见的选择方式。


8. 工程上不要被名字绕晕

对刚入门 Linux I2C 驱动的人来说,SMBus 这个名字确实容易让人误解。

我一开始也容易想复杂:

这是另一套协议吗?是不是不能和 I2C 混用?为什么 I2C 驱动里全是 smbus 函数?

后面慢慢看驱动才发现,很多场景下可以先这样理解:SMBus 是 I2C 的标准化使用方式之一,而 Linux 里的 SMBus API 是一组常用 I2C 设备访问接口。

这样理解,基本就不会被名字卡住了。

当然,如果你做的是电源管理、电池管理、服务器管理类设备,那就需要更认真看 SMBus 规范和芯片手册,因为这些场景可能会用到 SMBus 的超时、PEC 校验、Block 传输等特性。

但如果只是普通嵌入式外设适配,先知道两者关系和 API 选择,基本就够用了。


9. 总结

I2C 和 SMBus 的关系可以这样理解:

I2C:通用两线制串行总线,灵活、应用广;
SMBus:基于 I2C 的系统管理总线,规则更标准,主要用于电源、温度、电池、硬件监控等场景;
Linux SMBus API:内核提供的一组便捷 I2C 访问接口,常用于简单寄存器读写。

开发中怎么选?

[ ]普通外设、特殊时序、大块数据传输:优先看 i2c_transfer()[ ]简单寄存器读写:可以优先用 i2c_smbus_xxx()[ ]电源管理、电池、温度监控类芯片:重点看芯片是否要求 SMBus 规范[ ]不确定时:先看芯片手册和已有内核驱动

一句话总结:

SMBus 不是 I2C 的对立面,而是基于 I2C 发展出来的标准化系统管理总线;在 Linux 驱动里,很多 SMBus API 本质上就是为了方便访问常见 I2C 外设。

理解到这一层,再看到i2c_smbus_read_byte_data()这类函数,就不会懵了。

(完)

下期继续聊:I2C子系统架构是怎么的?


本人专注Linux 嵌入式全栈开发,可提供从硬件方案评估与设计、Linux/AndroidBSP 适配、驱动开发、外设调试、系统移植到产品交付的全流程技术支持。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5213

    文章

    20855

    浏览量

    339522
  • Linux
    +关注

    关注

    88

    文章

    11888

    浏览量

    220163
  • I2C协议
    +关注

    关注

    0

    文章

    30

    浏览量

    9375
  • SMBus协议
    +关注

    关注

    0

    文章

    4

    浏览量

    1408
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入剖析I2C协议

    I2C也是一种可以多主设备,多从设备的总线协议,通过地址索引,I2C可以使能所需从设备,I2C的出现主要是用来实现不同集成电路组件之间的控制功能,比如通过
    的头像 发表于 08-21 15:10 4108次阅读
    深入剖析<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>

    I2C总线协议及其应用(图)

    I2C总线协议及其应用
    发表于 06-01 20:22 7306次阅读

    I2C总线协议及其应用

    I2C总线协议及其应用 一、I2C总线介绍: ---- 由于大规模集成电路技术的发展,在单个芯片集成CPU以及组成一个单独工作系统
    发表于 02-08 11:23 1840次阅读
    <b class='flag-5'>I2C</b>总线<b class='flag-5'>协议</b>及其应用

    I2C最新协议标准

    I2C最新协议标准,详细介绍了IIC信号要求,供大家参考,
    发表于 12-22 17:59 18次下载

    STM32学习之I2C协议(读写EEPROM)

    关于STM32学习分享第七章 I2C协议(读写EEPROM)文章目录关于STM32学习分享前言二、代码1.i2c.c2.i2c.h3.main.c总结前言开始!开始!单片机的I2C
    发表于 11-30 15:21 34次下载
    STM32学习之<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>(读写EEPROM)

    MPU6050的I2C通信协议

    不同硬件有不同的I2C协议
    发表于 12-06 12:21 3次下载
    MPU6050的<b class='flag-5'>I2C</b>通信<b class='flag-5'>协议</b>

    嵌入式内核及驱动开发-09IIC子系统框架使用(I2C协议和时序,I2C驱动框架,I2C从设备驱动开发,MPU6050硬件连接

    文章目录I2c协议和时序I2c介绍I2c硬件连接I2c总线的信号I2c总线写时序
    发表于 12-06 14:06 17次下载
    嵌入式内核及<b class='flag-5'>驱动</b>开发-09IIC子系统框架使用(<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>和时序,<b class='flag-5'>I2C</b><b class='flag-5'>驱动</b>框架,<b class='flag-5'>I2C</b>从设备<b class='flag-5'>驱动</b>开发,MPU6050硬件连接

    一文看懂I2C协议

    电子行业最常用的3种串行通讯协议:UART、SPI和I2C。前面介绍了串口通讯协议及其FPGA实现,SPI协议。本篇文章介绍I2C通讯
    发表于 01-25 18:32 40次下载
    一文看懂<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>

    了解I2C Primer、PMBus和SMBus通信协议

    I2C或内部集成电路是建立设备之间通信的常用串行通信协议,特别是对于两个或多个不同的电路。I2C引物是最常用的 I2C. 本文将提供 I
    的头像 发表于 12-12 16:58 1.1w次阅读
    了解<b class='flag-5'>I2C</b> Primer、PMBus和<b class='flag-5'>SMBus</b>通信<b class='flag-5'>协议</b>

    Linux控制I2C/SMBus设备

    I2C是Philips开发的一种两线通信协议,常用于一些对速度要求不高的小型器件上。SMBus是系统管理总线,基于I2C协议,大部分情况下二
    的头像 发表于 03-23 10:02 2722次阅读
    Linux控制<b class='flag-5'>I2C</b>/<b class='flag-5'>SMBus</b>设备

    I2C通信协议:了解I2C Primer、 PMBus和SMBus

    I2C Primer的基本特性和标准,并重点说明在通信实现过程中如何正确使用该协议。从I2C的基本原理出发,我们将介绍其变体子集——系统管理总线(SMBus)和电源管理总线(PMBus
    的头像 发表于 06-15 15:29 8793次阅读
    <b class='flag-5'>I2C</b>通信<b class='flag-5'>协议</b>:了解<b class='flag-5'>I2C</b> Primer、 PMBus和<b class='flag-5'>SMBus</b>

    使用I2C协议点亮OLED

    你好,我是爱吃鱼香ROS的小鱼。本节我们就尝试直接使用I2C协议来点亮OLED,因为主要测试I2C协议,所以对于复杂的显示处理部分小鱼就略过了,毕竟有方便的开源库使用,我们也不用那么纠
    的头像 发表于 07-15 16:47 3574次阅读
    使用<b class='flag-5'>I2C</b><b class='flag-5'>协议</b>点亮OLED

    I2C串行总线协议是什么?I2C总线有哪些优点?

    I2C串行总线协议是什么?I2C总线有哪些优点? I2C(Inter-Integrated Circuit)是一种串行总线协议,由Phili
    的头像 发表于 09-12 11:18 3391次阅读

    简单认识I2C通信协议

    I2C(Inter-Integrated Circuit)通信协议是由飞利浦公司(现为恩智浦半导体)开发的一种简单、双向二线制同步串行总线协议。自1982年发布以来,I2C
    的头像 发表于 07-25 18:06 4087次阅读

    I2C协议的基础知识

    本文从I2C协议的概述开始,描述协议的历史、不同速度模式、物理层和数据帧结构,最后介绍I2C混合电压系统中电平兼容性以及上拉电阻大小计算。
    的头像 发表于 10-22 15:51 5707次阅读
    <b class='flag-5'>I2C</b><b class='flag-5'>协议</b>的基础知识