概述
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总线框图
I2C总线接口操作
Exynos 4412支持的四中操作模式如下:
- 主发送模式
- 主接收模式
- 从发送模式
- 从接收模式
开始/停止信号
当I2C总线接口处于空闲状态时,它通常处于从设备模式,或者说在检测到开始信号之前,接口处于从设备模式。当控制器将接口修改为主设备模式,就可以在SDA线上传输数据,以及在SCL线上生成时钟信号。
一个开始信号将会通过SDA线传输1byte的数据,一个停止信号将结束数据传输。
当一个主设备发送了一个开始信号,它同时需要发送一个从设备的地址来通知这个从设备。1byte的数据包含7位地址和1位读写标志位,0表示写,1表示读。
主设备通过发送停止信号来结束数据传输。如果主设备想继续传输数据,它需要重新发送一个开始信号和从设备地址。
下图展示开始信号和停止信号的电平变化:
数据传输格式
每一个放到SDA线上的字节数据必须是8位长度,每次传输的字节数量不限。紧跟在开始信号后面的第一个字节数据需要包含从设备的地址数据。一个ACK应答位紧跟在每个字节的后面,由接收方发出。I2C控制器先发送字节的高位数据,再发送低位数据。
下图展示了I2C总线接口的数据格式:
下图描述的是I2C总线上的数据传输电位图:
ACK应答信号的传输
要完成1个字节的数据传输操作,接收方需要向发送方发送一个ACK应答位。ACK脉冲信号出现在SCL线的第9个时钟周期,由从设备负责将SDA线拉低来表示ACK。
当发送方接收到ACK应答信号,会将SDA置为高电平从而释放总线。通过软件(I2CSTAT)可以使能或者禁用ACK发送功能。
下图展示了I2C总线上的应答信号:
读写操作
当I2C总线控制器处于发送模式,在新的数据被写入I2CDS寄存器之前,总线接口将一直等待,同时SCL将一直处于低电平。当写入数据后,控制器将释放SCL。Exynos 4412通过中断来判断数据是否发送完成,当CPU接收到中断,会自动把新的数据写入到I2CDS中。
当I2C总线控制器处于接收模式,在寄存器被读取之前,总线接口将一直等待,同时SCL线保持低电平。当读取数据之后,控制器将释放SCL。Exynos 4412通过中断来判断数据是否接收完成,当CPU接收到中断,会自动读取I2CDS中的数据。
每种模式下的操作流程图
在你进行发送/接收操作之前:
- 如果有必要,把自己的从设备地址写入到I2CADD中。
- 设置I2CCON寄存器:
- 开启中断
- 设置SCL的时钟频率
- 设置I2CSTAT使能Serial Output。
下图描述了主发送模式下的操作流程:
下图描述了主接收模式下的操作流程:
下图描述了从发送模式下的操作流程:
下图描述了从接收模式下的操作流程: