跳转至

I2C

概述

I2C 模块是 APB 总线上的从设备,是 I2C 总线上的主设备。I2C 模块的作用是完成 CPU 对 I2C 总线上从设备的数据读写,CPU 可以连续配置多个发送的数据和接收多个数据。I2C 总线上可挂载多个从设备,芯片支持 2 个 I2C 模块(I2C0 和 I2C1)。

功能描述

I2C 具有以下功能特点:

  • 2.0 版本的 I2C 总线协议,只支持 Master 模式。

  • I2C 模块在 APB 总线上执行 APB Slave 的功能,在 I2C 总线上作为 Master,支持多主设备时的总线仲裁。

  • I2C 主机可以向从机写入数据,也可以接收从机发来的数据。

  • 支持 Clock synchronization 和 Bit and Byte waiting。

  • 支持中断或轮询操作。

  • I2C 模块支持标准地址(7bit)和扩展地址(10bit)。

  • 可以工作在两种速度模式下:标准模式(100Kbit/s)、快速模式(400Kbit/s)。

  • I2C 模块支持 General Call 和 Start Byte 功能。

  • I2C 总线上不支持 CBUS 器件。

  • 对接收到的 SDA(Serial Data and Address)和 SCL(Serial Clock Line)信号进行滤波。

  • 内部包含 1 个 32×8 bit 的发送 FIFO 和 1 个 32×8 bit 的接收 FIFO。

  • 支持硬件检测FIFO数据深度并发出相应中断。

  • 兼容不使用FIFO和使用FIFO两种工作方式

工作方式

I2C 包含以下两种工作场景:

  • 主机仅对单个数据发送和接收(不使用FIFO)。

  • 主机连续发送多个数据、连续接收多个数据(使用FIFO)。

不使用 FIFO

I2C 主机发送数据流程

I2C 主机发送数据流程如图 6-2 所示。

图6-2 I2C 主机发送数据(不使用 FIFO)流程图

I2C 主机接收数据流程

I2C 主机接收数据流程如图 6-3 所示。

图6-3 I2C 主机接收数据(不使用 FIFO)流程图

使用 FIFO

I2C 主机发送数据流程

I2C 主机发送数据流程图如图 6-4 所示。

图6-4 I2C 主机发送数据(使用 FIFO)流程图

I2C 主机接收数据流程

I2C 主机接收数据流程如图 6-5 所示。

图6-5 I2C 主机接收数据(使用 FIFO)流程图

寄存器概览

I2C 寄存器概览如表 6-9 所示。

表6-9 I2C 寄存器概览(基址是 I2C0:0x44018000、I2C1:0x44008100)

偏移地址名称描述
0x00I2C_CTRLI2C 控制寄存器。
0x04I2C_COMI2C 模块的命令寄存器。
0x08I2C_ICRI2C 模块的中断清除寄存器。
0x0CI2C_SRI2C 模块状态寄存器。
0x10I2C_SCL_HI2C 总线 SCL 信号高电平周期数寄存器。
0x14I2C_SCL_LI2C 总线 SCL 信号低电平周期数寄存器。
0x18I2C_TXRI2C 发送数据寄存器。
0x1CI2C_RXRI2C 接收数据寄存器。
0x20I2C_FIFOSTATUSFIFO 状态寄存器。
0x24I2C_TXCOUNT发送 FIFO 数据个数寄存器。
0x28I2C_RXCOUNT接收 FIFO 数据个数寄存器。
0x2CI2C_RXTIDE接收 FIFO 的溢出阈值寄存器。
0x30I2C_TXTIDE发送 FIFO 的溢出阈值寄存器。
0x34I2C_FTRPER毛刺过滤配置寄存器。

寄存器描述

I2C_CTRL

I2C_CTRL 为 I2C 控制寄存器。

Offset Address: 0x00 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:13]-reserved保留。0x00000
[12]RWint_txfifo_over_mask发送FIFO数据发送完成中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[11]RWmode_ctrlI2C工作模式选择。0: 不使用FIFO传输模式:
1: 使用FIFO传输模式。
0x0
[10]RWint_txtide_mask发送FIFO溢出中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[9]RWint_rxtide_mask接收 FIFO 溢出中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[8]RWi2c_enI2C 使能。0: 禁止:
1: 使能。
0x0
[7]RWint_maskI2C 中断总屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[6]RWint_start_mask主机开始条件发送结束中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[5]RWint_stop_mask主机停止条件发送结束中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[4]RWint_tx_mask主机发送中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[3]RWint_rx_mask主机接收中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[2]RWint_ack_err_mask从机 ACK 错误中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[1]RWint_arb_loss_mask总线仲裁失败中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0
[0]RWint_done_mask总线传输完成中断屏蔽。0: 屏蔽:
1: 不屏蔽。
0x0

