I2C 应用编程

news2024/11/20 8:42:19

1. I2C 框架结构

1.1 I2C 硬件框架

I2C 总线拓扑图

在一个芯片 (SoC) 内部,有一个或多个 I2C 控制器
在一个 I2C 控制器上,可以连接一个或多个 I2C 设备
I2C 总线只需要 2 条线:时钟线 SCL 数据线 SDA
I2C 总线的 SCL SDA 线上,都有上拉电阻

1.2 I2C 软件框架

I2C 接口的存储设备 AT24C02 为例:

APP
        ◼ 提出要求:把字符串 "www.100ask.net" 写入 AT24C02 地址 16 开始的地方
        ◼ 它是大爷,不关心底层实现的细节
        ◼ 它只需要调用设备驱动程序提供的接口
AT24C02 驱动:
        ◼ 它知道 AT24C02 要求的地址、数据格式
        ◼ 它知道发出什么信号才能让 AT24C02 执行擦除、烧写工作
        ◼ 它知道怎么判断数据是否烧写成功
        ◼ 它构造好一系列的数据,发给 I2C 控制器
I2C 控制器驱动
        ◼ 它根据 I2C 协议发出各类信号: I2C 设备地址、 I2C 存储地址、数据
        ◼ 它根据 I2C 协议判断

1.3 我们讲什么

1.3.1 对于 Linux I2C 结构

从上到下:
先讲 I2C 协议
APP 可以通过两类驱动程序访问设备
        ◼ I2C 设备自己的驱动程序
        ◼ 内核自带的 i2c-dev.c 驱动程序,它是 i2c 控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
I2C Device Driver
        ◼ I2C 设备自己的驱动程序
        ◼ 内核自带的 i2c-dev.c 驱动程序,它是 i2c 控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)
I2C Controller Driver
        ◼ 芯片 I2C 控制器的驱动程序 ( 称为 adapter)
        ◼ 使用 GPIO 模拟的 I2C 控制器驱动程序 (i2c-gpio.c)

1.3.2 对于单片机/裸机

从上到下:
先讲 I2C 协议
APP
I2C Device Driver
I2C Controller Driver( 也被称为 adapter)

2 I2C 协议

2.1 硬件连接

        I2C 在硬件上的接法如下所示,主控芯片引出两条线 SCL,SDA 线,在一条 I2C 总线上可以接很多 I2C 设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。

2.2 传输数据类比

        怎么通过 I2C 传输数据,我们需要把数据从主设备发送到从设备上去,也需要把数据从从设备传送到主设备上去,数据涉及到双向传输。
        举个例子:         

        体育老师:可以把球发给学生,也可以把球从学生中接过来。
发球:
        ◼ 老师:开始了 (start)
        ◼ 老师: A !我要发球给你! ( 地址 / 方向 )
        ◼ 学生 A :到! ( 回应 )
        ◼ 老师把球发出去(传输)
        ◼ A 收到球之后,应该告诉老师一声(回应)
        ◼ 老师:结束(停止)
接球:
        ◼ 老师:开始了 (start)
        ◼ 老师: B !把球发给我! ( 地址 / 方向 )
        ◼ 学生 B :到!
        ◼ B 把球发给老师(传输)
        ◼ 老师收到球之后,给 B 说一声,表示收到球了(回应)
        ◼ 老师:结束(停止)
我们就使用这个简单的例子,来解释一下 IIC 的传输协议:
老师说开始了,表示开始信号 (start)
老师提醒某个学生要发球,表示发送地址和方向 (address/read/write)
老师发球 / 接球,表示数据的传输
收到球要回应:回应信号 (ACK)
老师说结束,表示 IIC 传输结束 (P)

2.3 IIC 传输数据的格式

2.3.1 写操作

主芯片要发出一个 start 信号
然后发出一个设备地址 ( 用来确定是往哪一个芯片写数据 ) ,方向 ( / 写, 0 表示写,1 表示读 )
从设备回应 ( 用来确定这个设备是否存在 ) ,然后就可以传输数据
主设备发送一个字节数据给从设备,并等待回应
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成 ) ,然后再传输下一个数据。
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示 " " ,灰色背景表示 " "

2.3.2 读操作

