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

I2C知识大全系列二 —— I2C硬件及时序

I2C硬件接口

I2C的数据(SDA)和时钟(SCL)信号都是双向的,通过电流源或上拉电阻接到电源,VDD大小取决于I2C设备接口的耐压能力。两根线都为高时,总线处于空闲状态(IDLE)。I2C接口的特殊构造以实现“线与”功能,即每个信号接口都分为输出的漏极开路(或集电极开路)和输入缓冲器部分。

I2C硬件连接示意图如下所示:

 

线与功能

漏极开路/集电极开路的特点是不能输出高电平,必须通过外接上拉输出高电平。如果总线上有任何一个设备接口输出低电平,则整个总线的状态表现为低电平,由此实现I2C总线信号的“线与”功能。

“线与”功能的好处在于可以实现总线的仲裁控制。总线的控制权会交给最后一个输出低电平的设备,其它设备(输出为高)通过检测总线上的电平状态(表现为低),对比与自己输出状态不一致,则自动退出对总线的控制请求。

漏极开路/集电极开路的缺点是对于一个距离长的数据线,信号传输速率得不到有效保证。更长的走线对于输出驱动器表现为更大的容性负载,等效容性负载C和信号线的上拉电阻R构成RC振荡器。RC越大,意味着反射和振荡越强,从而影响总线的信号完整性。这也是I2C规范对总线电容值约束在400pf以内的原因。高速模式(Hs)对信号完整性的要求更高,协议有定义相关SDA/SCL处理办法,以保证在数据线够长、速率够高时,信号完整性也可以得到满足。

主从与收发

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件。在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。

1)如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送。

2)如果主机要接收从器件的数据,首先由主机寻址从器件。然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下,主机负责产生定时时钟和终止数据传送。

数据有效性

每传输一比特数据SDA,对应产生一个时钟脉冲SCLSCL为高时,SDA不允许变化;只有在SCL为低时,SDA才可以变化如下图所示:

开始和结束条件

开始条件(S):SCL为高时,SDA由高变低

结束条件(P):SCL为高时,SDA由低变高

开始/结束条件总是由主机(Master)发起的。主机发出开始条件(START)后,总线处于忙状态主机发出结束条件(STOP后,总线处于空闲状态

在操作中,如果主机发出重复开始条件(repeated STARTSr而非结束条件(STOP),则总线仍处于忙的状态。也就是说,重复开始条件(Sr)和开始条件(S)在功能上是相同的。在本文(协议)中,除非特别说明,开始条件和重复开始条件统一表述为S

I2C总线的数据传输

SDA上传输字节数据必须8比特长度,每次传输不限定传输的字节数。每个字节(8位)数据传送完毕后紧接着应答信号(第9位,Acknowledge Bit)。数据传输过程中,发送高位MSB),发送低位LSB)。如果在数据传输过程中,从机如果没有准备好接收或发送下一个字节(比如内部中断需要处理等),它可以通过拉SCL强制主机进入等待状态。直到从机释放SCL,主机才开始下一个字节的发送或接收。如下图所示:

应答与非应答

协议规定数据传输过程必须包含应答。接收器通过应答(1 bit)通知发送的字节已被成功接收,发送器可以进行下一个字节的传输。主机产生数据传输过程中的所有时钟,包括应答的第9个时钟。发送器在应答时钟周期内释放SDA的控制,这样接收器可以通过将SDA拉低通知发送器数据已被成功接收。如下图所示:

应答

SCL为高的时候,SDA数据才是有效的,因此接收器发送ACK时,要保证SCL为高的同时,SDA为低电平;建立和保持时间也要满足规范要求。如果在第9个时钟周期,SDA为高,表明接收器无应答(NACK),主机可以据此发出结束条件(STOP)命令结束此次传输,或发起重传请求(repeated START)重新传输数据。

无应答

5种情况可能导致无应答(NACK):

  • 总线上没有对应地址的接收器件
  • 接收器件没有准备好与主机的通信
  • 接收器件无法解析读取的数据
  • 接收器件无法收取更多的数据
  • 主机作为接收器(Master-Receiver)时,在读取从机(Slave-Transmitter)发出的最后一个字节数据后,发出NACK通知从发送器释放数据线SDA,以便主机发起结束(STOP)或重传(Sr)指令

相关文章:

  • Python基础入门(持续更新中)
  • 【预测模型-SVM预测】基于粒子群算法结合支持向量机SVM实现Covid-19风险预测附matlab代码
  • 初阶数据结构 二叉树常用函数 (二)
  • 【正点原子I.MX6U-MINI应用篇】4、嵌入式Linux关于GPIO的一些操作
  • 【C语言】解题训练
  • 【蓝桥杯国赛真题04】python输出平方 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • RabbitMQ 集群部署及配置
  • python @classmethod详解
  • JSP超市管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
  • FreeRTOS 软件定时器的使用
  • 软件测试培训到底值不值得参加?
  • IIC通信协议
  • FUP AMD300-27便携式拉曼食品安全分析仪 检测微痕量农兽药残留 非法添加
  • 高被引论文有什么特征?
  • fetch 从初识到应用
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • JavaScript 一些 DOM 的知识点
  • JavaScript实现分页效果
  • PHP的Ev教程三(Periodic watcher)
  • 分布式任务队列Celery
  • 警报:线上事故之CountDownLatch的威力
  • 微服务核心架构梳理
  • 用简单代码看卷积组块发展
  • C# - 为值类型重定义相等性
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (pojstep1.3.1)1017(构造法模拟)
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)apringboot计算机专业大学生就业指南 毕业设计061355
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)iOS字体
  • (转)Sublime Text3配置Lua运行环境
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .bat批处理(一):@echo off
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net CHARTING图表控件下载地址
  • .net core 依赖注入的基本用发
  • [100天算法】-每个元音包含偶数次的最长子字符串(day 53)
  • [1127]图形打印 sdutOJ
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [BUUCTF]-Reverse:reverse3解析
  • [C++]命名空间等——喵喵要吃C嘎嘎
  • [C++核心编程](四):类和对象——封装
  • [CSS] 点击事件触发的动画
  • [c语言]小课堂 day2
  • [dart学习]第四篇:函数
  • [DEBUG] spring boot-如何处理链接中的空格等特殊字符
  • [Django 0-1] Core.Email 模块
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包