I2C_COM

I2C_COM 为 I2C 模块的命令寄存器。

在系统初始化时配置或配置前,需要清除对应中断标志。I2C_COM bit[3:0]在操作结后将自动清0。

Offset Address: 0x04 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:5]-reserved保留。0x0000000
[4]RWop_ack主机作为接收器是否发送 ACK。0: 发送:
1: 不发送。
0x0
[3]RWop_start产生开始条件操作。0: 操作结束:
1: 操作有效。
0x0
[2]RWop_rd产生读操作。0: 操作结束:
1: 操作有效。
0x0
[1]RWop_we产生写操作。0: 操作结束:
1: 操作有效。
0x0
[0]RWop_stop产生停止条件操作。0: 操作结束:
1: 操作有效。
0x0

I2C_ICR

I2C_ICR 为 I2C 模块的中断清除寄存器。

说明:

新中断到来时,I2C 模块会自动将 I2C_ICR 相应位清 0。

Offset Address: 0x08 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:10]-reserved保留。0x000000
[9]WCclr_int_txfifo_over发送FIFO数据发送完成中断标志清除。0:不清除:
1:清除。
0x0
[8]WCclr_int_txtide发送FIFO溢出中断标志清除。0:不清除:
1:清除。
0x0
[7]WCclr_int_rxtide接收FIFO溢出中断标志清除。0:不清除:
1:清除。
0x0
[6]WCclr_int_start主机开始条件发送结束中断标志清除。0:不清除:
1: 清除。
0x0
[5]WCclr_int_stop主机停止条件发送结束中断标志清除。0: 不清除:
1: 清除。
0x0
[4]WCclr_int_tx主机发送中断标志清除。0: 不清除:
1: 清除。
0x0
[3]WCclr_int_rx主机接收中断标志清除。0: 不清除:
1: 清除。
0x0
[2]WCclr_int_ack_err从机 ACK 错误中断标志清除。0: 不清除:
1: 清除。
0x0
[1]WCclr_int_arb_loss总线仲裁失败中断标志清除。0: 不清除:
1: 清除。
0x0
[0]WCclr_int_done总线传输完成中断标志清除。0: 不清除:
1: 清除。
0x0

I2C_SR

I2C_SR 为 I2C 模块状态寄存器。

说明:

I2C_SR bit[1]表示 I2C 总线仲裁失败。当 I2C_SR bit[1]有效时,当前操作失败。在清 I2C_SR bit[1]之前,需要清除其他中断标志,然后清除 I2C_COM 或向 I2C_COM 写入新的操作命令,最后清除 I2C_SR bit[1]。

Offset Address: 0x0C Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:11]-reserved保留。0x000000
[10]ROint_txfifo_over发送FIFO数据发送完成中断标志。0:无中断标志产生:
1:中断标志产生。
0x0
[9]ROint_txtide发送FIFO溢出中断标志。0:无中断标志产生:
1:中断标志产生。
0x0
[8]ROint_rxtide接收FIFO溢出中断标志。0:无中断标志产生:
1:中断标志产生。
0x0
[7]RObus_busy总线忙。0:空闲:
1:忙。
0x0
[6]ROint_start主机开始条件发送结束中断标志。0:无中断标志产生:
1:中断标志产生。
0x0
[5]ROint_stop主机停止条件发送结束中断标志。0:无中断标志产生:
1:中断标志产生。
0x0
[4]ROint_tx主机发送中断标志。0:无中断标志产生:
1: 中断标志产生。
0x0
[3]ROint_rx主机接收中断标志。0: 无中断标志产生:
1: 中断标志产生。
0x0
[2]ROint_ack_err从机 ACK 错误中断标志。0: 无中断标志产生:
1: 中断标志产生。
0x0
[1]ROint_arb_loss总线仲裁失败中断标志。0: 无中断标志产生:
1: 中断标志产生。
0x0
[0]ROint_done总线传输完成中断标志。0: 无中断标志产生:
1: 中断标志产生。
0x0

I2C_SCL_H

I2C_SCL_H 为 I2C 总线 SCL 信号高电平周期数寄存器。

说明:

在系统初始化时配置或配置前使 I2C_CTRL bit[7]=0。
Offset Address: 0x10 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:16]-reserved保留。0x0000
[15:0]RWscl_hI2C 总线 SCL 信号高电平周期数寄存器。用于配置 I2C 模块工作时 SCL 高电平周期数,配置数值乘 2 等于 SCL 高电平周期数。0x0000

