【esp32 项目】使用I2C第一篇——I2C的科普

news/2024/10/6 20:35:31

https://www.eepw.com.cn/zhuanlan/315431.html

 

天我们来玩儿I2C。

I2C概述

I2C全称是Inter-Integrated Circuit,是飞利浦半导体公司(06年迁移到NXP了)在1982年发明的,是使用非常广泛的一种通信协议,很多传感器、存储芯片、OLED等,都是在使用I2C。标准输出模式下能达到100kbps的传输速率,快速模式下能达到400kbps的传输速率,高速模式下能达到3.4Mbps,超高速下最快能达到5Mbps。

与UART一样,IIC仅用两条线在设备间通信:

image.png

 

SCL -- 时钟信号

SDA -- 数据信号

I2C主机与从机之间共享时钟信号,时钟始终由主机控制,总线下面可以挂多个设备,是一种同步,多主,多从,半双工的通信协议,下面我们简单介绍一下通信原理:

image.png

 

默认情况下,两条线都被上拉,SCL=1,SDA=1。

启动与停止信号:

通信开始,要先发开启动信号,结束的时候,要发送结束信号。

开始信号由主设备发出启动,具体为在SCL高电平期间,SDA从高电平切换到低电平;

停止信号由主设备发出结束,具体为在SCL高电平期间,SDA从低电平切换到高电平;

image.png

 

当然,在传输过程中,有时候需要更改数据方向,重新传输等,我们没必要发停止信号,直接重新发启动信号启动即可。

image.png

 

地址字节

我们的总线上可能挂很多从设备,在我们主设备发送了启动信号之后,总线上的从设备就都被“唤醒”了,等着主设备发送地址宠幸。所以这里有一个从机地址的概念,从机地址以8位字节发送的,MSB在前,最后一位表示接下来读或写,所以高7位构成了从机地址,也可以看出,同一个总线上,可以寻址128个从设备。

一旦从设备的地址匹配,就继续读取最后一位,低电平代表写入,高电平代表读取。其它从设备就忽略后面的数据。

ACK与NACK

在每个字节传输之后,接收设备发送一个应答信号,确认或者不确认,接收设备通过在SCL高电平期间,将SDA拉低生成一个确认信号ACK,拉高生成一个不确认信号NACK,这里ACK主要用于表示字节正确传输了,NACK表示数据传输有错误,需要从新发送。应答信号主设备,从设备都可以产生,比如,主设备从从设备读取最后一个字节的数据后,就要发送NACK结束传输。

image.png

 

数据信号

数据以8位字节格式传输,高字节在前,传输的字节数量没有限制,但是每个字节后面必须要有一个数据接收方产生的应答信号。传输过程中,SCL为低的时候,SDA数据可以改变,SCL为高的时候,SDA的数据必须稳定。

image.png

 

命令字节

当写入或读取从设备中特定寄存器时,主机首先要向已寻址的从机写入寄存器地址,其实也是一个数据字节,我们这里称之为命令字节。

写入设备

主设备在发出启动信号之后,紧着着发送要操作从设备的地址,最后一位为低电平表示接下来写入数据,然后在时钟信号下一位一位的写入数据,在从设备发出ACK应答之后,发送结束信号结束通信。

image.png

 

读取数据

主设备在发出启动信号之后,紧着着发送要操作从设备的地址,最后一位为高电平表示接下来读取数据,然后接管SDA数据线并在时钟的控制下向主设备发送数据,主设备同样要在每个字节接收完毕的时候发送ACK响应,当主设备不想接收的时候,就在最后一个字节接收后发送NACK响应,然后恢复对总线的控制并发送结束信号。

SCL的控制权始终在主机这里。

image.png

 

当然,实际还要很多组合传输协议,这里由于篇幅问题就不展开说了,基本上大同小异,我们根据不同设备的数据手册来传输就可以啦。I2C还有很多特性,快速命令,仲裁,多主控等等,普通的应用接触不到,感兴趣的小伙伴自行研究下。

 

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

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

相关文章

第一篇 LeetCode(42)接雨水

LeetCode(42)接雨水 力扣官网 题目描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以…

【算法学习】圆方树——处理仙人掌的利器

圆方树大概分两种,一个是圆方树,一个是广义圆方树。 圆方树 这可以解决仙人掌上的问题。任意一条边至多只出现在一条简单回路的无向连通图称为仙人掌。很多题解将其作为无向图构建,本文将其构建为外向树,在这个问题中两种构建方式不会影响求解。 构建方式 记读入的图为原图…

kettle从入门到精通 第六十七课 ETL之kettle 再谈kettle阻塞,阻塞多个分支的多个步骤

场景:ETL沟通交流群内有小伙伴反馈,如何多个分支处理完毕之后记录下同步结果呢?或者是调用后续步骤、存储过程、三方接口等。 解决:使用步骤Blocking step进行阻塞处理即可。1、 如下流程图中利用Blocking step步骤同时阻塞【模拟表输出1】和【模拟表输出2】两个步骤,只有…

高考假+端午 集训

相当不充实的集训6.5 whk ? 水 本来是今天开始集训的来着 但是要去看牙,所以能多待一天 🥰 一年了,终于把被我妈爆破的电脑整好了 (原因是更新没空间了) 但是重置前让我体验一下米哈游的新启动器,我就下了 整完后把原下回来发现新启动器没了,恼了( 早上睡得晚了,我爸…

如何查看网络连接人数?为你介绍三种方法

方法一:通过命令提示符查看1. 打开命令提示符(Windows键+R键,输入cmd并回车)。2. 在命令提示符窗口中输入“netstat -an”命令,并按回车键执行。3. 观察输出的信息,找到本地地址和外部地址对应的TCP和UDP连接数。4. 根据连接数可以大致判断当前网络连接的人数。方法二:通…

SpringBoot 使用 Zookeeper 实现分布式锁

之前的博客介绍过 zookeeper 的分布式锁,只不过是基于 Spring 的实现(技术太老了),现在肯定使用 SpringBoot 进行实现,因此有必要再写一篇博客。 有关 zookeeper 的部署,以及分布式锁细节,这里不再赘述,可以访问我之前编写的博客。 zookeeper 的单机和集群部署:https:…

openwrt扩容相关

硬件:R2S 固件:openwrt(QiuSimons/YAOF) A:最近给R2S换了个带Docker的固件,目前大多数固件刷完之后都会多出一堆空闲空间。如何把这些空间给overlay和/opt/docker扩容? Q:系统->启动项->本地启动脚本 在 exit 0 前面加入脚本强行挂载mount /dev/mmcblk0p3 /opt/d…

LeetCode 974 Subarray Sums Divisible by K All In One

LeetCode 974 Subarray Sums Divisible by K All In One LeetCode 974 能被 K 整除的子数组之和LeetCode 974 Subarray Sums Divisible by K All In OneLeetCode 974 能被 K 整除的子数组之和errosfunction subarraysDivByK(nums: number[], k: number): number {// -5 / 0 / 5…