【ARM】Exynos 4412 IIC(I2C)总线详解

概述


Exynos 4412支持四路多主机I2C串行总线,为了使连接总线上主机和外设之间实现数据传输,使用了一条SDA(Serial Data Line)线和一条SCL(Serial Clock Line)线,这两条都支持双向传输。

当I2C总线处于多主机模式时,多个Exynos 4412处理器都可以与从设备收发数据。I2C总线上的主设备负责启动和结束一次数据传输。Exynos 4412的I2C总线使用标准的总线仲裁规程来实现多主机、多从机的数据传输。

要实现对I2C总线的控制,你需要修改下面这些寄存器的值:

  • 控制寄存器 —— I2CCON
  • 控制/状态寄存器 —— I2CSTAT
  • 发送/接收移位寄存器 —— I2CDS
  • 地址寄存器 —— I2CADDR

当I2C总线处于空闲状态时,SCL和SDA都是高电平。当SCL为高电平时,SDA从高电平变为低电平表示一个开始信号;当SCL为高电平时,SDA从低电平变为高电平表示一个结束信号。

开始信号和结束信号由主设备负责生成。当发出起始信号后,I2CDS的前七位将作为从设备的地址被发送到SDA线上。这个地址决定了主设备选择了总线上的哪一个从设备。I2CDS的第八位标识主设备是要读取数据还是写入数据。

每一次数据传输放到SDA总线上的数据必须是一个字节,即8位。至于传送多少个字节则没有限制。数据发送时,总是从数据的最高位MSB(Most Significant Bit)开始发送。在每一个字节的最后,也就是第九个时钟周期,将紧跟一个ACK位,由接收方发出,表示数据已收到。

特征


  • 9通道、多主机、多从机的总线接口。(8个通用的通道,一个专用于HDMI的通道)
  • 7位地址
  • 串行、面向字节的双向数据传输
  • 标准模式最高支持100kbit/s的速率
  • 快速模式最高支持400kbit/s的速率
  • 支持主发送、主接收、从发送、从接收四种模式
  • 支持基于中断或者轮询的事件

I2C总线框图


【ARM】Exynos 4412 IIC(I2C)总线详解

I2C总线接口操作


Exynos 4412支持的四中操作模式如下:

  • 主发送模式
  • 主接收模式
  • 从发送模式
  • 从接收模式

开始/停止信号

当I2C总线接口处于空闲状态时,它通常处于从设备模式,或者说在检测到开始信号之前,接口处于从设备模式。当控制器将接口修改为主设备模式,就可以在SDA线上传输数据,以及在SCL线上生成时钟信号。

一个开始信号将会通过SDA线传输1byte的数据,一个停止信号将结束数据传输。

当一个主设备发送了一个开始信号,它同时需要发送一个从设备的地址来通知这个从设备。1byte的数据包含7位地址和1位读写标志位,0表示写,1表示读。

主设备通过发送停止信号来结束数据传输。如果主设备想继续传输数据,它需要重新发送一个开始信号和从设备地址。

下图展示开始信号和停止信号的电平变化:

【ARM】Exynos 4412 IIC(I2C)总线详解

数据传输格式

每一个放到SDA线上的字节数据必须是8位长度,每次传输的字节数量不限。紧跟在开始信号后面的第一个字节数据需要包含从设备的地址数据。一个ACK应答位紧跟在每个字节的后面,由接收方发出。I2C控制器先发送字节的高位数据,再发送低位数据。

下图展示了I2C总线接口的数据格式:

【ARM】Exynos 4412 IIC(I2C)总线详解

下图描述的是I2C总线上的数据传输电位图:

【ARM】Exynos 4412 IIC(I2C)总线详解

ACK应答信号的传输

要完成1个字节的数据传输操作,接收方需要向发送方发送一个ACK应答位。ACK脉冲信号出现在SCL线的第9个时钟周期,由从设备负责将SDA线拉低来表示ACK。

当发送方接收到ACK应答信号,会将SDA置为高电平从而释放总线。通过软件(I2CSTAT)可以使能或者禁用ACK发送功能。

下图展示了I2C总线上的应答信号:

【ARM】Exynos 4412 IIC(I2C)总线详解

读写操作

当I2C总线控制器处于发送模式,在新的数据被写入I2CDS寄存器之前,总线接口将一直等待,同时SCL将一直处于低电平。当写入数据后,控制器将释放SCL。Exynos 4412通过中断来判断数据是否发送完成,当CPU接收到中断,会自动把新的数据写入到I2CDS中。

当I2C总线控制器处于接收模式,在寄存器被读取之前,总线接口将一直等待,同时SCL线保持低电平。当读取数据之后,控制器将释放SCL。Exynos 4412通过中断来判断数据是否接收完成,当CPU接收到中断,会自动读取I2CDS中的数据。

每种模式下的操作流程图

在你进行发送/接收操作之前:

  1. 如果有必要,把自己的从设备地址写入到I2CADD中。
  2. 设置I2CCON寄存器:
    1. 开启中断
    2. 设置SCL的时钟频率
  3. 设置I2CSTAT使能Serial Output。

下图描述了主发送模式下的操作流程:

【ARM】Exynos 4412 IIC(I2C)总线详解

下图描述了主接收模式下的操作流程:

【ARM】Exynos 4412 IIC(I2C)总线详解

下图描述了从发送模式下的操作流程:

【ARM】Exynos 4412 IIC(I2C)总线详解

下图描述了从接收模式下的操作流程:

【ARM】Exynos 4412 IIC(I2C)总线详解