Skip to the content.

I2C Peripheral

1. ST


ST STM32F10X:

MCU: ARM Cortex-M3 * 1, 32 bit.

stm32 i2c peripheral

1.1 i2c 功能描述

I2C模块接收和发送数据,并将数据从串行转换成并行,或并行转换成串行。可以开启或禁止中断。接口通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线。允许连接到标准模式(100kHz)或快速模式(400kHz)的I2C总线。提供对SMBus 2.0的兼容。

1.2 模式选择

接口可以下述4种模式中的一种运行:

该模块默认地工作于从模式。接口在生成起始条件后自动地从从模式切换到主模式;当仲裁丢失或产生停止信号时,则从主模式切换到从模式。允许多主机功能。

通信流

主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。起始条件和停止条件都是在主模式下由软件控制产生。

从模式时,I2C接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能够控制开启或禁止广播呼叫地址的识别。

数据和地址按8位/字节进行传输,高位在前。跟在起始条件后的1或2个字节是地址(7位模式为1个字节,10位模式为2个字节)。地址只在主模式发送。

在一个字节传输的8个时钟后的第9个时钟期间,接收器必须回送一个应答位(ACK)给发送器。

1.3 i2c 从模式

默认情况下,I2C接口总是工作在从模式。在从模式下TRA位指示当前是处于接收器模式还是发送器模式。

1.3.1 从发送器

在接收到地址和清除ADDR位后,从发送器将字节从DR寄存器经由内部移位寄存器发送到SDA线上。

从设备保持SCL为低电平,直到ADDR位被清除并且待发送数据已写入DR寄存器。

当收到应答脉冲时:

如果TxE位被置位,但在下一个数据发送结束之前没有新数据写入到I2C_DR寄存器,则BTF位被置位,在清除BTF之前I2C接口将保持SCL为低电平;读出I2C_SR1之后再写入I2C_DR寄存器将清除BTF位。

stm32 slave sender timing

1.3.2 从接收器

在接收到地址并清除ADDR后,从接收器将通过内部移位寄存器从SDA线接收到的字节存进DR寄存器。I2C接口在接收到每个字节后都执行下列操作:

如果RxNE被置位,并且在接收新的数据结束之前DR寄存器未被读出,BTF位被置位,在清除BTF之前I2C接口将保持SCL为低电平;读出I2C_SR1之后再写入I2C_DR寄存器将清除BTF位。

stm32 slave receiver timing

1.3.3 关闭通信

在传输完最后一个数据字节后,主设备产生一个停止条件, I2C接口检测到这一条件时:

然后I2C接口等待读SR1寄存器,再写CR1寄存器。

1.4 i2c 主模式

在主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始并以停止条件结束。当通过START位在总线上产生了起始条件,设备就进入了主模式。

以下是主模式所要求的操作顺序:

1.4.1 起始条件

当BUSY=0时,设置START=1,I2C接口将产生一个开始条件并切换至主模式(M/SL位置位)。

一旦发出开始条件:

然后主设备等待读SR1寄存器,紧跟着将从地址写入DR寄存器。

1.4.2 从地址的发送

从地址通过内部移位寄存器被送到SDA线上。

根据送出从地址的最低位,主设备决定进入发送器模式还是进入接收器模式。

TRA位指示主设备是在接收器模式还是发送器模式。

1.4.3 主发送器

stm32 master sender timing

主发送器发送流程及事件说明如下:

  1. 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1,表示起始信号已经发送;
  2. 紧接着发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时 SR1 寄存器的“ADDR”位及“TXE”位被置 1,ADDR 为 1 表示地址已经发送,TXE 为 1 表示数据寄存器为空;
  3. 以上步骤正常执行并对 ADDR 位清零后,我们往 I2C 的“数据寄存器 DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空,I2C外设通过SDA 信号线一位位把数据发送出去后,又会产生“EV8”事件,即 TXE 位被置 1,重复这个过程,就可以发送多个字节数据了;
  4. 当我们发送数据完成后,控制 I2C 设备产生一个停止信号(P),这个时候会产生EV8_2 事件,SR1 的 TXE 位及 BTF 位都被置 1,表示通讯结束。

假如我们使能了 I2C 中断,以上所有事件产生时,都会产生 I2C 中断信号,进入同一个中断服务函数,到 I2C 中断服务程序后,再通过检查寄存器位来判断是哪一个事件。

1.4.4 主接收器

stm32 master receiver timing

主接收器接收流程及事件说明如下:

  1. 同主发送流程,起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对 SR1 寄存器的“SB”位置 1,表示起始信号已经发送;
  2. 紧接着发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1 寄存器的“ADDR”位被置 1,表示地址已经发送。
  3. 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件,SR1 寄存器的 RXNE被置 1,表示接收数据寄存器非空,我们读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。此时我们可以控制I2C 发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
  4. 发送非应答信号后,产生停止信号(P),结束传输。

在发送和接收过程中,有的事件不只是标志了我们上面提到的状态位,还可能同时标志主机状态之类的状态位,而且读了之后还需要清除标志位,比较复杂。

1.5 外设逻辑

1.5.1 时钟控制逻辑

SCL 线的时钟信号,由 I2C 接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。配置 I2C 的 CCR 寄存器可修改通讯速率相关的参数:

通过公式计算结果得出CCR为30,向该寄存器位写入此值则可以控制IIC的通讯速率为400KHz,其实即使配置出来的 SCL 时钟不完全等于标准的 400KHz,IIC 通讯的正确性也不会受到影响,因为所有数据通讯都是由 SCL 协调的,只要它的时钟频率不远高于标准即可。

1.5.2 数据控制逻辑