I2C_SCL_L

I2C_SCL_L 为 I2C 总线 SCL 信号低电平周期数寄存器。

说明

在系统初始化时配置或配置前使 I2C_CTRL bit[7]=0。

Offset Address: 0x14 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:16]-reserved保留。0x0000
[15:0]RWscl_II2C 总线 SCL 信号低电平周期数寄存器。用于配置 I2C 模块工作时SCL 低电平周期数,配置数值乘 2等于 SCL 低电平周期数。0x0000

I2C_TXR

I2C_TXR 为 I2C 发送数据寄存器。

说明:

不使用 FIFO 模式下,发送结束后,I2C 模块不会修改 I2C_TXR 内容;使用 FIFO 模式下,写入的数据会自动载入到发送 FIFO 中保存直到该数据发送结束。

Offset Address: 0x18 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:8]-reserved保留。0x000000
[7:0]RWi2c_txr主机发送数据。用于配置 I2C 模块工作时发送数据。0x00

I2C_RXR

I2C_RXR 为 I2C 接收数据寄存器。

说明

不使用 FIFO 模式下,I2C_RXR 数据在 I2C_SR bit[3]=1 时,数据有效。同时数据将保持到下一个读操作前。使用 FIFO 模式下,读取 I2C_RXR 会直接从接收 FIFO 中取数据。

Offset Address: 0x1C Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:8]-reserved保留。0x000000
[7:0]ROi2c_rxr主机接收数据。用于主机接收从机数据。0x00

I2C_FIFOSTATUS

I2C_FIFOSTATUS 为 FIFO 状态寄存器。

Offset Address: 0x20 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:4]-reserved保留。0x0000000
[3]ROrxfe接收FIFO空状态。0:非空:
1:空。
0x0
[2]ROrxff接收FIFO满状态。0:未满:
1:满。
0x0
[1]ROtxfe发送FIFO空状态。0:非空:
1:空。
0x0
[0]ROtxff发送FIFO满状态。0:未满:
1:满。
0x0

I2C_TXCOUNT

I2C_TXCOUNT 为发送 FIFO 数据个数寄存器。

Offset Address: 0x24 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:6]-reserved保留。0x0000000
[5:0]WCtxcount读该寄存器返回发送 FIFO 中的字符数,写该寄存器(任意值)将清空发送 FIFO。0x00

I2C_RXCOUNT

I2C_RXCOUNT 为接收 FIFO 数据个数寄存器。

Offset Address: 0x28 Total Reset Value: 0x0000_0000

BitsAccessNameDescriptionReset
[31:6]-reserved保留。0x0000000
[5:0]WCrxcount读该寄存器返回接收 FIFO 中的字符数,写该寄存器(任意值)将清空接收 FIFO。0x00

I2C_RXTIDE

I2C_RXTIDE 为接收 FIFO 的溢出阈值寄存器。

Offset Address: 0x2C Total Reset Value: 0x0000_0001

BitsAccessNameDescriptionReset
[31:6]-reserved保留。0x0000000
[5:0]RWrxtide设置 int_rxtide 中断的触发值。RXFIFO 中的字符个数≥I2C_RXTIDE[rxtide]时会触发接收FIFO 溢出中断。0x01

I2C_TXTIDE

I2C_TXTIDE 为发送 FIFO 的溢出阈值寄存器。

TXFIFO 中的字符只有在成功发送后才会被移除。

Offset Address: 0x30 Total Reset Value: 0x0000_0001

BitsAccessNameDescriptionReset
[31:6]-reserved保留。0x0000000
[5:0]RWtxtide设置 int_txtide 中断的触发值。TXFIFO 中的字符个数≤I2C_TXTIDE[txtide]时会触发发送 FIFO 溢出中断。0x01

I2C_FTRPER

I2C_FTRPER 为毛刺过滤配置寄存器。

Offset Address: 0x34 Total Reset Value: 0x0000_000F

BitsAccessNameDescriptionReset
[31:4]-reserved保留。0x0000000
[3:0]RWftrper毛刺过滤配置寄存器。默认 15 个时钟周期,需要 SDA 需要再 SCL为高时,电平保持的时间。
scl 为高时,判断 sda 电平持续时间,单位为 ic_clk 的时钟个数,持续时间大于该值才认为该电平为接收值。
注意:配置值需要≤((fic_clk/(8*fscl))-2),其中 fic_clk 为 I2C 工作时钟频率,fscl 为 I2C 总线传输速率。
0xF