RK3568驱动指南|第十五篇 I2C-第183章 SMBus总线介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十五篇 I2C_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第183章 SMBus总线介绍

183.1 什么是SMBus总线?

SMBus(System Management Bus)是由Intel在1995年发布的一种基于I2C总线的串行总线协议。它最初被设计用于在电脑系统内部连接智能电池和其他系统管理设备。

SMBus与I2C总线非常相似,它们都采用两线式串行通信。SMBus使用SMBDAT和SMBCLK作为数据线和时钟线,与I2C的SDA和SCL很相似,如下图所示:

SMBus的主要特点如下所示:

电气特性:

(1)采用开漏输出,需要外部上拉电阻

(2)电压范围:0V到5.5V

(3)最大时钟频率:100kHz

通信协议:

(1)主从式通信,一个主设备控制多个从设备

(2)地址空间:7位或10位

(3)支持读/写操作

(4)支持块传输和字节传输

(5)支持多种事务类型,如快速命令、写字节、读字节等

功能特性:

(1)简单、低成本、低功耗

(2)面向系统管理应用,如电源管理、温度监控等

(3)与I2C高度兼容,可以复用I2C硬件

时序特性:

(1)Start和Stop条件与I2C相同

(2)地址和数据传输时序也与I2C相似

(3)但有一些特殊的时序,如快速命令、块传输等

183.2 SMBus和I2C的区别

(1)速度范围:

I2C支持从10kHz到3.4MHz不等的速度范围,覆盖了更广泛的应用场景。

SMBus则只支持10kHz到100kHz的速度范围,主要面向低速的系统管理应用场景。

(2)ACK应答:

I2C不强制从机发送ACK应答,这样可以提高灵活性。但如果从机没有应答,主机可能会产生错误。

SMBus要求从机必须发送ACK应答,这可以确保主机能够检测到从机是否存在,避免误操作。

(3)时间限制:

SMBus规定,从机不能将SCL线拉低超过35ms,否则会复位正在进行的通信。

I2C没有这样的时间限制,主机和从机可以自主控制SCL线的状态。

(4)其他区别:

SMBus有一些专门为系统管理设计的命令和事务类型,如快速命令、块传输等。

SMBus的地址空间相比I2C更小,只支持7位或10位地址。

SMBus在电气特性上也有一些差异,如电压范围等。

183.3 SMBus总线软件实现

在Linux内核中,I2C和SMBus是共用的总线架构,通过i2c-core子系统进行管理和抽象,在i2c.h头文件中定义了i2c_algorithm结构体中,具体内容如下所示:

struct i2c_algorithm {
    /* 如果 I2C 适配器算法无法执行 I2C 级别的访问,则应将 master_xfer 设置为 NULL。
       如果 I2C 适配器算法可以执行 SMBus 访问,则应设置 smbus_xfer。
       如果设置为 NULL,则将使用通用的 I2C 消息来模拟 SMBus 协议 */
    /* master_xfer 函数应该返回成功处理的消息数量,或者在出现错误时返回一个负值 */
    int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,
                       int num);

    /* 用于执行 SMBus 传输操作的函数指针
       adap: I2C 适配器
       addr: 从设备地址
       flags: 传输标志
       read_write: 读/写标志
       command: SMBus 命令码
       size: 传输数据的大小
       data: 用于存储传输数据的联合体 */
    int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
                       unsigned short flags, char read_write,
                       u8 command, int size, union i2c_smbus_data *data);

    /* 用于确定适配器支持的功能的函数指针 */
    u32 (*functionality) (struct i2c_adapter *);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
    /* 用于注册和注销从设备的函数指针 */
    int (*reg_slave)(struct i2c_client *client);
    int (*unreg_slave)(struct i2c_client *client);
#endif
};

其中smbus_xfer函数用于实现SMBus特有的一些操作,如快速命令、写字节、读字节等。

当I2C控制器工作在SMBus模式时,会通过smbus_xfer函数来执行SMBus的特殊事务。

