i2c中结构体 数据传输 i2c Tools使用

I2C中重要结构体

在I2C(Inter-Integrated Circuit)通信中,涉及的主要结构体通常用于描述设备、消息和传输的配置。以下是一些常见的I2C结构体及其作用:

  1. i2c_adapter:

    • 这是一个代表I2C总线适配器的结构体。它包含与该I2C总线相关的各种信息和操作函数指针。
    • 常见字段:
      • name: 适配器的名称。
      • algo: 指向一个i2c_algorithm结构体的指针,定义了适配器支持的操作集。
      • nr: 适配器的编号。
      • owner: 模块的所有者。
  2. i2c_msg:

    • 该结构体用于描述I2C消息,通常用于I2C传输过程中。
    • 常见字段:
      • addr: 设备的I2C地址。
      • flags: 用于设置读/写操作以及其他标志。
      • len: 数据缓冲区的长度。
      • buf: 指向数据缓冲区的指针。
  3. i2c_client:

    • 代表一个连接到I2C总线上的设备。
    • 常见字段:
      • addr: 设备的7位或10位I2C地址。
      • adapter: 指向设备所在的I2C适配器的指针。
      • driver: 指向设备驱动程序的指针。
      • name: 设备的名称。
  4. i2c_driver:

    • 代表I2C设备驱动程序。
    • 常见字段:
      • driver: 内嵌的驱动程序模型驱动结构体。
      • id_table: 支持的I2C设备ID表。
      • probe: 当匹配到设备时调用的函数。
      • remove: 当设备被移除时调用的函数。
  5. i2c_algorithm:

    • 定义I2C适配器所支持的操作。
    • 常见字段:
      • master_xfer: 主传输函数,用于执行读写操作。
      • smbus_xfer: 用于SMBus协议的传输函数。
      • functionality: 返回适配器支持的功能。

这些结构体是I2C子系统的核心组件,用于管理和描述I2C设备及其操作。它们在Linux内核的I2C子系统中非常重要,有助于实现I2C设备之间的通信和控制。

I2C数据传输

在Linux内核中,I2C数据传输是通过i2c-corei2c-bus驱动来完成的。I2C设备通常使用以下机制进行数据传输:

  • i2c_msg结构体: 描述单个I2C消息,包含设备地址、操作标志、数据长度和数据缓冲区。
  • i2c_transfer函数: 用于执行I2C传输。该函数使用i2c_msg结构体描述的消息序列在I2C总线上传输数据。
  • i2c_adapter结构体: 代表I2C总线适配器,包含传输功能的实现。

i2c_transfer 函数

i2c_transfer 是 Linux 内核中用于执行 I2C 数据传输的核心函数。它负责通过 I2C 总线执行一系列的数据读写操作。以下是对 i2c_transfer 函数的详细介绍:

函数原型

int i2c_transfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num);

参数说明

  • struct i2c_adapter *adapter:

    • 描述 I2C 总线适配器的结构体。
    • 这个适配器结构体通常由 I2C 驱动程序提供,并包含了与具体 I2C 总线相关的操作函数。
  • struct i2c_msg *msgs:

    • 指向 i2c_msg 结构体数组的指针。i2c_msg 结构体描述了单个 I2C 消息的内容。
    • 每个 i2c_msg 描述一个读写操作,包括目标设备的地址、读写标志、数据长度和数据缓冲区。
  • int num:

    • 要传输的消息数量,即 i2c_msg 数组中的元素个数。
成员说明
  • addr:

    • 目标 I2C 设备的地址,通常是一个 7 位或 10 位地址。
  • flags:

    • 操作标志,定义了传输的方向和特性。
    • 0 表示写操作。
    • I2C_M_RD 表示读操作。
  • len:

    • 数据的长度,以字节为单位。
  • buf:

    • 数据缓冲区的指针,用于存放要发送或接收的数据。

函数返回值

  • 成功: 返回成功传输的消息数量。通常应该等于传入的 num
  • 失败: 返回负值,表示发生了错误。常见的错误码包括 -EINVAL(无效参数)和 -EIO(I/O 错误)。

