Linux下的I2C通信

I2C通信:


一.硬件初识:

IIC(inter-intergrated-Circu):内部集成总线

四线通讯:SCL,SDA,GND,VCC,串行,半双工

  1. I2C 总线是同步,串行,半双工通信总线。

  2. I2C 总线由时钟线 SDASCL 两根信号线构成。并且都有上拉电阻。确保总线空闲状态为高电平。

  3. I2C 总线支持多设备连接,允许多主机存在,但同一时刻只允许一台主机。

  4. 每一个I2C 外设都会对应一个唯一的地址(这个地址可以从 I2C 外设器件的数据手册中得知),主机和从机之间的通信就是通过这个地址来确定主机要和哪个从机进行通信的。

  5. I2C 总线上挂载的设备的数量受总线最大电容 400pF 限制。如果挂的是相同型号的器件还受到器件的地址限制。

  6. I2C 总线在标准模式下传输速率可达 100kbit/s,在快速模式下可达 400kbit/s,在高速模
    式下可达3.4Mbit/s

  7. I2C 总线上的主机和从机之间以字节(8位)为单位进行数据传输。

  8. I2C 有硬件12C 和软件 12C。

通讯时序:

高位先传输

I2C子系统框架:


驱动开发,只需实现设备驱动层的Client,和Driver即可:向内核中添加一个描述i2c外设资源的device部分,在driver中调用核心层的API实现I2C的通讯驱动

二.1. I2C_client部分:

用于描述一个I2c外设的资源,地址,GPIO,中断信息等等…表示通信的对象
向内核中添加一个client的方法可以是设备树或者使用c程序添加

设备树:
//挂载在i2c1设备控制器下
&i2c1{
   
//状态
    status = "okay";
//标签@地址
    myft5x06:my-ft5x06@38{
   
//配对属性
        compatible = "my-ft5x06";
//regI2c地址
        reg = <0x38>;


    };
}
c语言添加:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>



struct i2c_adapter *i2c_ada;
// 定义I2C设备信息,用于描述一个I2C设备的资源
struct i2c_board_info ft5x06[] = {
   
    {
   I2C_BOARD_INFO("my-ft5x06", 0x38)},
    {
   }
};

static int __init iic_device_init(void)
{
   
    i2c_ada = i2c_get_adapter(1); // 获取I2C适配器
    i2c_new_device(i2c_ada, ft5x06); // 创建设备
    i2c_put_adapter(i2c_ada); // 释放适配器
    return 0;
}

static void __exit iic_device_exit(void)
{
   
}

module_init(iic_device_init);
module_exit(iic_device_exit);
MODULE_LICENSE("GPL");t);
MODULE_LICENSE("GPL");

2. I2C_driver部分:

驱动框架:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/i2c.h>

int iic_driver_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
   

    return 0;
}
int iic_driver_remove(struct i2c_client *client)
{
   

    return 0;
}

// const struct of_device_id my_match_table[] ={
   
//     {.compatible = "my-ft5x06"},
//     {}
// }

const struct i2c_device_id *my_id_table[] = {
   
    {
   "my-ft5x06"},
    {
   }
} ;

struct i2c_driver my_iic_driver =
{
   
    .driver = {
   
        //.name用于和使用c注册的device名字作匹配
        .name = "my-ft5x06",
        .owner = THIS_MODULE,
        //.of_match_table用于匹配设备树中的节点
        // .of_match_table = my_match_table,
    },  
    .probe = iic_driver_probe, 
    .remove = iic_driver_remove,
    //.id_table和.name用于和使用c注册的device名字作匹配,优先使用table
    .id_table = my_id_table,
};

static int iic_driver_init(void)
{
   

    int ret = i2c_add_driver(&my_iic_driver); // 添加驱动程序

    if (ret < 0)
    {
   
        printk("i2c_add_driver failed\n");
    }
    return 0;
}
static void iic_driver_exit(void)
{
   

    i2c_del_driver(&my_iic_driver); // 删除驱动程序
}

module_init(iic_driver_init);
module_exit(iic_driver_exit);
MODULE_LICENSE("GPL");

3. 获取设备信息:

使用设备树与driver匹配成功后,执行probe函数->获取设备树中资源信息:补全probe函数功能功能:

struct gpio_desc *reset_gpio;
struct gpio_desc *irq_gpio;

// 中断处理函数
irqreturn_t ft5x06_handler(int irq, void *args)
{
   
    printk("ft5x06_handler\n");
    // 中断处理逻辑

    return IRQ_RETVAL(IRQ_HANDLED);//表示中断已经处理完毕
}