流程如下:
主芯片要发出一个 start 信号
然后发出一个设备地址 ( 用来确定是往哪一个芯片写数据 ) ,方向 ( / 写, 0 表示写,1 表示读 )
从设备回应 ( 用来确定这个设备是否存在 ) ,然后就可以传输数据
从设备发送一个字节数据给主设备,并等待回应
每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成 ) ,然后再传输下一个数据。
数据发送完之后,主芯片就会发送一个停止信号。
下图:白色背景表示 " " ,灰色背景表示 " "

3 I2C 信号

        I2C 协议中数据传输的单位是字节,也就是 8 位。但是要用到 9 个时钟:前面 8 个时钟用来传输 8 数据,第 9 个时钟用来传输回应信号。传输时,先传输最高位(MSB)
开始信号( S ): SCL 为高电平时, SDA 由 高电平向低电平跳变,开始传送数据。
结束信号( P ): SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。
响应信号 (ACK) :接收器在接收到 8 位数据后,在第 9 个时钟周期,(从设备)拉低 SDA
SDA 上传输的数据必须在 SCL 为高电平期间保持稳定, SDA 上的数据只能在SCL 为低电平期间变化
        I2C 协议信号如下(前半部分数据是发送地址位和方向,后半部分是数据,发送原理一样):

        在 SCL 为高电平时,SDA 拉高,读取到 1;在SCL为高电平时,SDA拉低,读取到0。

4 协议细节

如何在 SDA 上实现双向传输?
        ◼ 主芯片通过一根 SDA 线既可以把数据发给从设备,也可以从 SDA 上读取数据,连接 SDA 线的引脚里面必然有两个引脚(发送引脚 / 接受引脚)。
主、从设备都可以通过 SDA 发送数据,肯定不能同时发送数据,怎么错开时间?在 9 个时钟里:
        ◼ 前 8 个时钟由主设备发送数据的话,第 9 个时钟就由从设备发送数据;
        ◼ 前 8 个时钟由从设备发送数据的话,第 9 个时钟就由主设备发送数据。
双方设备中,某个设备发送数据时,另一方怎样才能不影响 SDA 上的数据?
        ◼ 设备的 SDA 中有一个三极管,使用开极 / 开漏电路 ( 三极管是开极, CMOS 管是开漏,作用一样) ,如下图:

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

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

相关文章

tamcat乱码

学习springmvc时tamcat乱码 ①、启动时tomcat控制台乱码 解决方法是:1、先把idea设置里的默认字节码改成utf-8 ​ 2、把idea显示编码改成utf-8,在末尾加上( -Dfile.encodingUTF-8) ​ 3、最后重启idea 加上这个 -Dfile.encodingU…

外贸获客怎么做?有哪些技巧?

外贸获客是许多企业拓展海外市场的关键一环,为了成功地吸引潜在客户,我们需要了解一些基本的获客技巧,本文将分享一些实用的方法和技巧,帮助您在外贸领域获得更多的客户。 一、了解目标客户 在开展外贸业务之前,了解…

保研毕业论文查重率多少通过【保姆教程】

大家好,今天来聊聊保研毕业论文查重率多少通过,希望能给大家提供一点参考。 以下是针对论文重复率高的情况,提供一些修改建议和技巧: 保研毕业论文查重率多少通过 在保研过程中,毕业论文的查重率是衡量学术诚信和论文…

【Maven教程】(十二):版本管理 ——版本号定义约定及相关概念,自动化版本发布与创建分支,GPG签名 ~

Maven 版本管理 1️⃣ 版本管理的概念2️⃣ Maven 的版本号定义约定3️⃣ 主干、标签与分支4️⃣ 自动化版本发布5️⃣ 自动化创建分支6️⃣ GPG签名6.1 GPG 及其基本使用6.2 Maven GPG Plugin 🌾 总结 一个健康的项目通常有一个长期、合理的版本演变过程。例如JUn…

Vue H5项目,怎么引入uni.webview sdk,调用uni postMessage实现手机蓝牙连接打印功能(uniapp)

前言 目前公司Vue H5项目,用webview打包成APP,现产品提出这样打包出来的app运行较慢,需要用uniapp方式(即使用HBuilder编辑器来打包H5)来打包,那需要的基座就不是安卓的基座而是uniapp的基座,而…

如何通过内网穿透工具实现任意浏览器远程访问Linux本地zabbix web管理界面

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

GD32F30X-RT-Thread学习-线程管理