功能概述

  1. 传输消息:

    • i2c_transfer 函数会遍历 msgs 数组中的所有 i2c_msg,并逐一通过指定的 I2C 适配器进行传输。
  2. 处理读写操作:

    • 根据 i2c_msg 结构体中的 flags,确定是进行读操作还是写操作,并将数据从缓冲区发送到设备或从设备接收。
  3. 同步执行:

    • 所有消息按顺序执行,传输完成后函数返回。

示例代码

以下是一个使用 i2c_transfer 函数进行 I2C 数据读写的示例:

#include <linux/i2c.h>
#include <linux/module.h>static int i2c_read_write_example(struct i2c_client *client)
{struct i2c_msg msgs[2];unsigned char write_data[2] = {0x00, 0x01}; // 写入数据unsigned char read_data[2];int ret;// 配置写操作的消息msgs[0].addr = client->addr;msgs[0].flags = 0; // 写操作msgs[0].len = sizeof(write_data);msgs[0].buf = write_data;// 配置读操作的消息msgs[1].addr = client->addr;msgs[1].flags = I2C_M_RD; // 读操作msgs[1].len = sizeof(read_data);msgs[1].buf = read_data;// 执行 I2C 传输ret = i2c_transfer(client->adapter, msgs, 2);if (ret < 0) {pr_err("i2c_transfer failed: %d\n", ret);return ret;}pr_info("Data read: 0x%02x 0x%02x\n", read_data[0], read_data[1]);return 0;
}MODULE_LICENSE("GPL");

注意事项

  1. I2C 总线配置:

    • 确保 I2C 适配器和设备已经正确初始化,并且 i2c_client 指针有效。
  2. 消息顺序:

    • 消息会按顺序执行。确保在发送写操作后再进行读操作。
  3. 错误处理:

    • 检查返回值以处理错误,确保 I2C 操作的稳定性。

I2C-Tools使用

i2c-tools 是一个用于操作和调试 I2C 总线设备的工具集,常用于 Linux 系统中。它包括多个命令行工具,允许你与 I2C 总线上的设备进行交互,例如读取和写入寄存器,扫描总线等。

访问i2c 设备框架如下

在这里插入图片描述

常用工具和命令

以下是一些 i2c-tools 工具的简要介绍及其用法:

1. i2cdetect
  • 功能: 探测 I2C 总线上连接的设备,列出所有活动的 I2C 地址。

  • 用法:

    i2cdetect -y <bus>
    
    • <bus> 是要扫描的 I2C 总线编号。例如,i2cdetect -y 1 扫描 I2C 总线 1。
  • 示例:

    sudo i2cdetect -y 1
    

    输出格式:

         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
    
2. i2cget
  • 功能: 从 I2C 设备的寄存器读取数据。

  • 用法:

    i2cget -y <bus> <addr> <reg> [mode]
    
    • <bus> 是 I2C 总线编号。
    • <addr> 是设备的 I2C 地址。
    • <reg> 是寄存器地址。
    • [mode] 是读取模式,例如 b(字节模式)或 w(字模式)。
  • 示例:

    sudo i2cget -y 1 0x50 0x00
    

    读取地址 0x50 设备的寄存器 0x00 的值。

3. i2cset
  • 功能: 向 I2C 设备的寄存器写入数据。

  • 用法:

    i2cset -y <bus> <addr> <reg> <value> [mode]
    
    • <bus> 是 I2C 总线编号。
    • <addr> 是设备的 I2C 地址。
    • <reg> 是寄存器地址。
    • <value> 是要写入的数据。
    • [mode] 是写入模式,例如 b(字节模式)或 w(字模式)。
  • 示例:

    sudo i2cset -y 1 0x50 0x00 0xFF
    

    向地址 0x50 设备的寄存器 0x00 写入 0xFF

4. i2cdump
  • 功能: 显示 I2C 设备寄存器的完整内容。

  • 用法:

    i2cdump -y <bus> <addr> [mode]
    
    • <bus> 是 I2C 总线编号。
    • <addr> 是设备的 I2C 地址。
    • [mode] 是显示模式,例如 b(字节模式)或 w(字模式)。
  • 示例:

    sudo i2cdump -y 1 0x50
    

    显示地址 0x50 设备的所有寄存器内容。

