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

[I2C]I2C通信协议详解(一) --- 什么是I2C

[I2C]I2C通信协议详解(一) --- 什么是I2C

       摘要:内部集成电路 (I2C) 总线是一种两线串行接口,最初由菲利普斯公司开发,用于消费产品。 它是一种双向总线,可在任何 IC 工艺(NMOS、CMOS、双极)中轻松实现,并允许简单的 IC 间通信。 通过使用串行数据线 (SDA)、串行时钟线 (SCL) 和公共地线来承载所有通信,可以最大限度地减少连接。 I2C 已获得广泛认可,甚至已作为 I2C 子集的系统管理总线 (SMBus) 的原型。

一、设计

       I2C 通信协议遵循主/从层次结构,其中主设备定义为为总线提供时钟、寻址从设备以及向从设备中的寄存器写入或读取数据的设备。 从设备是仅在主设备通过其唯一地址询问时才做出响应的设备。 因此,必须避免从站之间的地址重复。 从站从不启动数据传输。

       I2C 总线仅使用两条双向线,串行数据线 (SDA) 和串行时钟线 (SCL)。 I2C 兼容设备通过集电极开路或漏极开路引脚连接到总线,这些引脚将线路拉低。 当I2C没有数据传输时,总线处于HIGH状态空闲; 线被被动拉高。

       通过拉低和释放高来切换线路来进行传输。 位在时钟下降沿计时。 标准数据传输速率为 100kbits/s,而快速模式传输速率为 400kbits/s。

       I2C 总线可以支持多个设备,包括 SLAVE 和 MASTER,唯一的限制是总线上的电容 (400pF) 和地址空间(128 个唯一地址),因为添加了更多设备。

二、数据传输协议

       I2C 数据包以 8 位字节排列,包括从机地址、寄存器号和要传输的数据。 总线上的传输是读操作或写操作。 读写协议建立在一系列子协议之上,例如开始和停止条件、重复的起始位、地址字节、数据传输位和确认/不确认位。

三、开始与结束条件

       顾名思义,开始条件总是在传输开始时出现,并由主设备启动。 这样做是为了唤醒总线上空闲的 SLAVE 设备。 这是 SCL 为高电平时允许 SDA 线改变状态的两次之一。 为了表示开始条件,SDA 线从高状态转换为低状态,而 SCL 为高。

 

       与开始条件类似,停止条件发生在数据传输结束时,也是由 MASTER 生成的。 这表示传输结束,是一个命令告诉从设备它们应该回到空闲状态,释放 SDA 线并且不再在总线上发送任何数据。 这是在 SCL 为高电平时允许 SDA 线更改状态的第二个实例。 SDA 线从低电平转换到高电平状态,而 SCL 为高电平,表示停止条件。

       在所有其他条件下,SDA 线仅在 SCL 线为低电平时更改状态。

四、重复启动

       在传输期间可以重复开始条件,而无需首先以停止条件终止。 这是一种特殊情况,称为重复启动,用于更改数据传输方向、重复传输尝试、同步多个 IC,甚至控制串行存储器。

 