int iic_driver_probe(struct i2c_client *client, const struct i2c_device_id *id)
{
   
    int ret = 0;

    printk("iic_driver_probe\n");
    // 获取设备树中的节点信息
    // 获取复位引脚信息
    reset_gpio = gpiod_get_optional(&client->dev, "reset", 0);
    if (IS_ERR(reset_gpio))
    {
   
        printk("get reset gpio failed\n");
        return PTR_ERR(reset_gpio);
    }
    // 获取中断引脚信息
    irq_gpio = gpiod_get_optional(&client->dev, "irq", 0);
    if (IS_ERR(irq_gpio))
    {
   
        printk("get irq gpio failed\n");
        return PTR_ERR(irq_gpio);
    }
    // 复位设备
    gpiod_direction_output(reset_gpio, 0);
    mdelay(5);
    gpiod_direction_output(reset_gpio, 1);

    // 申请中断
    //  IRO_TYPE_EDGE_FALLING |IROF_ONESHOT:下降沿触发,中断可嵌套
    ret = request_irq(client->irq, ft5x06_handler, IRO_TYPE_EDGE_FALLING | IROF_ONESHOT, "ft5x06_irq", NULL);
    if (ret < 0)
    {
   
        printk("request_irq failed\n")

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

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

相关文章

四川古力未来科技抖音小店:安全便捷购物新体验

在这个数字化快速发展的时代&#xff0c;网络购物已经成为人们生活中不可或缺的一部分。四川古力未来科技抖音小店以其高度的安全性&#xff0c;为广大消费者提供了一个值得信赖的购物平台。在这里&#xff0c;我们可以享受到安全便捷的购物体验&#xff0c;畅游科技的海洋。 一…

java回调机制

目录 一、简介二、示例2.1 同步回调2.2 异步回调2.3 二者区别 三、应用场景 一、简介 在Java中&#xff0c;回调是一种常见的编程模式&#xff0c;它允许一个对象将某个方法作为参数传递给另一个对象&#xff0c;以便在适当的时候调用该方法。 以类A调用类B方法为例: 在类A中…

CTF-reverse,逆向分析,对“左移4或右移4,即(x<<4) | (x >>4)的加密探讨

博主在刷题过程中遇上这样一个有意思的加密&#xff08;如下图&#xff09;&#xff0c;苦苦思索其逆向运算&#xff0c;被硬控了很久&#xff0c;也没搜到什么资料来解释这个问题&#xff08;也许是太简单&#xff1f;&#xff1f;蒟蒻博主怀疑人生……&#xff09; 经过博主不…

2024最新版JavaScript逆向爬虫教程-------基础篇之无限debugger的原理与绕过

目录 一、无限debugger的原理与绕过1.1 案例介绍1.2 实现原理1.3 绕过debugger方法1.3.1 禁用所有断点1.3.2 禁用局部断点1.3.3 替换文件1.3.4 函数置空与hook 二、补充2.1 改写JavaScript文件2.2 浏览器开发者工具中出现的VM开头的JS文件是什么&#xff1f; 一、无限debugger的…

正点原子Linux学习笔记(七)在 LCD 上显示 png 图片

在 LCD 上显示 png 图片 21.1 PNG 简介21.2 libpng 简介21.3 zlib 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.4 libpng 移植下载源码包编译源码安装目录下的文件夹介绍移植到开发板 21.5 libpng 使用说明libpng 的数据结构创建和初始化 png_struct 对象创建…

win11个性化锁屏界面怎么关闭?

win11个性化锁屏界面关闭方法对于win11用户来说&#xff0c;关闭个性化锁屏界面是一个常见问题。本文将由php小编苹果详细介绍如何执行此操作&#xff0c;分步指导并提供操作截图。继续阅读以了解具体步骤。 win11个性化锁屏界面关闭方法 第一步&#xff0c;点击底部Windows图…

企信通_企信通短信群发平台

现代社会&#xff0c;随着互联网技术的快速发展&#xff0c;传统的营销方式已经无法满足企业对于市场开拓和客户沟通的需求。群发作为一种高效、低成本的营销手段&#xff0c;逐渐成为了众多企业的首选。而在众多群发平台中&#xff0c;嘀迈信息企信通公司凭借其稳定可靠的服务…

GM EPUB Reader Pro for Mac:专业电子书阅读工具

GM EPUB Reader Pro是一款适用于Mac的专业EPUB阅读软件。它为用户提供了优质的阅读体验和丰富的功能。 GM EPUB Reader Pro支持EPUB格式&#xff0c;这是一种广泛使用的电子书格式&#xff0c;常用于小说、教育书籍、期刊等。您可以通过该软件打开和阅读EPUB文件&#xff0c;享…

提取网页元数据的Python库之lassie使用详解

概要 Lassie是一个用于提取网页元数据的Python库,它能够智能地抓取网页的标题、描述、关键图像等内容。Lassie的设计目的是为了简化从各种类型的网页中提取关键信息的过程,适用于需要预览链接内容的应用场景。 安装 安装Lassie非常简单,可以通过Python的包管理器pip进行安…

WPS二次开发系列:一文快速了解WPS SDK功能场景

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 目录 SDK功能介绍 功能详解&#xff1a; 打开文档…

Windows系统完全卸载删除 Node.js (包含控制面板找不到node.js选项情况)

1.打开cmd命令行窗口&#xff0c;输入npm cache clean --force 回车执行 2.打开控制面板&#xff0c;在控制面板中把Node.js卸载 移除之后检查环境变量是否也移除&#xff1a;点击Path&#xff0c;点击编辑。 把环境变量中和node有关的全部移除&#xff0c;然后点击确定。 3.重…

WEB基础--JDBC基础

JDBC简介 JDBC概述 数据库持久化介绍 jdbc是java做数据库持久化的规范&#xff0c;持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备(断电之后&#xff0c;数据还在&#xff0c;比如硬盘&#xff0c;U盘)中以供之后使用。大多数情况下&#xff0c;特别是企业级…

Gartner发布准备应对勒索软件攻击指南:勒索软件攻击的三个阶段及其防御生命周期

攻击者改变了策略&#xff0c;在某些情况下转向勒索软件。安全和风险管理领导者必须通过提高检测和预防能力来为勒索软件攻击做好准备&#xff0c;同时还要改进其事后应对策略。 主要发现 勒索软件&#xff08;无加密的数据盗窃攻击&#xff09;是攻击者越来越多地使用的策略。…

SpringBoot启动流程分析之创建SpringApplication对象(一)

SpringBoot启动流程分析之创建SpringApplication对象(一) 目录&#xff1a; 文章目录 SpringBoot启动流程分析之创建SpringApplication对象(一)1、SpringApplication的构造方法1.1、推断应用程序类型1.2、设置Initializers1.3、设置Listener1.4、推断main方法所在类 流程分析…

Seata之XA 模式的使用

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Seata 是一款开源的…

计算机专业,求你别再玩了,我都替你们着急

明确学习目标和方向&#xff1a;确定自己希望在计算机领域的哪个方向深入发展&#xff0c;如前端开发、后端开发、数据库管理、人工智能等。根据目标方向&#xff0c;制定详细的学习计划&#xff0c;确保所学知识与未来职业方向相匹配。 【PDF学习资料文末获取】 扎实基础知识…

变配电工程 变配电室智能监控系统 门禁 视频 环境 机器人

一、方案背景 要真正了解无人值守配电房的运行模式&#xff0c;我们必须对“无人值守”这一概念有准确的理解。它并不意味着完全没有工作人员管理&#xff0c;而是通过技术设备和人机协作来确保配电房的正常运行。 利用变配电室智能监控系统&#xff0c;可以实时获得配电室各…

【优选算法】—Leetcode—11—— 盛最多水的容器

1.题目 11. 盛最多水的容器 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#…

滑动窗口详解

目录 一、滑动窗口的特定步骤&#xff1a; 二、题目解析 1、⻓度最⼩的⼦数组---点击跳转题目 3、最⼤连续 1 的个数 III----点击跳转题目 4、将 x 减到 0 的最⼩操作数----点击跳转题目 5、⽔果成篮----点击跳转题目 滑动窗口是双指针算法中细分的一种&#xff0c;它由暴…

【AutoGPT】踩坑帖(follow李鱼皮)

本文写于2024年5月7日 参考视频&#xff1a;AutoGPT傻瓜式使用教程真实体验&#xff01; 对应文章&#xff1a;炸裂的AutoGPT&#xff0c;帮我做了个网站&#xff01; 平台&#xff1a;GitPod 云托管服务 原仓库已经改动很大&#xff0c;应使用的Repo为&#xff1a;Auto-GPT-ZH…
最新文章