IIC协议

IIC(集成电路总线)协议

简介

串行通信总线,使用多主从架构 按位传输的串行半双工总线

功能概括

  • 只需要两条总线(都是双向的)
  • 没有严格的波特率要求
  • 所有组件之间都存在简单的主从关系,连接到总线的每个设备均可通过唯一地址进行软件寻址
  • IIC是真正的多主设备总线,可提供仲裁和冲突检测
  • 传输速度
    • 标准模式:Standard mode = 100kbps
    • 快速模式:Fast mode = 400kpbs
    • 高速模式:High speed mode = 3.4Mbps
    • 超快速模式:Ultra fast mode = 5Mbps
    • 一般由时钟的快慢调整传输速率,同时也要匹配合适的上拉电阻和电压
  • 最大设备数:无限制
  • 最大从机数:理论上为127

功能补充

  • 有的器件地址是外部引脚高低电平决定的,而有的是内部寄存器保存的,其地址可软件更改
  • 连接到总线上的器件数量只受到总线的最大电容400pF限制
  • 传输一位,对应一个时钟脉冲,注意IIC跟SPI不同,数据采样并不是在时钟的上升沿或下降沿采样,而是需要在SCL一个高电平期间SDA保持稳定为高或低,才有效
  • 虽说SCL上的时钟脉冲是由主机提供,但从机也有控制SCL的时候,有且仅有一种情况下从机会控制时钟,就是它忙的时候,会拉低SCL,表示忙,不能收发数据

硬件层

  • 仅需要一个SDA(串行数据线)SCL(串行时钟线)引脚 两条线都需要上拉电阻 设备间连接如图所示

image-20220411194000269

  • 可以将多个从机连接到一个主设备,也可以有多个主设备控制一个或多个从机

  • IIC总线内部都使用漏极开路驱动器(开漏驱动),因此可以被拉低为低电平,但是不能被驱动为高电平,所以需要上拉电阻,默认情况下将其保持在高电平。

    image-20220411194813503

    对于三极管集电极在芯片内部不接上拉电阻 称为OC输出,即集电极开路输出

    对于场效应管,是OD输出,即漏极开路输出

  • 上拉电阻的值取决于多种因素 公式如下

    image-20220411200024467

    • Vol 逻辑低电压 IoL 逻辑低电流 Tr 信号的最大上升时间 Cb 总线电容 VDD电源电压

      image-20220411200258970

      由上表知 **灌电流(外部电流通过引脚流向芯片内部)**最大值为3mA 规定逻辑低电压的最大值为0.4V

      所以知 若Vcc为5V,则所需电阻为1.53千欧 3.3V则需要967欧 若计算电阻比较麻烦 可以选择典型值4.7千欧

  • 灌电流

    • 当逻辑门输出端是低电平时,灌入逻辑门的电流称为灌电流,灌电流越大,输出端的低电平就越高
  • 当逻辑门输出端是高电平时,逻辑门输出端的电流是从逻辑门中流出,这个电流称为拉电流。拉电流越大,输出端的高电平就越低

上拉电阻 下拉电阻

详解

  • 上拉电阻

    • 把一个信号通过一个电阻接到高电平,用来拉高电平

    • 理论上可以拉高到电源电压

    • 上拉电阻大 上拉力度就小,三极管的电流就小,低功耗,反应速度慢,容易被干扰

  • 下拉电阻

    • 把一个信号通过一个电阻接到低电平(GND),用来拉低电平
    • 同样是电阻越大,拉力越小,容易被干扰

image-20220411203147987

数据传输协议

主设备和从设备进行数据传输时遵循以下协议格式。数据通过一条SDA数据线在主设备和从设备之间传输01的串行数据。串行数据序列的结构可以分为,开始条件,地址位,读写位,应答位,数据位,停止条件,具体如下所示

image-20220411204804365

开始条件

当主设备决定开始通讯时,需要发送开始信号,执行一下操作

  • 将SDA线从高电平切换到低电平(在SCL高电平的时候操作)
  • 再将SCL从高电平切换到低电平
  • 在主设备发送开始条件信号之后,所有从机即使处于睡眠模式也将变为活动状态,并等待接收地址位
  • image-20220411204339173
  • image-20220411222955295

