当前位置: 首页 > article >正文

IIC学习总结

一、基本概念

IIC(Inter-Integrated Circuit)其实是IICBus简称,所以中文应该叫集成电路总线,它是一种串行通信总线,使用多主从架构。

二、模块结构

I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。

三、功能特性

3.1.协议限制

  • 为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出
  • 总线空闲时,因各设备都是开漏输出,上拉电阻Rp使SDA和SCL线都保持高电平。任一设备输出的低电平都将使相应的总线信号线变低,也就是说:各设备的SDA是“与”关系,SCL也是“与”关系。
  • 只有在总线空闲的时候主机才可以启动传输。
  • 总线上允许连接的设备数以其电容量不超过400pF为限
  • SDA线上的数据在时钟“高”期间必须是稳定的,只有当SCL线上的时钟信号为低时,数据线上的“高”或“低”状态才可以改变
  • 数据传送具有应答是必须的。与应答对应的时钟脉冲由主控制器产生,发送器在应答期间必须下拉SDA线当寻址的被控器件不能应答时,数据保持为高并使主控器产生停止条件而终止传输
  • SCL线控制:SCL 线拉低是为了避免在接收时发生上溢错误以及在发送时发生下溢错误。在发送模式,当 TBE 和 BTC 被置位,发送器保持 SCL 线为低电平直到下一个发送数据写入传输缓冲区寄存器。在接收模式,当 RBNE 和 BTC 被置位,发送器保持 SCL线为低电平直到传输缓冲区寄存器里的数据被读出。

3.2.功能特性

  • 主从机之间的双向数据传输(半双工)。
  • 支持 7 位和 10 位的地址模式和广播寻址。
  • 支持 I2C 多主机模式。
  • 同一接口既可实现主机功能又可实现从机功能。
  • 支持标速模式(最高 100 kHz)和快速模式(最高 400 kHz)。 
  • 总线仲裁:两个主机可能在START信号的最短保持时间内,同时在总线上产生START信号,这种情况下需要仲裁来决定由哪个主机来完成传输。仲裁逐位进行,在每一位的仲裁期间,当SCL为高时,每个主机都检查SDA电平是否和自己发送的相同。仲裁的过程需要持续很多位。理论上讲,如果两个主机所传输的内容完全相同,那么它们能够成功传输而不出现错误。如果一个主机发送高电平但检测到SDA电平为低,则认为自己仲裁失败并关闭自己的SDA输出驱动,而另一个主机则继续完成自己的传输。
  • 时钟同步:SCL线和SDA线是各设备对应输出状态相“与”的结果,任一设备都可以用输出低电平的方法来延长SCL的低电平时间,以迫使高速设备进入等待状态,从而实现不同速度设备间的时钟同步。​​

        

四、通讯流程

4.1. 起始/停止信号

所有的数据传输起始于一个 START 结束于一个 STOP。
START 信号:在 SCL 为高时,SDA 线上出现一个从高到低的电平转换。

STOP 信号:在 SCL 为高时,SDA 线上出现一个从低到高的电平转换。

4.2. ACK/NACK

要求从机在接收到每一个字节后产生一个响应。因此,主机必须产生一个额外的时钟脉冲(第九个脉冲)用以和这个响应位相关联。从机在第9个时钟信号进行拉低回应,发出响应的从设备必须将SDA拉低并在时钟脉冲的高电平期间保持住。这表示该设备给出了一个ACK。如果它不拉低SDA线,就表示不响应(NACK)。


4.3. 数据传输

每个I2C设备(不管是微控制器,LCD驱动,存储器或者键盘接口)都通过唯一的地址进行识
别,根据设备功能,他们既可以是发送器也可作为接收器。

I2C从机检测到I2C总线上的START信号之后,就开始从总线上接收地址,之后会把从总线接收
到的地址和自身的地址进行比较
,当两个地址相同时,I2C从机将发送一个确认应答(ACK),并响应总线的后续命令:发送或接收所需数据。此外,如果软件开启了广播呼叫,则I2C从机始终对一个广播地址(0x00)发送确认应答。

I2C主机负责产生START信号和STOP信号来开始和结束一次传输,并且负责产生SCL时钟。

4.3.1. 7位地址读写

4.3.2. 10位地址写/读


http://www.kler.cn/a/372843.html

相关文章:

  • 【python】OpenCV—findContours(4.4)
  • SQL语言基础
  • echarts实现 水库高程模拟图表
  • Java多线程编程基础
  • 数据结构 ——— 二叉树的概念及结构
  • arcgis pro 3.3.1安装教程
  • CodeS:构建用于文本到 SQL 的开源语言模型
  • list类模拟实现
  • 从0学习React(7)
  • Maven(18)如何使用Maven打包项目?
  • 1通道10GSPS或2通道5G 14 bit数字化仪
  • 跟着小土堆学习pytorch(六)——神经网络的基本骨架(nn.model)
  • 命令如诗,步入Linux的晨曦:指令初学者的旅程(下)
  • 日期差值题目(也可能是最容易看懂的了)
  • UG NX二次开发(C#)-计算圆柱面与其他平面的夹角
  • 第十二课 Vue中的事件修饰符
  • ubuntu系统docker容器中的torch,使用宿主机的gpu
  • 如何将原本打开Edge呈现出的360浏览器,更换成原本的Edge页面或者百度等其他页面
  • JavaFX WebView + Vue初始化加载数据解决方案
  • 基于javaweb的流浪宠物管理系统的设计与实现源码(springboot)
  • 大数据-197 数据挖掘 机器学习理论 - scikit-learn 泛化能力 交叉验证
  • 视频设备一体化监控运维方案
  • openGauss开源数据库实战十四
  • Flink难点和高频考点:Flink的反压产生原因、排查思路、优化措施和监控方法
  • 性能测试——Jmeter实战
  • DAIN-SQL,DAIL-SQL,C3-SQL和 DIN-SQL 技术的理解和异同点