Skip to content

I2C

I2C exmaples

概念

I2C 是Philips公司开发的一种简单的、两线制的通用串行总线。采用主从模式,包含单主单从、单主多从、多主单从和多主多从四种模式。

I2C总线包含两条线,一条时钟线SCL和一条数据线SDA,数据线使用半双工模式。每个I2C设备既可以作为主设备,也可以作为从设备,如果多个设备同时传输,可以通过冲突检测和仲裁防止数据破坏。

IO 漏极开路

SCL/SDA 总线管脚使用 漏极开路 方式,默认处于高阻态,所以需要上接上拉电阻。

open-drain

当输出 低电平 时,可以通过控制逻辑接口下拉FET,从而使FET导通,并输出低电平。

open-drain pulling low

当输出 高电平 时,可以通过控制逻辑接口释放FET,此时总线浮空,上拉电阻提供高电平输出。

open-drain pulling low

关于 漏极开路, 推挽输出, 可以参考:

I2C 数据传输

传输流程

假设主设备要发送数据给从设备,其发送流程如下:

  1. 主设备发送一个 START 信号
  2. 主设备发送从设备地址
  3. 主设备发送数据到从设备 (数据可以是从设备寄存器地址,或是具体数据)
  4. 主设备发送 STOP 信号结束传输

同样的,如果主设备需要接收数据,其接收流程如下:

  1. 主设备发送一个 START 信号
  2. 主设备发送从设备地址
  3. 主设备发送请求数据对应的寄存器地址给从设备
  4. 主设备从从设备接收数据
  5. 主设备发送 STOP 信号结束传输

START / STOP

I2C 的通信都是通过START开始和STOP结束的。

start / stop

  • STARTSCL保持高电平的同时,SDA从高电平切到低电平,产生一个下降沿
  • STOP: SCL保持高电平的同时,SDA从低电平切到高电平,产生一个上升沿

Note

  1. START 信号可以在发送STOP之前重复发送,代表开始一个新的传输,这是防止STOP后被其它主设备抢占总线;
  2. START, STOP 属于控制信号,其时序与正常数据收发不同,正常收发时,SCL高电平时不允许SDA发生改变。

发送字节

发送单个字节时,其时序如下:

send single byte

SDA数据在SCL高电平时保持不变,在SCL低电平时修改数据,也就是说,SCL高电平时为有效数据。每个字节发送完毕以后,主设备需要释放SDA总线,等待从设备发送ACK应答信号,代表从设备已接收数据并准备好接收下一个字节。

Tip

主设备 释放 SDA总线,意味着主设备SDA接口的FET被释放处于浮空,此时SDA默认呈现高电平,需要从设备将其拉低(pull down), 也就是这里的ACK.

ACK / NACK

在上面已经提到了ACK,ACK对应一个低电平;有时候也会发送或接收到NACK, 对应一个高电平。

NACK

NACK 可能出现在以下几种情况:

  1. 接收方因为在处理实时函数无法接收或发送数据,还没准备好与主设备通信;
  2. 在传输过程中,接收方接收到了无法理解的数据;
  3. 在传输过程中,接收方无法接收更多的数据了,可能缓存满了;
  4. 主设备作为接收方已经完成了数据接收,提示从设备不再需要数据了。

Master 发送数据

主设备发送数据给从设备,首先发送一个START信号,然后发送从设备地址,继而发送从设备待写入数据的寄存器地址,然后发送要写入的数据,最后发送STOP结束。

send data

Note

值得注意的是,并不是所有的I2C设备都要发送寄存器地址,某些小型设备可能只有一个寄存器,不需要指定地址就可以直接发送数据。

Master 接收数据

主设备从从设备接收数据,同样先发送一个START,然后发送从设备地址、寄存器地址,之后与发送不同的是,当接收方返回ACK后,需要重新发送START,这是为了将R/W 方式改为 , 发送完带有读信号的从设备地址后,从从设备读取数据,读取完后可以主动发送NACK给从设备,然后发送STOP结束接收。

receive data

参考文档