5. i2cmsg
  • 功能: 提供低级访问 I2C 总线的功能,允许发送和接收 I2C 消息。

  • 用法:

    i2cmsg <bus> <addr> <cmd> [data...]
    
    • <bus> 是 I2C 总线编号。
    • <addr> 是设备的 I2C 地址。
    • <cmd> 是要发送的命令或数据。
  • 示例:

    i2cmsg 1 0x50 0x00
    

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hive3:Centos7环境部署Hive服务

一、安装说明 1、Hadoop集群情况 3台机器&#xff1a;4G2C、2G2C、2G2C 安装教程&#xff1a;Centos7环境安装Hadoop集群 2、安装MySQL&#xff0c;用于存储Hive的元数据 在102机器上安装MySQL 安装MySQL使用服务器的root账号 3、最后安装Hive 安装hive过程使用服务器的atgu…

dpdk编译安装以及接收udp报文(基于ubuntu)

目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载&#xff1a; DPDK 下载版本&#xff1a;DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…

STM32简介

1.STM32的三个重要特征 32位微控制器&#xff0c;也称作MCU。 由ST&#xff08;意法半导体&#xff09;公司开发。 以ARM-Cortex-M为核心。 2.STM32的优点 3.ARM ARM是RISC精简指令集的代表&#xff0c;很多移动设备都是基于ARM架构的。ARM自2004年以后放弃使用数字命名法…

Fantastic-admin:Vue 中后台管理系统

Fantastic-admin&#xff1a;Vue 中后台管理系统 在当今的前端开发世界里&#xff0c;fantastic-admin 作为一款功能强大的 Vue 中后台管理系统框架&#xff0c;简直是开发者的福音。本文将介绍 fantastic-admin 的基本信息、特点&#xff0c;以及如何快速上手和使用。 项目简介…

快速搞定分布式RabbitMQ---RabbitMQ进阶与实战

本篇内容是本人精心整理&#xff1b;主要讲述RabbitMQ的核心特性&#xff1b;RabbitMQ的环境搭建与控制台的详解&#xff1b;RabbitMQ的核心API&#xff1b;RabbitMQ的高级特性;RabbitMQ集群的搭建&#xff1b;还会做RabbitMQ和Springboot的整合&#xff1b;内容会比较多&#…

内存泄漏详解

文章目录 什么是内存泄漏内存泄漏的原因排查及解决内存泄漏避免内存泄漏及时释放资源设置合理的变量作用域及时清理不需要的对象避免无限增长避免内部类持有外部类引用使用弱引用 什么是内存泄漏 内存泄漏是指不使用的对象持续占有内存使得内存得不到释放&#xff0c;从而造成…

AI绘画进阶工具 ComfyUI 新版来啦!操作界面详解!取消悬浮面板,自带工作流管理功能!(附安装包)

大家好&#xff0c;我是画画的小强 在 7 月初的一次更新中&#xff0c;ComfyUI 官方推出了 Beta 版 UI&#xff0c;取消了原本的悬浮面板&#xff0c;还新增了工作流管理功能&#xff0c;整体使用体验比之前好了很多。今天就为大家详细介绍一些新版 UI 的特点和用法。 一、启…

HDBaseT远距离无压缩传输系统源头厂家

HDBaseT双绞线延长器是一款集成HDBaseT的远距离高清信号无压缩、无延时传输器&#xff0c;HDMI信号从接收端输出&#xff0c; 信号分辨率高达4Kx2K可以通过单根CAT5/CAT6网线将信号长距离传输高清无压缩音视频信号&#xff0c; 采用单根网线最远可传输70/100米&#xff0c; …

Hive-内部表和外部表

区别 内部表实例 准备数据 查看数据 删除数据 外部表实例 准备数据 查看数据 删除数据 区别 内部表&#xff1a;管理元数据&#xff08;记录数据的文件和目录的信息&#xff09;和数据。当删除内部表时&#xff0c;会删除数据和表的元数据&#xff0c;所以当多个表关…

LLM推理优化——KV Cache篇(百倍提速)