1. 软硬件平台 GD32F307E-START Board开发板MDK-ARM Keil 2.RT-Thread Nano 3.RT-Thread 内核学习-线程管理 ​ 在多线程操作系统中,可以把一个复杂的应用分解成多个小的、可调度的、序列化的程序单元,当合理地划分任务并正确地执行时,这…

我的acer电脑U盘装系统前BIOS设置及装系统过程中的操作

1、开机长按F2进入BIOS设置 2、使能F12 3、调整boot顺序,使USB启动的优先级最高 4、按F10保存退出 5、插入U盘开机,boot选择界面无需操作,等待几秒,默认进入U盘系统 由于既使能了F12,又将U盘的优先级进调整到了最高&…

三层交换原理

三层交换机出现的背景 早期的网络中一般使用二层交换机来搭建局域网,而不同局域网之间的网络互通由路由器来完成。那时的网络流量,局域网内部的流量占了绝大部分,而网络间的通信访问量比较少,使用少量路由器已经足够应付了。 但…

鸿蒙生态千帆起:从者众,行则远

“轻舟已过万重山”,鸿蒙的成长速度惊人,一定程度上打破了iOS和安卓二分天下的格局。短短四年时间,搭载华为鸿蒙系统的生态设备数已经突破7亿,开发者突破220万。据Counterpoint数据显示,华为HarmonyOS系统在中国的市场…

钓鱼网站域名识别工具dnstwist算法研究

先上一个AI的回答: dnstwist是一种钓鱼网站域名识别工具,可帮助用户识别和检测可能被恶意使用的域名。它通过生成类似的域名变体来模拟攻击者可能使用的钓鱼域名,并提供了一系列有用的功能和信息。 dnstwist能够生成一组类似的域名变体&…

Linux基础指令(2)

今天我们继续来学我们有关于Linux的指令,今天的指令要比上次多多了。开始我们的学习吧。 man手册 先来看标题,手册我们第一时间想到的就是手册的查阅功能,我们都知道在我们上小学的时候,如果遇到不会的字,我们会通过…

淘宝1688京东解析商品详情方法丨API接口指南及相关文档说明

要解析淘宝、1688和京东的商品详情,可以按照以下步骤进行: 获取API接口权限:首先,需要在对应的平台上申请API接口权限。这通常涉及到注册开发者账号,创建应用,并获取App Key和App Secret。编写API请求代码…

Docker build 无法解析域名

### 报错 Docker build 无法解析域名 报错:ERROR [ 2/12] RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 解决Docker build无法解析域名 # 追加到 etc/docker/daemon.json,注意JSON的格式 {"dn…

机器学习硬件十年:性能变迁与趋势

本文分析了机器学习硬件性能的最新趋势,重点关注不同GPU和加速器的计算性能、内存、互连带宽、性价比和能效等指标。这篇分析旨在提供关于ML硬件能力及其瓶颈的全面视图。本文作者来自调研机构Epoch,致力于研究AI发展轨迹与治理的关键问题和趋势。 &…

设计模式-门面模式(Facade)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、定义二、结构 前言 在组件构建过程中,某些接口之间直接依赖会带来很多问题,甚至无法直接实现。采用一层间接接口,来隔离…

Appium 并行测试多个设备

一、前置说明 在自动化测试中,经常需要验证多台设备的兼容性,Appium可以用同一套测试运例并行测试多个设备,以达到验证兼容性的目的。 解决思路: 查找已连接的所有设备;为每台设备启动相应的Appium Server&#xff1b…

URL提示不安全

当用户访问一个没有经过SSL证书加密的网站(即使用HTTP而不是HTTPS协议),或者SSL证书存在问题时,浏览器URL会显示不安全提示。这些提示旨在保护用户免受潜在的恶意活动,并提醒他们谨慎对待这些不安全的网站。那么该如何…

28. Python Web 编程:Django 基础教程

目录 安装使用创建项目启动服务器创建数据库创建应用创建模型设计路由设计视图设计模版 安装使用 Django 项目主页:https://www.djangoproject.com 访问官网 https://www.djangoproject.com/download/ 或者 https://github.com/django/django Windows 按住winR 输…

Python中的并发编程(3)线程池、锁

concurrent.futures 提供的线程池 concurrent.futures模块提供了线程池和进程池简化了多线程/进程操作。 线程池原理是用一个任务队列让多个线程从中获取任务执行,然后返回结果。 常见的用法是创建线程池,提交任务,等待完成并获取结果&…