I2C基础协议详解

  串口是传感器、外设常用的接口,在低速器件中可以通过串口传输数据。高速复杂的器件,往往内部存在很多寄存器,这些寄存器的配置一般也是采用串口通信,可以节省IO口。

  常用串口大致分为UART、IIC、SPI三种,其中IIC时序稍微复杂,却是最好用的串行接口。如下图所示,主机通过两根数据线,就可以与多个外设通信。

在这里插入图片描述

图1 主机控制多个外设

  主机想要通过UART与N个外设双向通信,一般需要2*N个IO口。主机想要通过SPI与N个外设双向通信,一般需要使用N+3个IO口。而如果使用IIC接口,那么只需要2个IO口。
  因此IIC对于节省IO有较大优势,劣势在于UART可以全双工通信,SPI的时钟线与数据线分开,传输速度最快,且UART和SPI的驱动设计一般比较简单。而IIC由于只靠两根线驱动多个传感器,所以需要确认主机与哪个传感器建立连接(传输器件地址),然后在对器件内部寄存器进行读写,导致通信速度不可能很高。

1、I2C硬件接口

  IIC主机或者从机的硬件接口如下图所示,使用一个开漏/开集(如果是MOS管则漏极开路,如果是三极管则集电极开路)开路,在同一条线上有一个输入缓冲区,允许数据线用于双向传输数据。

在这里插入图片描述

图2 IIC硬件接口

  三角形代表输入缓冲器,准确的说该接口只能通过FET输出低电平,高电平依靠外部上拉电阻完成。

  下图是该接口输出低电平的信号示意图,当需要输出低电平时,FET导通,VBUS下拉与GND连接,此时总线呈现低电平,如图中红色部分。

在这里插入图片描述

图3 输出低电平

  当从机或主机希望发送逻辑高电平时,只能通过关闭下拉场效应管来释放总线。使得总线浮动,上拉电阻将把电压拉到电压轨,表现为高电平。

在这里插入图片描述

图4 输出高电平

2、I2C通信

  IIC总线是一个标准的双向接口,除非从机已被主机寻址,否则从机不能传输数据。IIC总线上的每个设备都有一个特定的设备地址,以区分同一IIC总线上的其他设备。 许多从设备在启动时需要配置来设置设备的行为,通常是在主机访问从机的内部寄存器时完成。

  物理IIC接口由串行时钟(SCL)和串行数据(SDA)线组成,SDA和SCL线路都必须通过上拉电阻连接到VCC。 只有当总线空闲时才可以开始数据传输,如果SDA和SCL线在停止条件后都为高电平,则总线空闲。

  先总体看下经典的IIC读、写器件寄存器时序,然后在具体分析起始位、停止位、应答、传输数据的SCL和SDA波形。

  下图是主机通过IIC写从机寄存器数据的步骤,首先主机向从机发送起始位,然后发送7位从机器件地址,之后会发送一位读写操作信号,从机应答主机(ACK为低电平)后,向从机发送寄存器地址(这个寄存器地址为8位,但是有的器件可能会有16位或者24位寄存器地址,就需要发送三次这种时序)。等待从机应答之后,主机把需要写入寄存器的数据输出,等待从机应答后,主机发送停止条件,结束本次通信。注意不管是器件地址还是寄存器地址,亦或者是数据,都是先传输高位数据。

在这里插入图片描述

图5 IIC主机向从机寄存器写入数据

  上图中灰色方块表示主机发送数据,白色表示从机发送数据。

  下图是主机通过IIC读取从机寄存器数据的步骤,主机依次向从机发送起始位、器件地址、寄存器地址,等待从机应答之后,在次向从机发送起始信号,然后发送器件地址,此时读写位位高电平,表示读出数据,然后从机就会把该器件该寄存器地址的数据依次输出,数据接收完成后,主机向从机发送不应答指令(如果发送应答指令,则从机会把下个寄存器地址的数据继续输出到总线上,实现连续读取寄存器数据),然后发送停止位,完成寄存器数据的读取。

在这里插入图片描述

图6 IIC主机向从机寄存器读出数据

  上图中灰色方块表示主机发送数据,白色表示从机发送数据。

  在了解了读写寄存器的步骤后,在来查看IIC的一些细节时序,由于主机和从机都会在时钟SCL的高电平采集SDA的状态,因此在传输数据时,SDA在SCL的低电平的时候更新数据,在SCL高电平阶段尽量保持不变。

  只有两种情况,SDA会在SCL的高电平期间电平发生变化,即起始位和停止位,时序图如下所示:

在这里插入图片描述