五、地址字节

       从机地址以 8 位字节格式发送,MSB 在前,但最后一位表示事务是读取还是写入从机。实际上,高 7 位构成从地址,而第 8 位用作 READ/WRITE# 命令位。因此,有一个由 128 个唯一地址组成的地址空间,用于寻址多达 128 个从站。很多时候。

       例如,在启动条件之后,MASTER 发送一个地址字节,该地址字节对应于总线上 SLAVE 设备的唯一地址。总线上的每个设备都有自己的固定地址或编程地址。 I2C 总线上的 SLAVE 通过主动监听发送的第一个字节的前 7 位来响应启动命令。如果前 7 位与 SLAVE 设备的地址匹配,则继续读取地址字节的第 8 位(READ/WRITE# 位)。所有其他 SLAVE 设备忽略事务的其余部分。 READ/WRITE# 位中的低电平表示 MASTER 将向寻址的 SLAVE 设备写入数据,而对于高电平,MASTER 将从 SLAVE 设备读取数据。一旦地址字节已被相应的 SLAVE 读取,它将通过在相邻时钟高电平脉冲周期内将 SDA 拉低来发送确认位来确认此传输,然后根据 READ 承担从机发送器或从机接收器的角色/WRITE# 位已发送。

       从这一点开始,除非发送停止位,否则 SLAVE 假定由于它已经被寻址,所有通信都指向它。

六、Acknowledge and Not Acknowledge Bits (ACK/NACK)

       作为反馈的一种形式,在每个字节传输之后,接收设备发送一个确认或不确认位。 接收器通过在 SCL 高电平期间将 SDA 线保持为低电平来生成一个确认位,而当接收器离开 SDA 线被动拉高且不以任何方式响应时,将生成一个非确认位。 这一事实意味着,为了响应地址字节,所有不匹配的 SLAVE 都会通过不响应来发送 Not Acknowledge 位。

       ACK 用于表示一个字节(地址或数据)已成功传输和接收,并且传输可以继续到下一个字节传输、停止条件或重复开始(图 4)。 接收端通常使用 NACK 来指示数据传输中某处是否发生错误。 这用于向发送设备发出信号以立即终止传输或通过发送重复开始来进行另一次尝试。

       MASTER 还将在它想要从 SLAVE 读取的传输的最后一个字节之后发送 NACK,以指示 SLAVE 应该停止传输。 

七、数据位

       数据位(SDA)对实际传输数据进行编码,以 8 位字节格式传输,从 MSB 开始,每个位与时钟信号(SCL)同步。 传输中的字节数没有限制,但每个字节后面必须有一个由数据接收者生成的确认。

 

       对于位传输,SDA 线上的数据必须在高时钟周期内保持稳定。 只有当时钟信号为低电平时,才允许数据线有一个高电平或低电平的跳变。 因此,接收器在 SCL 为高电平时读取数据线上的数据位,而发送器在 SCL 为低电平时断言每个新数据位。

八、命令字节

       当写入或读取 SLAVE 中的特定寄存器时,主机必须首先通过在 SLAVE 被寻址后写入寄存器地址来指向特定寄存器。 虽然寄存器地址可以被认为是一个数据字节,但为了避免混淆,它通常被归类为命令字节。 例如,请参见图 6 和图 7。

九、写入设备

       图 6 显示了一个 MASTER 发送器寻址并将数据写入一个 7 位地址的 SLAVE 接收器。 发送的第一位是启动通信的 START 位。 地址字节跟随在随后的时钟脉冲上。 此时,总线上的所有 SLAVE 设备都在侦听它们的设备地址,该地址构成地址字节的前 7 位。 找到地址匹配的 SLAVE 设备继续侦听最后一位(READ/WRITE# 位)以了解主设备是要从从设备读取还是向其写入。 所有其他 SLAVE 设备通过发送 NACK 来忽略进一步的通信,根据定义,这不会做任何事情。

       响应识别其地址和写入命令,被寻址设备通过发送确认位 (ACK) 作为对主设备的响应,即总线上存在具有正确地址的从设备并等待进一步通信。 MASTER 然后通过以字节格式发送数据来继续数据传输。 如果 MASTER 正在写入 SLAVE 设备中的特定寄存器,则它会在发送数据之前写入相应的命令字节。 在每个字节传输之后,SLAVE 通过发送 ACK 进行响应。 一旦 MASTER 完成传输所有数据,它会通过发送 STOP 条件终止传输。 

十、从设备读取数据

       图 7 显示了一个 MASTER 寻址一个 SLAVE 并尝试从中读取数据。 传输由 MASTER 再次以 START 条件启动,之后在后续时钟脉冲上传输地址。 寻址设备通过读取 READ/WRITE 位继续侦听传输,并以确认位响应。 一旦 SLAVE 发送确认,它就接管 SDA 的控制并向 MASTER 发送数据。 为响应每个发送的字节,MASTER 发送一个确认位。 当 MASTER 不再想要接收数据时,它会在它希望接收的最后一个字节之后以 NACK 响应,然后恢复对总线的控制并发送 STOP 条件以结束传输。

       请注意,虽然 SDA 线的控制从 MASTER 传递到 SLAVE 并返回,但 SCL 线始终在控制 MASTER,即数据始终由 MASTER 输入和输出。

 

十一、结合传输协议

       可以组合不同变体的读取和写入协议来执行一些复杂的 I2C 事务。 MASTER 可以写入,然后从同一个从设备读取,或者在单个 I2C 事务中提供一个新地址以与不同的 SLAVE 设备通信,数据可能会改变方向,使得正在写入的设备现在正在读取数据。所有这些都是通过使用重复启动位来完成的。

       例如,可以命令作为能量监视器的 LTC2946 从特定寄存器输出数据。这需要 I2C 事务首先寻址 LTC2946,发送命令字节(包含要读取的特定寄存器地址的数据字节),执行重复启动,再次发送器件地址并设置 READ 位,然后读出数据。在这个事务中,首先主控器写入 LTC2946,告诉它它想从哪个寄存器读取数据,然后当主控器执行重复启动并在从地址字节中设置 READ 位时,数据的方向流发生了变化。图 8 摘自 LTC2946 数据表,显示了这种通用协议。

 上表中:

  • S = Start Bit
  • P = Stop Bit
  • R = Read Bit
  • W\ = Write Bit
  • A = Acknowledge
  • A\ = Not Acknowledge

 

       图 9 显示了在 LTC2946 中写入寄存器的示例。 在启动条件之后,发送设备地址,然后将命令字节写入从机(注意 READ/WRITE# 位)。 一旦从机确认,数据将写入从机。 

       同样,图 10 展示了一个示例,其中主设备写入两个不同的从设备。 

十二、未涉及的内容

       还有其他 I2C 协议,例如快速命令、扩展地址模式、仲裁、多主机和时钟延长,我们在本文中没有涉及。 这些主题超出了本博文的讨论范围,并且不需要开始与支持 I2C 的 LTC 设备进行通信。 

相关文章:

  • 寄——在外拼搏的你一路平安,早日团圆
  • C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)
  • 【手把手带你学JavaSE】第八篇:抽象类和接口
  • 18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家
  • 广播解决方案:Livemind Recorder:录音机
  • 罗克韦尔AB PLC(RSLogix 5000)在线修改程序的具体方法示例
  • 2020 关于Map Map,String> Map,Object>的简单使用
  • 2019蓝桥杯省赛---java---C---5(最大降雨量)
  • 一键下载小说(二):如何在Django中部署
  • Java线程基础-CountDownLatch-批量执行多线程完成,再由主线程发起
  • 语音信号处理:torchaudio库【STFT、Spectrogram、MelSpectrogram、MFCC、LFCC】
  • 顶级接口Collection
  • ERP采购管理 金蝶
  • 【Linux】系统安装
  • 微服务项目:尚融宝(9)(后端接口:统一返回结果)
  • GitUp, 你不可错过的秀外慧中的git工具
  • hadoop集群管理系统搭建规划说明
  • JAVA_NIO系列——Channel和Buffer详解
  • mysql innodb 索引使用指南
  • React as a UI Runtime(五、列表)
  • springboot_database项目介绍
  • vue-router的history模式发布配置
  • Vue组件定义
  • 笨办法学C 练习34:动态数组
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 异步
  • 用mpvue开发微信小程序
  • 移动端高清、多屏适配方案
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • (02)vite环境变量配置
  • (分布式缓存)Redis持久化
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (四)模仿学习-完成后台管理页面查询
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)基于IDEA的JAVA基础1
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .Net MVC + EF搭建学生管理系统
  • .NET 回调、接口回调、 委托
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • @private @protected @public
  • []Telit UC864E 拨号上网
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [CISCN2019 华东南赛区]Web4
  • [Excel] vlookup函数
  • [github全教程]github版本控制最全教学------- 大厂找工作面试必备!
  • [HackMyVM]靶场 VivifyTech
  • [HAOI2016]食物链
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页
  • [JS]JavaScript 简介
  • [LeeCode]—Wildcard Matching 通配符匹配问题