LLM推理优化——KV Cache篇&#xff08;百倍提速&#xff09; 注意&#xff1a;KV Cache本质上是空间换时间的技术。与计算机组成原理中的cache不同&#xff0c;它不涉及访存优化。 不知道大家在用LLM的时候&#xff0c;有没有注意到一个问题&#xff1a;我们在输入我们的问题…

vscode搭建rust开发环境

由于rustrover不是免费的&#xff0c;此处教学搭建一套基于vscode的rust开发环境&#xff0c;可运行&#xff0c;可调式 1.下载vscode1.91.1 Download Visual Studio Code - Mac, Linux, Windows 2.下载插件 打开网站下载插件 rust-analyzer-0.4.2049、vscode-lldb-1.10.0、…

java使用hutool工具判断ip或者域名是否可用,java使用ping判断ip或者域名是否可用

1.导入hutool的maven依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency>2.复制以下代码直接运行 import cn.hutool.core.net.NetUtil;public class …

论文解读:DiAD之SG网络

目录 一、SG网络功能介绍二、SG网络代码实现 一、SG网络功能介绍 DiAD论文最主要的创新点就是使用SG网络解决多类别异常检测中的语义信息丢失问题&#xff0c;那么它是怎么实现的保留原始图像语义信息的同时重建异常区域&#xff1f; 与稳定扩散去噪网络的连接&#xff1a; S…

将 magma example 改写成 cusolver example eqrf

1&#xff0c;简单安装Magma 1.1 下载编译 OpenBLAS $ git clone https://github.com/OpenMathLib/OpenBLAS.git $ cd OpenBLAS/ $ make -j DEBUG1 $ make install PREFIX/home/hipper/ex_magma/local_d/OpenBLAS/1.2 下载编译 magma $ git clone https://bitbucket.org/icl…

【Kubernetes】二进制部署k8s集群(中)之cni网络插件flannel和calico

&#xff01;&#xff01;&#xff01;继续上一篇实验部署&#xff01;&#xff01;&#xff01; 目录 一.k8s的三种网络模式 1.Pod 内容器与容器之间的通信 2.同一个 Node 内 Pod 之间的通信 3.不同 Node 上 Pod 之间的通信 二.k8s的三种接口 三.Flannel 网络插件 1.U…

美摄科技企业级视频拍摄与编辑SDK解决方案

在数字化浪潮汹涌的今天&#xff0c;视频已成为企业传递信息、塑造品牌、连接用户不可或缺的强大媒介。为了帮助企业轻松驾驭这一视觉盛宴的制作过程&#xff0c;美摄科技凭借其在影视级非编技术领域的深厚积累&#xff0c;推出了面向企业的专业视频拍摄与编辑SDK解决方案&…

每日OJ_牛客CM26 二进制插入

目录 牛客CM26 二进制插入 解析代码 牛客CM26 二进制插入 二进制插入_牛客题霸_牛客网 解析代码 m:1024&#xff1a;100000000 00 n:19 &#xff1a; 10011 要把n的二进制值插入m的第j位到第i位&#xff0c;只需要把n先左移j位&#xff0c;然后再进行或运算&#xff08;|&am…

高品质定制线缆知名智造品牌推荐-精工电联:高压线缆行业定制服务的领航者

定制线缆源头厂家推荐-精工电联&#xff1a;高压线缆行业定制服务的领航者 在当今这个高度信息化的社会&#xff0c;电力传输与分配系统的稳定运行至关重要。作为连接各个电力设备的纽带&#xff0c;高压线缆的质量直接关系到电力系统的安全性和稳定性。在定制高压线缆行业中&a…

android(安卓)最简单明了解释版本控制之MinSdkVersion、CompileSdkVersion、TargetSdkVersion

1、先明白几个概念 &#xff08;1&#xff09;平台版本&#xff08;Android SDK版本号&#xff09; 平台版本也就是我们平时说的安卓8、安卓9、安卓10 &#xff08;2&#xff09;API级别&#xff08;API Level&#xff09; Android 平台提供的框架 API 被称作“API 级别” …

Hugo 部署与自动更新(Git)

文章目录 Nginx部署Hugonginx.confhugo.conf Hugo自动更新Hugo自动更新流程添加访问令牌添加web hookrust实现自动更新接口 Nginx部署Hugo nginx.conf user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid;even…