183.4 SMBus总线API函数

函数1:i2c_smbus_read_byte(const struct i2c_client *client)

函数原型: s32 i2c_smbus_read_byte(const struct i2c_client *client)

功能: 从当前位置读取一个字节的数据,不设置地址

参数: client - I2C设备的客户端结构体

返回值: 读取到的数据,失败返回负数

函数2:i2c_smbus_write_byte(const struct i2c_client *client, u8 value)

函数原型: s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value)

功能: 向当前位置写入一个字节的数据,不设置地址

参数: client - I2C设备的客户端结构体, value - 要写入的数据

返回值: 成功返回0,失败返回负数

函数3:i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)

函数原型: s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)

功能: 读取指定地址的一个字节的数据

参数: client - I2C设备的客户端结构体, command - 要读取的地址

返回值: 读取到的数据,失败返回负数

函数4:i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value)

函数原型: s32 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command, u8 value)

功能: 向指定地址写入一个字节的数据

参数: client - I2C设备的客户端结构体, command - 要写入的地址, value - 要写入的数据

返回值: 成功返回0,失败返回负数

上述4个函数是smbus总线通信的常用数据接收和发送函数,而在前面的章节中已经编写了I2C总线的通信驱动,如果要使用smbus总线进行通信,只需要将前面编写的驱动函数中的i2c_transfer函数根据功能替换为上面四个函数即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766761.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑版微信自动发送微信消息给好友或者群聊

一.软件下载 点击微信自动发送消息下载 二.相关使用方法 1.打开软件,输入想自动发送的内容 2.确保登录了微信电脑版【PC端】,然后切换到想要自动发送的好友或群聊的窗口。 3.点击开始,现在自动发送即可,稍等三秒程序自动运行。 …

小程序开发平台版源码系统——万能门店小程序功能 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在移动互联网的浪潮中,小程序以其轻量、便捷、无需下载即可使用的特点,迅速成为连接用户与商家的新桥梁。为了满足广大商家快速搭建个性化、高效运营的小程序需求,我们精心打造了“小程序开发平台版源码系统——万能门店小程序功能…

秋招——MySQL补充——MySQL是如何加行级锁

文章目录 引言正文什么SQL语句会加行级锁查询操作增加对应的行级锁事务的写法 update和delete修改操作也会增加行级锁 行级锁有哪些种类记录锁间隙锁Next-Key锁 MySQL是如何加行级锁?唯一索引等值查询查询记录是存在的查询记录是不存在的 唯一索引范围查找针对大于或…

【python脚本】批量检测sql延时注入

文章目录 前言批量检测sql延时注入工作原理脚本演示 前言 SQL延时注入是一种在Web应用程序中利用SQL注入漏洞的技术,当传统的基于错误信息或数据回显的注入方法不可行时,例如当Web应用进行了安全配置,不显示任何错误信息或敏感数据时&#x…

Element中的消息提示组件Message和弹框组件MessageBox

简述:在 Element UI 中,Message和MessageBox都是比较常用的组件,Message用来提示消息,而MessageBox是一个用于创建模态对话框的组件。它可以用于在页面上快速展示信息、警告或错误提示,而不会阻止用户的其他操作。简单…

Pandas_DataFrame读写详解:案例解析(第24天)

系列文章目录 一、 读写文件数据 二、df查询数据操作 三、df增加列操作 四、df删除行列操作 五、df数据去重操作 六、df数据修改操作 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、 读写文…

华为DCN之:SDN和NFV

1. SDN概述 1.1 SDN的起源 SDN(Software Defined Network)即软件定义网络。是由斯坦福大学Clean Slate研究组提出的一种新型网络创新架构。其核心理念通过将网络设备控制平面与数据平面分离,从而实现了网络控制平面的集中控制,为…

深入理解C++中的锁

目录 1.基本互斥锁(std::mutex) 2.递归互斥锁(std::recursive_mutex) 3.带超时机制的互斥锁(std::timed_mutex) 4.带超时机制的递归互斥锁(std::recursive_timed_mutex) 5.共享…