空闲状态

双高电平时为空闲状态

IIC设备被要求连接到总线的输出端必须是漏极开路(OD)输出或集电极开路(OC)输出,再看下图:IIC设备1和2,A或C处的漏极开路,在不导通时由上拉电阻拉高SCL总线的电平,但如果任意一个导通就会拉低整个SCL总线的电平,B和D同理,所以只能规定高电平时为空闲状态了。也就是所谓的:各设备的SDA是“与”的关系,SCL也是“与”的关系

image-20220411223438826

地址位

通常地址位占7位数据,主设备如果需要向从机发送/接收数据,首先要发送对应从机的地址,然后会匹配总线上挂载的从机的地址(IIC还支持10位寻址)

读写位

指定数据的传输方向(0发1收)

  • 如果主设备需要将数据发送到从设备,则该位设置为0
  • 如果主设备需要接收从设备的数据,则将其设置为1

ACK/NACK

主机每次发送完数据之后会等待从设备的应答信号ACK

  • 在第9个时钟信号,如果从设备发送应答信号ACK,则SDA会被拉低
  • 若没有应答信号NACK,则SDA会输出为高电平,这过程会引起主设备发生重启或者停止
  • NOT ACK一般在什么时候用呢?在“主机-接收器”接收数据时,接收完数据想通知“从机-发送器”释放SDA线时,会回复NACK,“从机-发送器”收到NACK后就会释放SDA,从而允许主机产生一个停止条件或重复起始条件
  • image-20220411205930899

数据块

  • 传输的数据总共有8位,由发送方设置,它需要将数据位传输到接收方。

  • 发送之后会紧跟一个ACK / NACK位,如果接收器成功接收到数据,则设置为0。否则,它保持逻辑“ 1”。

  • 重复发送,直到数据完全传输为止。

停止条件

当主设备决定结束通讯时,需要发送开始信号,需要执行以下动作

  • 先将SDA线从低电压电平切换到高电压电平(在SCL为高电平时切换SDA的电平)
  • 再将SCL线从高电平拉到低电平

实际的工作过程

  1. 起始条件

    主设备通过将SDA线从高电平切换到低电平,再将SCL线从高电平切换到低电平,来向每个连接的从机发送启动条件

  2. 发送从设备地址

    主设备向每个从机发送要与之通信的从机的7位或10位地址,以及相应的读/写位 如图所示

image-20220411214053648

  1. 接收应答

    每个从设备将主设备发送的地址与其自己的地址进行比较。如果地址匹配,则从设备通过将SDA线拉低一位以表示返回一个ACK位

    如果来自主设备的地址与从机自身的地址不匹配,则从设备将SDA线拉高,表示返回一个NACK位 如图所示

    image-20220411214155987

  2. 收发数据

    主设备发送或接收数据到从设备

  3. 接收应答

    在传输完每个数据帧后,接收设备将另一个ACK位返回给发送方,以确认已成功接收到该帧

  4. 停止通信

    为了停止数据传输,主设备将SCL切换为高电平,然后再将SDA切换为高电平,从而向从机发送停止条件

单主多从连接

I2C总线上的主设备使用7位地址对从设备进行寻址,可以使用128( 2 7 2^7 27)个从机地址。使用4.7K的上拉电阻连接 Vcc

image-20220411215226314

多主多从连接

  • 多个主设备可以连接到一个或多个从机

  • 当两个主设备试图通过SDA线路同时发送或接收数据时,同一系统中的多个主设备就会出现问题。为了解决这个问题,每个主设备都需要在发送消息之前检测SDA线是低电平还是高电平

    • 如果SDA线为低电平,则意味着另一个主设备可以控制总线,并且主设备应等待发送消息
    • 如果SDA线为高电平,那么就可以置为低电平引发开始条件,则可以安全地发送消息

备试图通过SDA线路同时发送或接收数据时,同一系统中的多个主设备就会出现问题。为了解决这个问题,每个主设备都需要在发送消息之前检测SDA线是低电平还是高电平

  • 如果SDA线为低电平,则意味着另一个主设备可以控制总线,并且主设备应等待发送消息
  • 如果SDA线为高电平,那么就可以置为低电平引发开始条件,则可以安全地发送消息

image-20220411215417563

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值