图7 IIC通信的起始位和停止位时序图

  起始位:SCL为高电平,SDA从高电平变为低电平表示起始位(因为空闲时SDA是高电平,SDA变为低电平代表开始传输数据)。

  停止位:SCL为高电平时,SDA从低电平变为高电平表示停止位。

  重复起始条件(图6中红色字体的时序):时序与起始条件一样,用于代替连续的停止然后开始条件。当总线未空闲时,主机希望启动新的通信,但不希望发送停止信号释放总线,就可以直接发送重复起始条件,开启信号通信。 因为停止条件有可能使主机失去对总线的控制(在多主机环境中)。

  如图8所示,在SCL的每个时钟脉冲期间传输一个数据位,每次传输8位数据后需要从机应。8位数据可以是设备地址、寄存器地址,也可以是写入或读取从机的数据。

  数据首先传输最高有效位(MSB)。在START和STOP条件之间,可以将任意字节的数据从主机传输到从机。在传输数据过程中SDA必须在SCL低电平时更新状态,在SCL为高电平时SDA线上的数据必须保持稳定,因为当SCL高时,SDA的变化被解释为控制命令(START或STOP)。

在这里插入图片描述

图8 单字节数据传输时序图

  每个字节(包括地址字节)后面都有一个来自接收方的ACK位,ACK位允许接收方与发送方通信,表明该字节已成功接收,并且可以发送下一个字节数据。

  在接收方发送ACK之前,发送方必须释放SDA线。 如下图9所示,为了发送ACK位,接收方需要在ACK/NACK相关时钟周期(周期9)的低电平期间拉低SDA线,使SDA线在ACK/ NACK相关时钟周期的高相位稳定在低电平。设置和保持时间必须考虑在内。

在这里插入图片描述

图9 NACK波形

  当SDA在与ACK/NACK相关的时钟周期内保持高位时,则不应答(NACK)。 有几个条件会导致NACK的产生:

  1. 从机无法接收或发送,因为它正在执行一些实时功能,还没有准备好开始与主机通信。

  2. 在传输过程中,接收方接收到它不理解的数据或命令。

  3. 在传输过程中,接收方不能再接收任何数据字节。

  4. 主机读取从机寄存器数据后,通过NACK表示终止从机寄存器数据的读取。

3、总结

  IIC接口是开漏/开集输出的硬件接口,只能主动输出低电平。当需要输出高电平时,会释放总线(对外表现高阻态),被外部上拉电阻上拉到VCC,从而实现高电平,所以上拉电阻必须存在。

  SDA在传输数据时只能在SCL的低电平期间变化,如果SCL为高电平,SDA从高电平变为低电平,则表示起始位或者重复起始位,SDA从低电平变为高电平则便是停止位。

  每当传输一字节数据后,接收方需要产生一个应答位(ACK低电平表示应答),之后发送方才能传输下一字节数据。

  在起始位和停止位之间,可以传输任意字节数据,数据可以是器件地址、寄存器地址、写入或读取从机的数据。

  上述的总结来自于TI的IIC总线手册,需要该手册的可以在公众号后台回复“IIC手册”(不包括引号)。

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

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

相关文章

unity学习案例总结

动态标签 GitHub - SarahMit/DynamicLabel3D: Simple dynamic labels for a 3D Unity scene

《乱弹篇(十三)明朝事儿》

2024年农历除夕夜,因追剧收看电视连续剧《后宫》而放弃了收看一年一度的《春晚》,至到春节(农历正月初一)晚才看完了《后宫》。 社交网站“必应”图片《后宫》 电视连续剧《后宫》, 讲的是明朝英宗末年的历史故事&…

【大厂AI课学习笔记】【1.5 AI技术领域】(10)对话系统

对话系统,Dialogue System,也称为会话代理。是一种模拟人类与人交谈的计算机系统,旨在可以与人类形成连贯通顺的对话,通信方式主要有语音/文本/图片,当然也可以手势/触觉等其他方式 一般我们将对话系统,分…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数,才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则:第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算,…

【制作100个unity游戏之25】3D背包、库存、制作、快捷栏、存储系统、砍伐树木获取资源、随机战利品宝箱1(附带项目源码)

效果演示 文章目录 效果演示系列目录前言人物和视角基本控制简单的背包系统和物品交互绘制背包UI脚本控制 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第25篇中,我们将…

【c++基础】扑克牌组合

说明 小明从一副扑克牌中(没有大小王,J认为是数字11,Q是12,K是13,A是1)抽出2张牌求和,请问能够组合出多少个不相等的数,按照由小到大输出这些数。 输入数据 第一行是一个整数n代表…

2-8 单链表+双链表+模拟栈+模拟队列

今天给大家用数组来实现链表栈和队列 单链表: 首先要明白是如何用数组实现, 在这里需要用到几个数组,head表示头节点的下标,e[i]表示表示下标为i的值,ne[i]表示当前节点下一个节点的下标。idx表示当前已经用到那个点…

抛弃Spring Cloud Gateway,得物 使用Netty架构100Wqps网关

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,很多小伙伴拿到一线互联网企业如阿里、网易、有赞、希音、百度、滴滴的面试资格。 最近,尼恩指导一个小伙伴简历,写了一个《高并发网关项目》,此项目帮这个小伙拿到 字节/阿里/…