图解 Kafka 架构

写在前面 Kafka 是一个可横向扩展,高可靠的实时消息中间件,常用于服务解耦、流量削峰。 好像是 LinkedIn 团队开发的,后面捐赠给apache基金会了。 kafka 总体架构图 Producer:生产者,消息的产生者,是消息的…

android AIDL使用demo

背景 最近打算学习一下如何在framework层添加一个自定义service。 了解到自定义service需要使用aidl,为了加强对aidl的了解和使用过程,特意又温习了一下aidl的使用,并用博客的形式记录下来。 aidl官方参考:https://developer.and…

不同系统间数据交换要通过 api 不能直接数据库访问

很多大数据开发提供数据给外部系统直接给表结构,这是不好的方式。在不同系统间进行数据交换时,通过API(应用程序编程接口)而非直接访问数据库是现代系统集成的一种最佳实践。 目录 为什么要通过API进行数据交换如何通过API进行数据…

论文辅导 | 基于多尺度分解的LSTM⁃ARIMA锂电池寿命预测

辅导文章 模型描述 锂电池剩余使用寿命(Remaining useful life,RUL)预测是锂电池研究的一个重要方向,通过对RUL的准确预测,可以更好地管理和维护电池,延长电池使用寿命。为了能够准确预测锂电池的RUL&…

STM32 看门狗 HAL

由时钟图可以看出看门狗采用的是内部低速时钟,频率为40KHz 打开看门狗,采用32分频,计数1250。 结合设置的分频系数和重载计数值,我们可以计算出看门狗的定时时间: 32*1250/40kHz 1s 主函数中喂狗就行 HAL_IWDG_Ref…

STM32 HAL库读取ID

在stm32f1xx_hal.c文件中由读取ID号的子函数,不同单片机的UID_BASE不同,本单片机用的是STM32F103CBT6,跳转之后可以看到地址为:0x1FFFF7E8 在程序中只需定义一个数组调用读取ID的函数即可 uint32_t UID[3]; while(1) { UID[0] HAL_GetUIDw0…

catia数控加工仿真铣平面粗加工

1,零件建模,毛坯建模 2 在毛坯上建立坐标系 3 添加资料刀具 4,双击对相关加工信息做设置 5 Roughing 加工设置 高亮红色区域是必选的,其他可以默认 6 完成加工仿真 7 加工余量

EasyExcel4导入导出数据(基于MyBatisPlus)

一、POM依赖 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…

Camera Raw:编辑 - 细节

Camera Raw “编辑”模块中的细节 Detail面板用于增强照片的锐度和减少噪点。通过对锐化和降噪进行精细调整&#xff0c;可以提高图像的清晰度&#xff0c;减少噪点&#xff0c;提高图像质量。 ◆ ◆ ◆ 使用方法与技巧 1、增强照片锐度 较小的“半径”&#xff0c;较大的“细…

如何解决大文件传输存在的痛点,实现高效流转?

在当代的数字化时代&#xff0c;数据资产在各行各业中扮演着举足轻重的角色&#xff0c;而数据的流通与交换则是其价值得以实现的关键。企业在进行大文件传输时&#xff0c;都面临着诸多挑战&#xff0c;比如网络延迟、大小受限、安全风险等。因此&#xff0c;如何高效安全的进…

springboot个人证书管理系统16679

springboot个人证书管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足&#xff0c;创建了一个计算机管理个人证书管理系统的方案。文…

3、FTL基本工作过程

上文描述了FTL的四大功能&#xff0c;这里简述一下每个功能的含义。 地址转换简述 FTL要维护一个地址转换表&#xff0c;这个转换表是主机读/写硬盘的逻辑地址到硬盘实际物理地址的转换关系。 假如SSD的容量是128G&#xff0c;SSD逻辑块的大小是4KB&#xff0c;那SSD的逻辑块…