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

news2025/4/27 5:37:53

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.coloradmin.cn/o/1959615.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Django5】模型定义与使用

系列文章目录 第一章 Django使用的基础知识 第二章 setting.py文件的配置 第三章 路由的定义与使用 第四章 视图的定义与使用 第五章 二进制文件下载响应 第六章 Http请求&HttpRequest请求类 第七章 会话管理&#xff08;Cookies&Session&#xff09; 第八章 文件上传…

【ai】 2005年 rule based expert system学习笔记1

PPT 是2005年的? Negnevitsky, Pearson Education 使用两种推理引擎的选择 backward chaining(逆向链接)推理过程 backward chaining(逆向链接)推理过程的GPT解释 这幅图展示了一个基于规则的专家系统如何通过backward chaining(逆向链接)推理过程来达到最终的推理目标…

[tomato]靶机复现漏洞详解!

靶机地址&#xff1a; https://download.vulnhub.com/tomato/Tomato.ova 靶机环境&#xff1a;Vmware 网络&#xff1a;NAT模式 信息收集&#xff1a; arp-scan -l 扫描靶机ip地址 扫描开放的端口信息 nmap -sS -sV -p- 192.168.77.135 发现开放端口21&#xff…

Matplotlib柱形图大揭秘:让数据‘站’起来,比增高鞋垫还管用!

1. Matplotlib绘制柱形图/柱状图/条形图 柱状图是一种用矩形柱来表示数据分类的图表&#xff0c;柱状图可以垂直绘制&#xff0c;也可以水平绘制&#xff0c;它的高度与其表示的数据成正比关系 # 导包 import numpy as np import pandas as pd import matplotlib.pyplot as p…

黑马Java零基础视频教程精华部分_9_面向对象进阶(1)

系列文章目录 文章目录 系列文章目录一、static(表示静态) 是Java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量1、静态变量2、静态变量底层原理3、static静态方法4、工具类、测试类、Javabean类5、static注意事项从代码层面从内存层面 6、重新认识main方法…

[ WARN:0@0.014] global loadsave.cpp:248 cv::findDecoder imread_

[ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 目录 [ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…

网工必装软件,SecureCRT从零到精通,不可错过

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 中午好&#xff0c;我的网工朋友。 相信在平时的日常工作中&#xff0c;大家经常需要通过安全的方式远程访问各种设备和服务。SecureCRT作为一款强…

JavaWeb的三层架构和分层解耦

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;JavaWeb关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 三层架构 分层解耦 三层架构是哪三层&#xff1f; Controller:表现层…

云微客短视频矩阵能带来流量吗?有哪些产品特色?

短视频平台&#xff0c;现如今已经成为了互联网最大的流量池&#xff0c;诸如抖音、快手、小红书、视频号、哔哩哔哩等平台&#xff0c;日活量都在上亿。短视频赛道汇聚了无数的用户群体&#xff0c;所以商企品牌的营销定位就应该在这里。 许多企业看到了这样的营销商机&#x…

AI绘画模型之:CLIP 与 DALL-E 2

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

自动驾驶:SLAM

什么是SLAM SLAM&#xff0c;即Simultaneous Localization and Mapping&#xff08;同时定位与地图构建&#xff09; 最早由Smith、Self和Cheeseman于1988年提出。是自动驾驶领域中的一项核心技术。它允许自动驾驶车辆在使用各种传感器&#xff08;如激光雷达、摄像头、IMU等&…

计算机毕业设计选题推荐-服装生产管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

大模型开闭源之争,本质是商业化的争夺

大模型从发展之初&#xff0c;即存在开源与闭源两条路线&#xff0c;孰优孰劣&#xff0c;也处于持续争论之中。2024年7月&#xff0c;在“2024世界人工智能大会”上&#xff0c;众多业内领军人物对大模型开闭源表达了针锋相对的观点。例如&#xff0c;百度创始人李彦宏站在闭源…

成功解决:java.security.InvalidKeyException: Illegal key size

在集成微信支付到Spring Boot项目时&#xff0c;可能会遇到启动报错 java.security.InvalidKeyException: Illegal key size 的问题。这是由于Java加密扩展&#xff08;JCE&#xff09;限制了密钥的长度。幸运的是&#xff0c;我们可以通过简单的替换文件来解决这个问题。 解决…

LeetCode 17.电话号码的字母组合 C++写法

LeetCode 17.电话号码的字母组合 C写法 思路&#x1f9d0;&#xff1a; 使用深度优先搜索递归进行解题。首先建立一个号码与字母的映射表&#xff0c;当接收传过来的号码字符串时减去字符0就可以拿到该号码。其次使用string存储当前号码所对应字母&#xff0c;然后for循环遍历字…

用Java手写jvm之尝试解析clazz文件内容

写在前面 源码 。 本文尝试来解析下class文件的内容&#xff0c;了解了class文件内容后&#xff0c;对我们提升java认知将会带来很大的帮助&#xff0c;有多大呢&#xff0c;不好说&#xff0c;总之很大很大&#xff0c;大到受不了&#x1f60d;&#x1f60d;&#x1f60d;。 …

安泰高压放大器在工业领域中的应用

高压放大器是一种在工业领域中发挥重要作用的电子设备&#xff0c;其功能是将低电压信号放大到更高的电压水平。这种设备在多个工业应用中都发挥着关键作用&#xff0c;提供了稳定、可调节的高电压输出。以下是高压放大器在工业领域中的主要应用&#xff1a; 1.精密仪器和实验室…

尚硅谷电商实时数仓笔记-《二》数仓建模概述

上一篇&#xff1a; 尚硅谷电商实时数仓笔记-《一》数仓概述-CSDN博客 二、数仓建模概述 2.1 数据仓库建模的意义 如果把数据看作图书馆里的书&#xff0c;我们希望看到它们在书架上分门别类地放置&#xff1b; 如果把数据看作城市的建筑&#xff0c;我们希望城市规划布局合理…

面试官没想到一个ArrayList,我都能跟他扯半小时

点赞再看&#xff0c;Java进阶一大半 南哥在stackoverflow社区看到14年前的这么一个问题&#xff1a;Java 的 Vector.add() 和 Vector.addElement() 有什么区别&#xff0c;大家有答案吗&#xff1f; 它们实际上没有区别&#xff01;&#xff01;&#xff01;1996年的JDK 1.0版…

每日一题,力扣leetcode Hot100之56. 合并区间

解题思路&#xff1a; 先按照每个数组的第一个数字sort排序。 每次进来一个数组&#xff0c;如果你的第1项大于别人的第2项&#xff0c;那么直接添加。 否则的话则存在可以合并的区间&#xff0c;然后合并的区间的第2项则为旧的和新的第2项的最大值。 class Solution:def m…