线程池7个参数描述

所谓的线程池的 7 大参数是指&#xff0c;在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数&#xff0c;如以下源码所示&#xff1a; public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable&…

检查链表是否回文

根据回文对称的特点&#xff0c;不难想到将链表分成前后两部分&#xff0c;然后将其中一部分反转的方法。 可以使用快慢指针的方式找到链表的中点&#xff0c;其中快指针每次移动两步&#xff0c;慢指针每次移动一步。当快指针到达链表末尾时&#xff0c;慢指针指向的位置即为链…

[LeetCode周赛复盘] 第 384 场周赛20240211

[LeetCode周赛复盘] 第 384 场周赛20240211 一、本周周赛总结100230. 修改矩阵1. 题目描述2. 思路分析3. 代码实现 100219. 回文字符串的最大数量1. 题目描述2. 思路分析3. 代码实现 100198. 匹配模式数组的子数组数目 II1. 题目描述2. 思路分析3. 代码实现 参考链接 一、本周…

前端JavaScript篇之ajax、axios、fetch的区别

目录 ajax、axios、fetch的区别AjaxAxiosFetch总结注意 ajax、axios、fetch的区别 在Web开发中&#xff0c;ajax、axios和fetch都是用于与服务器进行异步通信的技术&#xff0c;但它们在实现方式和功能上有所不同。 Ajax 定义与特点&#xff1a;Ajax是一种在无需重新加载整个…

【c++基础】国王的魔镜

说明 国王有一个魔镜&#xff0c;可以把任何接触镜面的东西变成原来的两倍——只是&#xff0c;因为是镜子嘛&#xff0c;增加的那部分是反的。 比如一条项链&#xff0c;我们用AB来表示&#xff0c;不同的字母表示不同颜色的珍珠。如果把B端接触镜面的话&#xff0c;魔镜会把…

小游戏和GUI编程(5) | SVG图像格式简介

小游戏和GUI编程(5) | SVG图像格式简介 0. 问题 Q1: SVG 是什么的缩写&#xff1f;Q2: SVG 是一种图像格式吗&#xff1f;Q3: SVG 相对于其他图像格式的优点和缺点是什么&#xff1f;Q4: 哪些工具可以查看 SVG 图像&#xff1f;Q5: SVG 图像格式的规范是怎样的&#xff1f;Q6…

中文GPTS详尽教程,字节扣子Coze插件使用全输出

今天&#xff0c;斜杠君和大家分享如何在字节扣子Coze中创建插件&#xff0c;并在创建后如何使用这个插件。 01 新建插件 首先&#xff0c;进入到插件页面&#xff0c;创建一个插件。 https://www.coze.cn/home 点击左侧的个人空间。 在上面选择”插件“标签&#xff0c;来到…

精灵图,字体图标,CSS3三角

精灵图 1.1为什么需要精灵图 一个网页中往往会应用很多小的背景图像作为修饰&#xff0c;当网页中的图像过多时&#xff0c;服务器就会频繁的接受和发送请求图片&#xff0c;造成服务器请求压力过大&#xff0c;这将大大降低页面的加载速度。 因此&#xff0c;为了有效地减少…

《计算思维导论》笔记:10.4 关系模型-关系运算

《大学计算机—计算思维导论》&#xff08;战德臣 哈尔滨工业大学&#xff09; 《10.4 关系模型-关系运算》 一、引言 本章介绍数据库的基本数据模型&#xff1a;关系模型-关系运算。 二、什么是关系运算 在数据库理论中&#xff0c;关系运算&#xff08;Relational Operatio…

读书笔记之《运动改造大脑》:运动是最佳的健脑丸

《运动改造大脑》的作者是约翰•瑞迪&#xff08;John Ratey&#xff09; / 埃里克•哈格曼&#xff08;Eric Hagerman&#xff09;&#xff0c;原著名称为&#xff1a;Spark&#xff1a;the revolutionary new science of exercise and the brain&#xff0c;于 2013年出版约翰…

Shell脚本编程

文章目录 一、简介二、变量变量命名使用变量只读变量删除变量变量种类 三、数组四、算数运算五、条件测试数值测试字符串测试文件测试组合测试 六、选择执行七、用户交互read命令 八、循环语句for循环while循环until循环 九、函数十、调试脚本十一、环境配置bash配置文件案例&a…

服务器解析漏洞及任意文件下载

1.服务器文件解析漏洞 文件解析漏洞,是指Web容器&#xff08;Apache、nginx、iis等&#xff09;在解析文件时出现了漏洞,以其他格式执行出脚本格式的效果。从而,黑客可以利用该漏洞实现非法文件的解析。 &#xff08;1) Apache linux系统中的apache的php配置文件在/etc/apac…
最新文章