I2C 的 SDA 信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、PEC 寄存器以及 SDA 数据线。当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过 SDA 信号线发送出去;当从外部接收数据的时候,数据移位寄存器把 SDA 信号线采样到的数据一位一位地存储到“数据寄存器”中。若使能了数据校验,接收到的数据会经过 PCE 计算器运算,运算结果存储在“PEC 寄存器”中。当 STM32 的 I2C 工作在从机模式的时候,接收到设备地址信号时,数据移位寄存器会把接收到的地址与 STM32 的自身的“I2C 地址寄存器”的值作比较,以便响应主机的寻址。STM32 的自身 I2C 地址可通过修改“自身地址寄存器”修改,支持同时使用两个 I2C 设备地址,两个地址分别存储在 OAR1 和 OAR2 中。

1.5.3 整体控制逻辑

整体控制逻辑负责协调整个 I2C 外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1 和 SR2)”,我们只要读取这些寄存器相关的寄存器位,就可以了解 I2C的工作状态。除此之外,控制逻辑还根据要求,负责控制产生 I2C 中断信号、DMA 请求及各种 I2C 的通讯信号(起始、停止、响应信号等)。

2. Samsung


Samsung Exynos 4412:

CPU: ARM Cortex-A9 * 4, 32 bit.

exynos i2c peripheral

2.1 Overview

要控制多主i2c总线操作,必须将值写入这些寄存器:

如果i2c总线空闲,则SDA和SCL线都应该处于高电平。SDA从高到低的转换将启动所有启动条件。SDA从低到高的转换启动一个停止条件,而SCL保持稳定在高电平。

放在SDA线上的每个数据字节总共应该是8位。在总线传输操作期间,发送或接收字节没有限制。12C主设备和从设备总是首先从最高有效位(MSB)发送数据,然后在每个字节之后立即发送确认位(ACK)。

Exynos 4412 SCP I2C 总线接口的四种操作模式是:

2.2 Bus Arbitration Procedures

仲裁发生在 SDA 线上,以防止两个主设备之间的总线冲突。 如果一个SDA高电平的主机检测到另一个SDA低电平有效的主机,它不会发起数据传输。 这是因为总线上的当前电平不对应于发起数据传输。 仲裁程序一直持续到 SDA 线变为高电平为止。

当两个或多个主设备同时将 SDA 线置为低电平时,每个主设备都会评估自己是否具有主控权。 为了评估的目的,每个主机检测地址位。 当每个主机生成从机地址时,它会检测 SDA 线上的地址位。 这是因为 SDA 线变为低电平而不是高电平。

让我们假设一个主机生成低电平作为第一个地址位,而另一个主机保持高电平。 在这种情况下,两个主机都会检测到总线上的低电平。 这是因为低状态的权力优于高状态。 当这种情况发生时,生成主控的低位(作为地址的第一位)获得主控权,而生成主控的高位(作为地址的第一位)撤回主控权。

当两个主机都产生低电平作为地址的第一位时,再次对第二个地址位进行仲裁。 该仲裁持续到最后一个地址位的末尾。

2.3 Configuring I2C-Bus

要控制 SCL 的频率,应将 4 位预分频器值写入 I2CCON 寄存器。 I2C 总线接口地址存储在 I2C 总线地址 (I2CADD) 寄存器中。 默认情况下,I2C 总线接口地址具有未知值。

Master/Transmitter Mode:

Master/Transmitter Mode

Master/Receiver Mode:

Master/Receiver Mode

Slave/Transmitter Mode:

Slave/Transmitter Mode

Slave/Receiver Mode:

Slave/Receiver Mode

3. RockChip


RockChip RK3588:

CPU: ARM Cortex-A76 * 4 + ARM Cortex-A55 * 4, 64 bit。

rockchip i2c peripheral

3.1 Overview

内部集成电路(I2C)是一种双线(SCL和SDA)双向串行总线,它提供了一种高效和简单的设备间信息交换方法。该I2C总线控制器只支持主模式,作为AMBA协议和通用I2C总线系统之间的桥梁。

I2C_RF

I2C_RF 模块用于通过带有 APB 接口的主机控制 I2C 控制器的操作。 它实现了寄存器设置和中断功能。 I2C_RF 组件与 pclk 同步运行。

I2C_PE

I2C_PE 模块实现 I2C 主设备操作,用于向其他 I2C 设备发送数据和从其他 I2C 设备接收数据。 I2C 主控制器与 clk_i2c 同步运行。

I2C_TOP

I2C_TOP模块是I2C控制器的顶层模块。

3.2 Initialization

I2C 控制器基于 AMBA APB 总线架构,通常是 SOC 的一部分。 因此,在 I2C 运行之前,必须先确认一些系统设置和配置,其中包括:

3.3 Master Mode Programming

当 I2C 控制器编程为主模式时,SCL 频率由 I2C_CLKDIV 寄存器确定。 SCL频率由以下公式计算:

SCL Divisor = 8*(CLKDIVL + 1 + CLKDIVH + 1); clk_i2c = 100MHz~200MHz.

SCL = clk_i2c/ SCLK Divisor.

当 I2C 控制器接收到 MRXCNT 字节数据时,CPU 可以通过寄存器 RXDATA0 ~ RXDATA7 获取数据。 控制器在一次事务中最多可以接收 32 字节的数据。

当 MRXCNT 寄存器被写入时,I2C 控制器将开始驱动 SCL 接收数据。

要发送的数据由CPU写入TXDATA0~7。 控制器在一次事务中最多可以传输 32 字节的数据。 低字节将首先被传输。

当 MTXCNT 寄存器被写入时,I2C 控制器将开始发送数据。

向 I2C_CON[3] 写入 1,控制器将发送 I2C 启动命令。

向 I2C_CON[4] 写入 1,控制器将发送 I2C 停止命令。