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.mzph.cn/web/9048.shtml

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

相关文章

ElasticSearch 与 OpenSearch:拉开性能差距

Elasticsearch 与 OpenSearch&#xff1a;扩大性能差距 对于任何依赖快速、准确搜索数据的组织来说&#xff0c;强大、快速且高效的搜索引擎是至关重要的元素。对于开发人员和架构师来说&#xff0c;选择正确的搜索平台可以极大地影响您的组织提供快速且相关结果的能力。在我们…

揭秘抖音快速涨10000粉的方法:巨量千川投流让你轻松快速增粉

抖音已经成为了当今社交平台的热门之一&#xff0c;而如何快速涨粉已经成为了很多人关注的焦点。本文将揭秘一种高效的方式——巨量千川投流&#xff0c;通过官方真实流量和真实粉丝&#xff0c;每天快速涨关注&#xff0c;实现快速增粉1000~10万。 巨量千川投流是一种专业的抖…

必读干货!国内验证签发的SSL证书六大优势

JoySSL官网 注册码230918 国内验证签发的SSL证书&#xff0c;作为网络安全基础设施的重要组成部分&#xff0c;对于维护互联网数据安全、保障用户隐私、提升网站信誉度具有不可小觑的作用。特别是在当前数字化转型加速、数据合规要求日益严格的背景下&#xff0c;选择国内验证签…

路由的基本使用

目录 一、VueRouter介绍 二、VueRouter的使用 三、注意 一、VueRouter介绍 VueRouter是Vue官方的一个路由插件&#xff0c;是一个第三方包。 作用&#xff1a;修改地址栏路径时&#xff0c;切换显示匹配的组件 官网:Vue Router (vuejs.org) 二、VueRouter的使用 注意&am…

Vue 3.3 编译宏 vue3.3新增了一些语法糖和宏,包括泛型组件、defineSlots、defineEmits、defineOptions

Vue 3.3新增了一些语法糖和宏&#xff0c;包括泛型组件、defineSlots、defineEmits、defineOptions defineProps 父组件传参 <template><Child name"my"></Child> </template> <script setup lang"ts"> import Child fro…

Linux学习笔记4---点亮LED灯(汇编裸机)

本系统学习利用的是正点原子的阿尔法mini开发板&#xff0c;本系列的学习笔记也是按照正点原子的教程进行学习&#xff0c;但并不是利用虚拟机进行开发&#xff0c;而是使用Windows下的子系统WSL进行学习。 因为 Cortex-A 芯片一上电 SP 指针还没初始化&#xff0c;C 环境还没准…

【C++】零钱兑换的始端---柠檬水找零

欢迎来CILMY23的博客 本篇主题为 零钱兑换的始端---柠檬水找零 个人主页&#xff1a;CILMY23-CSDN博客 个人专栏系列&#xff1a; Python | C | C语言 | 数据结构与算法 感谢观看&#xff0c;支持的可以给个一键三连&#xff0c;点赞关注收藏。 前言&#xff1a; 柠檬水找…

嘴尚绝卤味:传承经典,缔造美食新风尚

卤味&#xff0c;作为中国传统美食的代表之一&#xff0c;历经千年的传承与发展&#xff0c;早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代&#xff0c;嘴尚绝卤味凭借其独特的口感和精湛的工艺&#xff0c;成为卤味市场中的佼佼者&#xff0c;引领着卤味文化的新潮流…

图数据库 之 Neo4j 与 AI 大模型的结合绘制知识图谱

引言 随着信息时代的到来&#xff0c;海量的文本数据成为了我们获取知识的重要来源。然而&#xff0c;如何从这些文本数据中提取出有用的信息&#xff0c;并将其以可视化的方式展示出来&#xff0c;一直是一个具有挑战性的问题。近年来&#xff0c;随着人工智能技术的发展&…

MyBatis认识

一、定义 MyBatis是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;Plain Old Java O…

【热门话题】ElementUI 快速入门指南

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ElementUI 快速入门指南环境准备安装 ElementUI创建 Vue 项目安装 ElementUI 基…

SpringBoot之远程调用的三大方式

为什么要使用远程调用&#xff1f; SpringBoot不仅继承了Spring框架原有的优秀特性&#xff0c;而且还通过简化配置来进一步简化了Spring应用的整个搭建和开发过程。在Spring-Boot项目开发中&#xff0c;存在着本模块的代码需要访问外面模块接口&#xff0c;或外部url链接的需求…

Golang 开发实战day13 - Reciver Functions

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day13 - 接收…

第42天:WEB攻防-PHP应用MYSQL架构SQL注入跨库查询文件读写权限操作

第四十二天 一、PHP-MYSQL-SQL注入-常规查询 1.PHP-MYSQL-Web组成架构 MySQL(统一管理) ​ root&#xff08;自带默认&#xff09; ​ 网站A testA ​ 网站B testB MySQL(一对一管理) ​ testA用户 ​ 网站A testA ​ testB用户 ​ 网站B testB access无数据库用户 m…

三勾软件 / 三勾点餐系统门店系统,java+springboot+vue3

项目介绍 三勾点餐系统基于javaspringbootelement-plusuniapp打造的面向开发的小程序商城&#xff0c;方便二次开发或直接使用&#xff0c;可发布到多端&#xff0c;包括微信小程序、微信公众号、QQ小程序、支付宝小程序、字节跳动小程序、百度小程序、android端、ios端。 在…

LVS 负载均衡部署 NAT模式

一、环境准备 配置环境&#xff1a; 负载调度器&#xff1a;配置双网卡 内网&#xff1a;172.168.1.11(ens33) 外网卡&#xff1a;12.0.0.1(ens37)二台WEB服务器集群池&#xff1a;172.168.1.12、172.168.1.13 一台NFS共享服务器&#xff1a;172.168.1.14客户端&#xff…

Android的NDK开发中Cmake报缺少对应的x86的so文件

需要实现一个串口操作的命令。 供应商提供了2个so文件。 分别是 armeabi-v7a 和 arm64-v8a 添加到对应的cpp下。 在CMakeLists.txt里添加so文件 # 添加预编译的库 add_library(libxxx SHARED IMPORTED)# 设置库的路径 set_target_properties(libxxx PROPERTIES IMPORTED_…

springboot和html学院教务管理系统

端口号根据你实际运行程序的端口号来 访问地址&#xff1a;localhost:8080 学生 : student1 123456 管理员&#xff1a;admin 123456 老师&#xff1a;2020001 123456 sys_user 表是账号和密码

隔离流量优化网络传输

不要将长流和短突发流(或者大象流和老鼠流)混部在一起&#xff0c;我建议用切片或虚通道将它们在全链路范围彻底隔离&#xff0c;而不仅仅在交换机上配合着大肆宣讲的高端包分类算法配置一些排队调度。 也不必扯泊松到达&#xff0c;帕累托分布&#xff0c;这些概念在论文建模…

Flutter笔记:Widgets Easier组件库(13)- 使用底部弹窗

Flutter笔记 Widgets Easier组件库&#xff08;13&#xff09;使用底部弹窗 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this …