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

IIC协议详解

文章目录

    • 1 IIC简介
    • 2 IIC物理层
      • 2.1 IIC硬件
      • 2.2 IIC协议特点
    • 3 IIC协议层
    • 4数据传输
      • 4.1 IIC写数据
      • 4.2 IIC读数据

1 IIC简介

  IIC(Inter-Integrated Circuit)总线是一种由 NXP(原 PHILIPS)公司开发的两线式串行总线, 用于连接微控制器及其外围设备。多用于主控制器和从器件间的主从通信,在小数据量场合 使用,传输距离短,任意时刻只能有一个主机等特性。
   在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
  PS: 这里要注意 IIC 是为了与低速设备通信而发明的,所以 IIC 的传输速率比不上 SPI。
图1
             图1 IIC总线物理拓扑图

2 IIC物理层

2.1 IIC硬件

  IIC有两条总线,一条双向的串行数据线SDA,一条串行时钟线SCL。
  SDA(Serial data):串行数据线,用来传送数据;
  SCL(Serial clock line):时钟线,用来控制数据发送的时序。
  所有接到IIC总线上的设备的SDA线都接到总线的SDA上,各设备的时钟线SCL都接到总线的SCL上。IIC总线上的每一个设备都有一个唯一的地址,以确保不同设备之间的访问互不干扰。

2.2 IIC协议特点

  • IIC主设备(master):主要产生时钟,产生起始和结束信号;
  • IIC从设备(slave):可编程的IIC地址检测,停止位检测等;
  • 支持不同的通信速率(100KHz~400KHz);
  • SCL和SDA都需要接上拉电阻 (大小由速度和容性负载决定一般在3.3K-10K之间) 保证数据的稳定性,减少干扰;
  • IIC是半双工,而不是全双工,同一时间只可以单向通信。

物理层小结
  I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,SCL和SDA被上拉电阻Rp拉高,使SDA和SCL线都保持高电平。
  I2C通信方式为半双工,只有一根SDA线,同一时间只可以单向通信,SPI和uart通信为全双工。

3 IIC协议层

  • 开始信号(Start): SCL为高电平时,SDA由高电平向低电平跳变,标志着开始传输数据;

  • 结束信号(Stop): SCL为高电平时,SDA由低电平向高电平跳变,标志着结束传输数据;
    在这里插入图片描述
              图2 Start和Stop信号

  • 应答信号(ACK/NACK): 所有地址和数据都以8bit为单位传输,如果接受端正确接收了8bit数据,则回复一个bit的“0”信号——ACK信号,如果未正确接收8bit数据,或者接收端不再接受数据,则回复一个bit的“1”信号——NACK信号。即每8bit数据,就会跟1bit ACK/NACK信号。
    在这里插入图片描述
                     图3 ACK信号

  • 数据有效性: IIC信号在传输过程中,当SCL为高电平(SCL=1)时,数据线SDA必须保持稳定状态,不允许有电平跳变。只有当SCL处于低电平期间,SDA的高、低电平才可以交替变化。也就是说发送数据时,bit数据“0”和“1”的交替是发生在SCL的低电平期间。
    在这里插入图片描述
                   图4 IIC bit有效性

4数据传输

4.1 IIC写数据

在这里插入图片描述

                图5 IIC 写(发送)数据格式
字段解析
  Start: 数据传输的开始信号,由主机产生;
  Slave address: 标识从设备的地址,bit7~bit1;
  R/W: W(write)为主机向从机写数据,R(read)为主机向从机读数据,bit0;
  ACK: 主机读数据时,从机做接收,由从机产生ACK信号;
  Word Address: Slave设备内部的数据地址,即主机要往从机的这个地址写数据,上图中Word Address只体现了一个字节,实际上可以有多个字节。如访问8K bytes的 eeprom,就需要2个字节的Word Address来寻址;
  Data: 发送的数据,以字节为单位,每8bit数据,从设备回一个ACK信号;
  Stop: 数据传输的结束信号,由主机产生。

主机向从机写(发送)数据流程:
  1.主机首先产生START信号;
  2.然后紧跟着发送一个从机地址,这个地址共有7位,紧接着的第8位是数据方向位(R/W),
   0表示主机发送数据(写),1表示主机接收数据(读);
  3.主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,
    主机则认为自己正在被主机寻址,根据R/W位将自己确定为发送器和接收器;
   (注:不要把发送器/接收器主设备/从设备混淆,当主设备向从设备写数据的时候,主设备做发送器,
   从设备做接收器;当主设备向从设备读数据的时候,主设备做接收器,从设备做发射器)
  4.这时候主机等待从机的应答信号(ACK);
  5.当主机收到应答信号时,发送要访问从机的哪个地址, 继续等待从机的应答信号;
  6.当主机收到应答信号时,发送N个字节的数据,继续等待从机的N次应答信号;
  7.主机产生停止信号,结束传送过程。

4.2 IIC读数据

在这里插入图片描述
                图6 IIC 读(接收)数据格式
字段解析:
  Start: 数据传输的开始信号,由主机产生;
  Slave address: 标识从设备的地址,bit7~bit1;
  R/W: W(write)为主机向从机写数据,R(read)为主机向从机读数据,bit0;
  ACK: 正式接收数据后的ACK信号由主机产生。Data传输前的ACK信号由从机产生,因为Data传输前都是
     主机在给从机“写”数据;
  Word Address: Slave设备内部的数据地址,即主机要往从机的这个地址数据,上图中Word Address只体现了一个字节,实际上可以有多个字节。如访问8K bytes的 eeprom,就需要2个字节的Word Address来寻址;
  RS: restart信号,表现形式和start信号完全一样。只是在读的过程中,再次触发了一次start信号,所以我们称之为restart;
  Data: 接收的数据,以字节为单位,每8bit数据,主设备(接收器)回一个ACK信号;
  NACK: 当主机读完指定长度的数据时,会在最后一个byte接收完成后,产生一个NACK信号;
  Stop: 数据传输的结束信号,由主机产生。

主机向从机读(接收)数据流程:
  主机向从机读数据实际上分了两个步骤,一是把需要希望从从机的哪个地址(Word Address)读数据,通过“写”(W)的方式告诉从机;然后再次发送读(R)信号,这时从机才开始给主机发送信号。
1.主机首先产生START信号;
2.然后紧跟着发送一个从机地址,注意此时该地址的R/W位为0,表明是向从机写命令,
 通知从机,主机要读的地址;
3.这时候主机等待从机的应答信号(ACK);
4.当主机收到应答信号时,发送要访问的地址,继续等待从机的应答信号;
5.当主机收到应答信号后,主机要改变通信模式(主机将由发送变为接收,从机将由接收变
 为发送)所以主机重新发送一个开始start信号,然后紧跟着发送一个从机地址,注意此时该地址的R/W位为1,表明将
 主机设置成接收模式开始读取数据;
6.这时候主机等待从机的应答信号,当主机收到应答信号时,就可以接收n个字节的数据,
当接收完成后,主机发送非应答信号(NACK),表示不再接收数据;
7.主机进而产生停止信号,结束传送过程。

相关文章:

  • javaIO流05:FileReader和Filewriter
  • 【PTHREAD】线程创建
  • s19.基于 Kubernetes v1.25.0(kubeadm) 和 Docker 部署高可用集群(一)
  • 力扣记录:Hot100(4)——75-101
  • 数据结构之——OJ题环形队列实现详解
  • 基于樽海鞘群算法的线性规划求解matlab程序
  • qt自定义控件之TextEdit
  • 深度估计 双目深度估计+单目深度估计 ONNX运行程序
  • Express 路由
  • 2022蓝帽杯初赛电子取证
  • 数据结构与算法复习:第三十六弹
  • CSS - 响应式布局(一)媒体查询
  • 【JAVA预备】课程目录
  • 2022年0902Maven的依赖学习<第四课>
  • Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Angular数据绑定机制
  • DataBase in Android
  • javascript从右向左截取指定位数字符的3种方法
  • java概述
  • js对象的深浅拷贝
  • SQL 难点解决:记录的引用
  • SQLServer之创建显式事务
  • unity如何实现一个固定宽度的orthagraphic相机
  • vue-router的history模式发布配置
  • 阿里云应用高可用服务公测发布
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 大整数乘法-表格法
  • 将回调地狱按在地上摩擦的Promise
  •  一套莫尔斯电报听写、翻译系统
  • scrapy中间件源码分析及常用中间件大全
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (ibm)Java 语言的 XPath API
  • (js)循环条件满足时终止循环
  • (TOJ2804)Even? Odd?
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (小白学Java)Java简介和基本配置
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)大型网站架构演变和知识体系
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .axf 转化 .bin文件 的方法
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .Net6 Api Swagger配置
  • .NET关于 跳过SSL中遇到的问题
  • .net开发时的诡异问题,button的onclick事件无效
  • .net中调用windows performance记录性能信息
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [AIGC] Redis基础命令集详细介绍