I2C

简介

I2C(Inter-Integrated Circuit,集成电路间总线)接口作为微控制器与串行 I2C 总线之间的桥梁。 它支持多主机能力,并负责处理所有 I2C 总线特定的时序、协议、仲裁和时钟控制。 支持以下模式:

  • 标准模式(Sm,最高 100 kHz)

  • 快速模式(Fm,最高 400 kHz)

  • 快速模式 Plus(Fm+,最高 1 MHz)

  • 高速模式(Hs-mode,最高 3.4 MHz)

根据具体设备实现,可选支持DMA功能,以降低CPU负载。

主要特性

  • 并行总线 / I2C 协议转换器

  • 支持主机与从机模式:同一接口可配置为主机或从机

  • 内置两个 FIFO(发送与接收):

    • 宽度:8 位

    • 深度:2

  • I2C 主机特性:

    • 时钟生成

    • 起始(START)与停止(STOP)条件生成

  • I2C 从机特性:

    • 可编程 I2C 地址识别

    • 停止位检测

    • 支持两个从机地址寄存器及两个掩码寄存器

  • 支持 7 位 / 10 位寻址

  • 支持最多两个从机地址响应(均带可配置掩码)

  • 支持广播地址软件复位

  • 支持多种通信速率:

    • 标准速率(最高 100 kHz)

    • 快速速率(最高 400 kHz)

    • 快速 Plus 速率(最高 1 MHz)

    • 高速(最高 3.4 MHz)

  • 状态标志:

    • 发送器 / 接收器模式标志

    • 字节传输完成标志

    • I2C 忙标志

  • 支持时钟拉伸(Clock Stretching):

    • 发送数据未就绪

    • 接收数据未被 CPU 或 DMA 核心读取

  • 支持通过 DMA 控制器进行高速数据通信

  • 可编程 SCL 与 SDA 时序参数(符合 I2C 规范):

    • 起始条件保持时间(tHD;STA)

    • 重复起始条件建立时间(tSU;STA)

    • 数据建立时间(tSU;DAT)

    • 数据保持时间(tHD;DAT)

    • SCL 高电平周期(tHIGH)

    • SCL 低电平周期(tLOW)

    • 停止条件建立时间(tSU;STO)

    • 停止与起始之间的总线空闲时间(tBUF)

  • 可编程 SCL 高/低电平周期

  • 可编程数字噪声滤波器

  • 兼容 SMBus 2.0 规范:

    • 硬件 PEC(包错误校验)生成与验证(带 ACK 控制)

    • 支持地址解析协议(ARP)

    • 支持主机与从机设备

    • 支持 SMBus Alert

    • 支持超时与空闲状态检测

  • 兼容 PMBus 1.1 标准

I2C 实现特性

I2C 特性

支持情况

主机/从机模式

支持

7 位寻址模式

支持

10 位寻址模式

支持

标准模式(最高 100 kHz)

支持

快速模式(最高 400 kHz)

支持

快速 Plus 模式(最高 1 MHz)

支持

高速模式(最高 3.4 MHz)

支持

广播地址软件复位

支持

时钟拉伸能力

支持

通过 DMA 控制器访问

支持

SMBus

支持

功能描述

除了收发数据外,该接口还负责串行与并行格式之间的转换。中断可通过软件使能或禁用。接口通过数据线(SDA)与时钟线(SCL)连接至 I2C 总线,支持标准(100 kHz)、快速(400 kHz)、快速 Plus(1 MHz)或高速(3.4 MHz)模式。

模式选择

该界面可运行于以下四种模式之一:

  • 主发射机

  • 主接收器

  • 从属发射机

  • 从属接收器

默认情况下,它以主模式运行,可为I2C从设备外设生成START或STOP条件,并支持多主机功能。通过设置SETUP[11]寄存器,该接口可从主模式切换至从模式;当控制器处于从模式时,则支持多从设备连接。

通信流程

在主模式下,I2C接口发起数据传输并生成时钟信号。串行数据传输始终以起始条件开始,以停止条件结束。起始条件和停止条件均在主模式下由软件产生。

在从机模式下,该接口能够识别自身的双地址(7位或10位),以及通用呼叫地址。 数据和地址以8位字节的形式传输,高位在前。起始条件后的第一个字节(或多个字节)包含地址(7位模式下为1个字节,10位模式下为2个字节)。地址始终在主模式下进行传输。 第9个时钟脉冲紧随一个字节传输的8个时钟周期之后,此时接收器必须向发送器发送一个应答位。详情请参阅I2C总线协议(第10页)。

i2c bus protocol

I2C总线协议

确认功能可由软件启用或禁用。I2C接口地址(包括7位/10位双重寻址和/或通用呼叫地址)也可通过软件进行选择。 I2C接口的框图如I2C框图

i2c arch

I2C控制器架构

I2C 初始化

启用和禁用外设: I2C外设时钟必须在时钟控制器中配置并启用。 在通过设置SETUP寄存器中的CFG_DNF_NUM来配置数字滤波器后,方可启用I2C。随后,可通过将SETUP寄存器中的ENABLE位置1来启用I2C。 注意:I2C外设可使用配置寄存器的默认值,用户无需再手动配置时序。警告:当I2C传输正在进行时,禁止更改时序配置。

i2c_init_flowchart

I2C初始化流程图

软复位

可以通过设置SETUP寄存器中的SOFT_RESET位来执行软件复位。在这种情况下,I2C总线的SCL和SDA引脚将被释放。内部状态机将被重置,通信控制位以及状态位也将恢复到其复位值。需要注意的是,配置寄存器不会受到影响。 当软件设置SETUP[7]时,将生成软复位脉冲并立即重置I2C控制器。

主机 SCL 和 SDA 时序

i2c_protocol_timing_generate

I2C总线时序

当软件设置SETUP[7]时,将生成软复位脉冲并立即重置I2C控制器。

  • I2C_TIMING.PRESC[31:0]。

  • CFG_START_SETUP_TIME[31:0],CFG_START_HOLD_TIME[31:0]。

  • CFG_SDA_SETUP_TIME[31:0],CFG_SDA_HOLD_TIME[31:0]。

  • CFG_SCL_HIGH_PERIOD[31:0],CFG_SCL_LOW_PERIOD[31:0]。

  • CFG_STOP_SETUP_TIME[31:0],CFG_BUS_FREE_TIME[31:0]。

I2C总线规范中规定的SCL时钟的最小高电平和低电平周期,决定了标准模式设备的最大位传输速率可达100 kbit/s,快速模式设备为400 kbit/s,而快速模式Plus设备则高达1000 kbit/s。各设备必须能够以自身支持的最高位速率完成数据传输,即既能以该速度发送数据,也能接收数据。 为了确保主模式和从模式下正确的数据保持时间和建立时间,必须对时序进行配置。

I2C 时序参数配置表

符号

参数说明

配置寄存器

tSU;STA

START 条件建立时间

CFG_START_SETUP_TIME[31:0]

tHD;STA

START 条件保持时间

CFG_START_HOLD_TIME[31:0]

tSU;DAT

数据建立时间

CFG_SDA_SETUP_TIME[31:0]

tHD;DAT

数据保持时间

CFG_SDA_HOLD_TIME[31:0]

tSU;STO

STOP 条件建立时间

CFG_STOP_SETUP_TIME[31:0]

tBUF

总线空闲时间 (STOP 到 START)

CFG_BUS_FREE_TIME[31:0]

I2C 主机模式

在主模式下,I2C接口发起数据传输并生成时钟信号。串行数据传输始终以START条件开始,以STOP条件结束。一旦总线上出现带有START位的START条件,主模式便被立即选中。 以下是主CPU模式下的主要所需序列:

  • 请编程设置时序寄存器,以生成正确的I2C时序。

  • 通过启用SETUP[11]寄存器中的ROLE_MODE位,配置工作在主模式下的I2C控制器。

  • 将SETUP[1]寄存器中的ENABLE位设置为1,以启用I2C控制器。

  • 将SETUP[2]寄存器中的START位设置为1,以生成一个START条件。

  • 配置TXDATA寄存器。

  • 将 SETUP[5:4] 寄存器中的 WRITE 或 READ 位编程,以使主设备工作在发送模式或接收模式。

  • 当STATUS[4]中的BYTE_ON_GOING位为低电平,表示字节传输已完成。

i2c_master_init_flowchart

I2C主机初始化流程

起始与停止条件

所有事务均以START(S)开始,并以STOP(P)结束,具体如 START与STOP条件图所示。当SCL为高电平时,SDA线发生从高到低的跳变,即定义了START条件;而当SCL为高电平时,SDA线发生从低到高的跳变,则定义了STOP条件。

i2c_start_stop_condition

I2C起始和停止条件

设置START位会使接口在SDA和SCL线上产生起始条件。 当最后一个字节写入TXDATA寄存器后,软件会通过设置STOP位来触发停止条件。起始和停止条件始终由主设备发起。 当起始条件出现时,总线即进入忙状态;而当停止条件触发后,I2C控制器会在特定时间重新释放空闲状态。 若连续生成起始信号(Sr)而非停止条件,I2C控制器仍会保持忙碌状态。从功能特性来看,起始(S)与重复起始(Sr)是等效的。

注意:在主设备模式下,设置START位会在当前字节传输结束时触发重起始条件。

一旦发送起始条件,从设备地址将从TXDATA寄存器中进行传输。

从机地址传输

随后,从机地址通过内部移位寄存器被发送至SDA线。 在7位寻址模式下,会发送一个地址字节。 地址字节发送完成后,硬件会自动清除正在进行位(STATUS[4]寄存器)。随后,主设备将等待读取STATUS[2]寄存器中的ACK位,该位用于指示从设备已在SDA线上发出应答握手信号。 主设备可根据所发送从机地址的最低有效位,决定进入发射器模式或接收器模式。 在7位寻址模式中:

  • 要进入发射模式,主设备需发送从设备地址,且最低有效位清零。

  • 要进入接收模式,主设备需发送从设备地址,并将最低有效位(LSB)置为1。

在10位寻址模式中:

  • 要进入发射模式,主设备先发送报头(11110xx0),然后发送从设备地址(其中xx表示地址的两个最高有效位)。

  • 要进入接收模式,主设备先发送帧头(11110xx0),随后发送从设备地址。接着,主设备应再次发送一个重复的起始条件,紧接着是帧头(11110xx1),其中“xx”表示地址的两个最高有效位。

SETUP[5:4]寄存器中的READ或WRITE位指示主设备处于接收器模式还是发送器模式

主机发送器

地址传输完成后,主设备通过内部移位寄存器,将TXDATA寄存器中的字节发送至SDA线。 当接收到确认脉冲时,STATUS寄存器中的ACK位将由硬件自动置位。 如果STATUS[4]寄存器中的BYTE_ON_GOING位被清零,并且有新的数据字节被写入TXDATA寄存器,则主设备将通过设置SETUP[4]寄存器中的WRITE位,从TXDATA寄存器向SDA线发送下一个字节。这如主发送模式图所示。

i2c_master_send_mode

I2C主机发送模式

主机接收器

i2c_master_receive_mode

I2C主机接收模式

地址传输完成后,I2C接口进入主接收模式。在此模式下,接口通过内部移位寄存器,将SDA线上的字节逐个移入RXDATA寄存器,并在每个字节后发送应答脉冲。 当确认脉冲(ACK位为低电平)发送时,表示主设备已发出握手信号,从设备将把下一数据发送到SDA线上。 如果STATUS[4]寄存器中的BYTE_ON_GOING位被清零,并且通过读取RXDATA寄存器获取了一个数据字节,则主设备可通过设置SETUP[5]寄存器中的READ位,向SDA线发送下一个读操作命令。这如主接收模式图所示。

关闭通信: 主设备对从设备发送的最后一个字节返回NACK。收到该NACK后,从设备释放SCL和SDA线的控制权。随后,主设备即可发送停止/重启条件。

I2C 从机模式

为了以从机模式工作,用户必须启用至少一个从机地址。有两个可用的从机地址,可用于编程从机自身的I2C_SLAVE_ADDRESS1和I2C_SLAVE_ADDRESS2寄存器。 一旦检测到START条件,地址便从SDA线接收,并被送入移位寄存器。随后,在SLAVE_ADDRESS1_EN使能时,该地址会与SLAVE_ADDRESS1寄存器中的地址进行比较;在SLAVE_ADDRESS2_EN使能时,则与SLAVE_ADDRESS2寄存器中的地址对比;若SLAVE_ADDRESS1_EN和SLAVE_ADDRESS2_EN均被使能,则同时与SLAVE_ADDRESS1和SLAVE_ADDRESS2寄存器中的地址进行比较;此外,还会与通用呼叫地址(0x0000_0000)进行比较。SLAVE_ADDRESS1寄存器和SLAVE_ADDRESS2寄存器均可通过SLAVE_ADDRESS1_MASK寄存器和SLAVE_ADDRESS2_MASK寄存器进行屏蔽。只要SLAVE_ADDRESS1_MASK寄存器和SLAVE_ADDRESS2_MASK寄存器中至少有一位不为0,SLAVE_ADDRESS1寄存器和SLAVE_ADDRESS2寄存器即被视为有效。

报头或地址不匹配:该接口会忽略它,并等待下一个起始条件。 标头匹配(仅限10位模式):接口生成一个应答脉冲,并等待8位从机地址。 地址匹配成功:接口按顺序生成: 1.该接口会生成一个确认脉冲。 2.软件必须读取RXDATA寄存器,以检查哪个从地址已被确认 在10位模式下,从机在接收到地址序列后始终处于接收模式。当接收到重复的起始条件,并紧接着带有匹配地址位且最低有效位被置为(11110xx1)的头序时,它将进入发送模式。 注意: 在从模式下,SCL周期 Tscl 和 I2C 内核时钟周期 Ti2c_core_clk 必须满足以下条件:Tscl > 10 × Ti2c_core_clk。

i2c_slave_initchart

I2C从机初始化流程

从机发送器

i2c_slave_send_mode

I2C从机发送模式

在接收到地址并清除ADDR后,从机通过内部移位寄存器将TXDATA寄存器中的字节逐个发送到SDA线。在TXDATA寄存器中填满待发送数据之前,从机将持续拉低SCL信号。具体过程如图所示:。 当收到确认脉冲时:

  • STATUS[11] 寄存器的 I2C_SLAVE_TXE 位由硬件自动置位,如果 INT_IE[3] 位已设置,则会生成一个中断,提示软件应将数据字节写入 TXDATA 寄存器。

如果TXDATA寄存器中写入一个数据字节,则从设备将TXDATA寄存器中的下一个字节发送到SDA线上。

从机接收器

i2c_slave_receive_mode

I2C从机接收模式

在完成地址接收并清除ADDR后,从机通过内部移位寄存器将SDA线上的字节逐位移入RXDATA寄存器。具体过程如从机接收模式图所示。 在每个字节之后,接口会依次生成:

  • 如果 ACK 位被置位,则发送一个确认脉冲。

  • I2C_SLAVE_RXF 位由硬件置位,如果 INT_IE[3] 位已设置,则会生成中断。

如果在下一次数据接收结束前未读取RXDATA寄存器中的数据,I2C_SLAVE_RXF位将被置位,接口会一直等待,直至软件通过从RXDATA寄存器中读取数据来获取已接收的数据,同时将SCL信号拉低保持。

关闭从机通信

在传输完最后一个数据字节后,主设备会生成一个STOP条件。 当SDA在第9个时钟脉冲期间保持为高电平(NACK,SETUP[6]=1)时,这被定义为“无应答”信号。 主设备随后可以生成一个STOP条件以中止传输,或生成一个重复的START条件以启动新的传输。

导致生成NACK的条件共有四种: - 1. 总线上不存在与所传地址匹配的接收器,因此没有设备能够发出应答信号。 - 2. 在传输过程中,接收器接收到它无法理解的数据或命令。 - 3. 在传输过程中,接收方将无法再接收任何数据字节。 - 4. 主接收器必须向从发送器发出传输结束信号。 当主设备在总线上发出STOP条件时,BUSY位(STATUS[0])被清零,这表明SCL和SDA线已进入空闲状态。

广播地址

通用调用地址用于同时寻址连接到I2C总线上的每个设备。然而,如果某个设备不需要通用调用结构中提供的任何数据,则可通过不发出应答信号来忽略该地址。若设备确实需要来自通用调用地址的数据,它将对该地址进行应答,并作为从机-接收器模式运行。 当I2C控制器工作在从机模式时,它能够响应通用呼叫复位,将其自身软复位。

i2c_general_call

I2C广播模式

当位B为“零”时,第二个字节具有如下定义:

  • 0000_0110(06h):通用调用复位

接收到此2字节序列后,I2C控制器将生成一个软复位。该复位操作会将I2C控制器的主逻辑重置为空闲状态,并释放SCL和SDA线(上拉状态)。I2C控制器需确保在施加电源电压后,不会将SDA或SCL线拉低,因为这些低电平状态会阻塞总线。

使用 DMA 的连续通信

I2C能够通过DMA继续通信。用于接收缓冲区和发送缓冲区的DMA请求是独立生成的。 注意:DMA控制器的可用性请参考子系统规格。如果子系统中未提供DMA功能,则应按照第6.3节所述,使用I2C接口,即以CPU模式作为发送器或接收器。

i2c_dma_mode

I2C DMA 传输时序图

使用DMA进行传输 可以通过设置I2C_SETUP[0]寄存器中的DMA_EN位,启用DMA模式进行传输。当FIFO为空时,数据将从由DMA外设配置的SRAM区域加载至I2C_TXFIFO;此时,DMA核心将通过SOC总线访问待发送数据。

只有数据通过DMA进行传输。 - 在主模式下:初始化、从机地址、方向、字节数以及START位均由软件编程(传输的从机地址无法通过DMA传输)。当所有数据均采用DMA传输时,必须先初始化DMA,然后再设置START位。 SMBus 特性 - 在从模式下:当所有数据均通过DMA传输时,必须在地址匹配事件之前初始化DMA,或在中断子程序中清除ADDR之前进行初始化。

使用DMA进行接收

可以通过设置I2C_SETUP[0]寄存器中的DMA EN位,启用用于接收的DMA模式。每当接收到一个数据字节时,数据将从I2C_RXFIFO加载至由DMA外设配置的SRAM区域(具体请参考DMA规范)。随后,DMA核心将通过片上总线访问接收数据。 - 在主模式下,初始化、从机地址、方向、字节数以及START位均由软件编程设置。当所有数据均通过DMA传输时,在置位START位之前,必须先初始化DMA。 - 在从模式下,当所有数据均通过DMA传输时,必须在地址匹配事件之前初始化DMA,或者在中断子程序中清除ADDR标志位之前进行初始化。

SMBUS特性

系统管理总线(SMBus)是一种双线接口,通过该接口,各种设备可以相互通信,并与系统其他部分进行交互。它基于I2C的工作原理。SMBus提供了一条用于系统和电源管理相关任务的控制总线。

SMBus 指的是三种类型的设备:

  • 从设备

  • 主设备

  • 主机设备

I2C 可以配置为主设备或从设备,也可作为主机使用。

SMBus 命令协议

该设备支持十一种命令协议。设备可选择使用其中任意一种或全部十一种命令协议进行通信。这些协议包括:快速命令、发送字节、接收字节、写入字节、写入字、读取字节、读取字,进程调用、块读取、块写入以及块写入-块读取进程调用。这些协议应由用户软件实现。

地址解析协议(ARP)

SMBus从设备地址冲突可通过动态为每个从设备分配一个唯一的新地址来解决。为了提供一种机制,以便在地址分配时隔离各设备,每个设备必须实现唯一的设备标识符(UDID)。该128位编号由软件实现。此外,该外设支持地址解析协议(ARP)。通过设置I2C_ADVANCED_SETUP寄存器中的SMDEN位,可启用SMBus设备默认地址(0b1100 001)。ARP命令应由用户软件自行实现。

仲裁功能还以从模式执行,以支持ARP。

从属字节控制

SMBus设备允许在从模式下进行ACK控制。通过设置I2C_ADVANCED_SETUP寄存器中的SBCEN位,可启用从字节控制模式。

主机通知协议

SMBus 设备通过在 I2C_ADVANCED_SETUP 寄存器中设置 SMHEN 位,支持主机通知协议。在这种情况下,主机将确认 SMBus 主机地址(0b0001 000),而 SMBus 设备充当主设备,主机则作为从设备。

SMBus警报

仅限从属设备可通过SMBALERT#向主机发出通信请求信号。主机处理该中断后,会通过警报响应地址(0b0001 100)同时访问所有SMBALERT#设备。只有将SMBALERT#拉低的设备才会确认该警报响应地址。 当配置为从设备(SMHEN=0)时,通过设置I2C_ADVANCED_SETUP寄存器中的ALERTEN位,SMBALERT#引脚会被拉低。同时,警报响应地址功能也将被启用。 当配置为主机(SMHEN=1)时,若检测到SMBALERT#引脚上的下降沿且ALERTEN=1,则I2C_ADVANCED_STATUS寄存器中的ALERT_STUS标志会被置位。如果INT_IE寄存器中的ERR_INE_IE位已设置,将产生中断。而当ALERTEN=0时,即使外部SMBALERT#引脚处于低电平,SMBALERT线仍会被视为高电平。

包错误检测(PEC)

通过在每个消息传输的末尾附加一个包错误代码(PEC)来实现包错误检查。 数据包错误校验(PCE)的计算需使用CRC-8多项式对所有消息字节(除ACK、NACK、START、STOP及重复START位外)进行运算,且必须按照接收位的顺序执行。SMBus设备通过在I2C_ADVANCED_SETUP寄存器中设置PECEN位来支持PCE功能。当设备需要发送或接收PCE时,需启用I2C_ADVANCED_SETUP寄存器中的PECIRQ位。I2C_ADVANCED_STATUS寄存器中的PECBYTE字段用于存储PCE计算结果。

超时

SMBus 规定了最低总线时钟频率 FSMB 为 10 kHz。SMBus 的最大时钟频率则被定义为 100 kHz。 SMBus 规定了 TLOW: SEXT 为从设备的时钟低电平累积扩展时间,而 SMBus 则规定 TLOW: MEXT 为主设备的时钟低电平累积扩展时间。 SMBus 定义了一个时钟低电平超时时间 TTIMEOUT,为 35 毫秒。

寄存器

寄存器偏移及简单描述列表

寄存器名

偏移地址

描述

I2C_RX_SIZE

0x04

接收数据大小寄存器

I2C_RX_CFG

0x08

接收配置寄存器

I2C_TX_SIZE

0x10

发送数据大小寄存器

I2C_TX_CFG

0x14

发送配置寄存器

STATUS

0x24

状态寄存器

I2C_TIMING

0x28

时序控制寄存器

I2C_SETUP

0x2C

设置寄存器

TXDATA

0x30

发送数据寄存器

RXDATA

0x34

接收数据寄存器

INT_IE

0x38

中断使能寄存器

I2C_SLAVE_ADDRESS1

0x3C

从机地址1寄存器

I2C_SLAVE_ADDRESS2

0x44

从机地址2寄存器

I2C_TIME_OUT

0x48

超时控制寄存器

DMA_RX_DATASIZE

0x64

DMA接收数据量寄存器

DMA_TX_DATASIZE

0x68

DMA发送数据量寄存器

TXFIFO_WM_CNT

0x7C

发送FIFO水位计数寄存器

RXFIFO_WM_CNT

0x80

接收FIFO水位计数寄存器

DEBUG

0x98

调试寄存器

IP_VERSION

0x9C

IP版本寄存器

CFG_START_SETUP_TIME

0xA0

START条件建立时间配置寄存器

CFG_START_HOLD_TIME

0xA4

START条件保持时间配置寄存器

CFG_SDA_SETUP_TIME

0xA8

SDA数据建立时间配置寄存器

CFG_SDA_HOLD_TIME

0xAC

SDA数据保持时间配置寄存器

CFG_SCL_HIGH_PERIOD

0xB0

SCL高电平周期配置寄存器

CFG_SCL_LOW_PERIOD

0xB4

SCL低电平周期配置寄存器

CFG_STOP_SETUP_TIME

0xB8

STOP条件建立时间配置寄存器

CFG_BUS_FREE_TIME

0xBC

总线空闲时间配置寄存器

I2C_ADVANCED_SETUP

0x100

高级设置寄存器

I2C_ADVANCED_STATUS

0x104

高级状态寄存器

寄存器详细说明

  • I2C_RX_SIZE

  • 地址偏移: 0x04

字段

位域

属性

复位值

描述

RX_SIZE

19:0

RW

0xf_fff

当 i2c 工作在接收模式时的数据总数。
  • 当软件读取时:返回接收数据的剩余数量。

  • 当软件写入时:设置接收数据的总数。

数据数量单位:字节

Reserved

31:20

/

0x0

/

  • I2C_RX_CFG

  • 地址偏移: 0x08

字段

位域

属性

复位值

描述

RX_DMA_EN

0

RW

0x0

接收 DMA 使能。
  • 1:使能接收 DMA 请求。

  • 0:禁用接收 DMA 请求。

RX_IRQ_EN

1

RW

0x0

接收中断使能。
  • 1:使能接收中断。

  • 0:禁用接收中断。

Reserved

31:2

/

0x0

/

  • I2C_TX_SIZE

  • 地址偏移: 0x10

字段

位域

属性

复位值

描述

TX_SIZE

19:0

RW

0x0

当 i2c 工作在发送模式时的数据总数。
  • 当软件写入时:设置要发送的数据总数。

  • 当软件读取时:返回尚未发送的数据数量。

数据数量单位:字节

Reserved

31:20

/

0x0

/

  • I2C_TX_CFG

  • 地址偏移: 0x14

字段

位域

属性

复位值

描述

TX_DMA_EN

0

RW

0x0

发送 DMA 使能。
  • 1:使能发送 DMA 请求。

  • 0:禁用发送 DMA 请求。

TX_IRQ_EN

1

RW

0x0

发送中断使能。
  • 1:使能发送中断。

  • 0:禁用发送中断。

Reserved

31:2

/

0x0

/

  • STATUS

  • 地址偏移: 0x24

字段

位域

属性

复位值

描述

BUSY

0

RO

0x0

I2C总线忙状态标志:
  • 0: I2C总线空闲

  • 1: I2C总线数据传输正在进行中

ARB_LOST

1

WIC

0x0

I2C仲裁丢失状态标志:
  • 0: 无仲裁丢失错误

  • 1: 发生仲裁丢失错误

NACK_RECEPTION

2

WIC

0x0

I2C总线数据传输阶段(不包括地址阶段)的应答状态位:
  • 0: 在I2C总线上检测到ACK

  • 1: 在I2C总线上检测到NACK

注意:该状态位可通过软件写1清除,或由I2C总线上的STOP 条件自动清除

EOT

3

WIC

0x0

传输结束(End of Transfer)标志:

注意:在从机写模式下,若在PEC模式中重启传输, 此位需要被清除

BYTE_DONE

4

RO

0x0

当一个字节被发送或接收完成时,该位由硬件置位

TIME_OUT

5

WIC

0x0

当SCL线低电平持续时间超过配置值时,该位被置位

Reserved

8:6

/

0x0

/

I2C_SLAVE_RECEIVE

9

RO

0x0

从机接收模式:
  • 1: 主机向从机发送写操作,从机即将从主机读取数据

  • 0: 未发生主机写操作

注意:此位仅在I2C从机模式下使用

I2C_SLAVE_TRANSMIT

10

RO

0x0

从机发送模式:
  • 1: 主机向从机发送读操作,从机即将向主机发送数据

  • 0: 未发生主机读操作

注意:此位仅在I2C从机模式下使用

Reserved

11

/

0x0

/

TXFIFO_EMPTY

12

RO

0x1

发送FIFO为空:
  • 0: 发送FIFO非空

  • 1: 发送FIFO为空

TXFIFO_FULL

13

RO

0x0

发送FIFO为满:
  • 0: 发送FIFO未满

  • 1: 发送FIFO为满

Reserved

14

/

0x0

/

RXFIFO_EMPTY

15

RO

0x1

接收FIFO为空:
  • 0: 接收FIFO非空

  • 1: 接收FIFO为空

RXFIFO_FULL

16

RO

0x0

接收FIFO为满:
  • 0: 接收FIFO未满

  • 1: 接收FIFO为满

Reserved

24:17

/

0x0

/

TXFIFO_WM

25

RO

0x0

发送FIFO达到水印阈值

RXFIFO_WM

26

RO

0x0

接收FIFO达到水印阈值

ADDR_MATCH

27

WIC

0x0

从机地址匹配标志(可通过写1清除)

BERR

28

WIC

0x0

总线错误(例如非法的START/STOP条件)(可通过写1清除)

MASTER_STATE

31:29

RO

0x0

主机状态机当前状态(典型定义,具体以芯片手册为准):
  • 0b000: 空闲(Idle)

  • 0b001: 已生成START条件

  • 0b010: 已发送地址+W

  • 0b011: 已发送地址+R

  • 0b100: 正在进行数据传输

  • 0b101: 等待STOP条件

  • 其他值: 保留

  • I2C_TIMING

  • 地址偏移: 0x28

字段

位域

属性

复位值

描述

PRESC

31:0

RW

0x0a

该字段用于对 i2c_ker_ck 进行预分频,以生成用于以下计数器的时钟周期 PRESC:
  1. start_setup 和 start_hold 计数器

  2. sda_setup 和 sda_hold 计数器

  3. scl_low 和 scl_high 计数器

  4. stop_setup 计数器

  5. bus_free 计数器

t_PRESC = (PRESC+1) * ti2c_clk

注意:PRESC[31:0] 的值应大于 DNF[3:0] 寄存器(0x2C)

  • I2C_SETUP

  • 地址偏移: 0x2C

字段

位域

属性

复位值

描述

WORK_MODE

0

RW

0x0

I2C-Core 工作模式选择:
  • 0: CPU 模式

  • 1: DMA 模式

ENABLE

1

RW

0x0

I2C-Core 在 CPU 模式下的使能状态:
  • 0: I2C-Core 禁用

  • 1: I2C-Core 使能

START

2

RW

0x0

发送 I2C 总线上的起始条件:
  • 0: I2C 总线上的起始条件已结束

  • 1: 发送 I2C 总线上的起始条件

STOP

3

RW

0x0

发送 I2C 总线上的停止条件:
  • 0: I2C 总线上的停止条件已结束

  • 1: 发送 I2C 总线上的停止条件

TRANSFER_DIRECTION

4

RW

0x0

传输方向(主模式):
  • 0: 主机请求写传输

  • 1: 主机请求读传输

注意:当 START 位被置位时,不允许更改此位

Reserved

5

/

0x0

/

ACK

6

RW

0x1

应答位,用于握手,在主/从模式中使用。每次传输后,由起始或停止条件清除。
  • 0: ACK

  • 1: NACK

SOFT_RESET

7

WO

0x0

对 I2C-Core 逻辑的软复位命令。软件写高该位以生成同步脉冲。

注意:软复位是一个脉冲信号,且该位是只写字段

TIME_OUT_ENABLE

8

RW

0x0

SCL 线超时使能:
  • 0: 禁用 SCL 超时

  • 1: 使能 SCL 超时

I2C_10BIT_ADDR_EN

9

RW

0x0

10 位地址模式使能:
  • 0: 禁用 10 位地址模式(7 位模式)

  • 1: 使能 10 位地址模式

Reserved

10

/

0x0

/

ROLE_MODE

11

RW

0x0

I2C 控制器工作于从机或主机模式:
  • 0: 从机模式

  • 1: 主机模式

Reserved

13:12

/

0x0

/

SCL_PULLUP_EN

14

RW

0x1

SCL 线上拉使能:
  • 0: 禁用 SCL 线上拉电阻

  • 1: 使能 SCL 线上拉电阻

SDA_PULLUP_EN

15

RW

0x1

SDA 线上拉使能:
  • 0: 禁用 SDA 线上拉电阻

  • 1: 使能 SDA 线上拉电阻

Reserved

17:16

/

0x0

/

CFG_DNF_NUM

21:18

RW

0x0

这些位用于配置 SDA 和 SCL 输入端的数字滤波器。数字滤波器可以过滤长度最长为 (DNF[3:0]+2) * tI2CCLK 的毛刺。
  • 0: 启用数字滤波器,滤波能力最高达 2 个 tI2CCLK

  • 1: 启用数字滤波器,滤波能力最高达 3 个 tI2CCLK

  • 15: 启用数字滤波器,滤波能力最高达 17 个 tI2CCLK

CFG_AUTO_END

22

RW

0x0

自动结束模式(主模式):
  • 0: 软件结束模式:STOP 条件由软件发送 stop_command(i2c_setup[3]) 触发

  • 1: 自动结束模式:当 TX_SIZE 或 RX_SIZE 数据传输完成或接收完毕时,自动产生 STOP 条件

Reserved

23:22

/

0x0

/

  • TXDATA

  • 地址偏移: 0x30

字段

位域

属性

复位值

描述

TX_DATA

7:0

WO

0x0

发送数据寄存器。
  • 写入数据到 TX FIFO。

Reserved

31:8

/

0x0

/

  • RXDATA

  • 地址偏移: 0x34

字段

位域

属性

复位值

描述

RX_DATA

7:0

RO

0x0

接收数据寄存器。
  • 从 RX FIFO 读取数据。

Reserved

31:8

/

0x0

/

  • INT_IE

  • 地址偏移: 0x38

字段

位域

属性

复位值

描述

EOT_INT_IE

0

RW

0x0

最后传输中断使能:
  • 0: 禁用

  • 1: 使能

ARBITRATION_LOST_INT_IE

1

RW

0x0

总线仲裁丢失中断使能:
  • 0: 禁用

  • 1: 使能

TXFIFO_WM_INT_IE

2

RW

0x0

I2C TX-FIFO 水位中断使能:
  • 0: 禁用

  • 1: 使能

RXFIFO_WM_INT_IE

3

RW

0x0

I2C RX-FIFO 水位中断使能:
  • 0: 禁用

  • 1: 使能

TIME_OUT_ENABLE

4

RW

0x0

SCL 线超时中断使能:
  • 0: 禁用

  • 1: 使能

ADDRESS_MATCHED_INT_IE

5

RW

0x0

地址匹配中断使能:
  • 0: 禁用

  • 1: 使能

NACK_RECEPTION_INT_IE

6

RW

0x0

NACK 接收中断使能:
  • 0: 禁用

  • 1: 使能

Reserved

7

/

0x0

/

ERR_INE_IE

8

RW

0x0

错误中断使能:
  • 0: 禁用

  • 1: 使能

SBC_TCR_INE_IE

9

RW

0x0

从机字节控制传输完成中断使能:
  • 0: 禁用

  • 1: 使能

PEC_BYTE_TC_INE_IE

10

RW

0x0

PEC 字节传输完成中断使能:
  • 0: 禁用

  • 1: 使能

Reserved

31:11

/

0x0

/

  • I2C_SLAVE_ADDRESS1

  • 地址偏移: 0x3C

字段

位域

属性

复位值

描述

SLAVE_ADDR1

9:0

RW

0x0

从机地址 1(支持 7 位或 10 位)。

SLAVE_ADDR1_EN

31

RW

0x3FF

从机地址 1 使能。
  • 1:使能地址 1 响应。

  • 0:禁用。

Reserved

30:10

/

0x0

/

  • I2C_SLAVE_ADDRESS2

  • 地址偏移: 0x44

字段

位域

属性

复位值

描述

SLAVE_ADDR2

9:0

RW

0x0

从机地址 2(支持 7 位或 10 位)。

SLAVE_ADDR2_EN

31

RW

0x3FF

从机地址 2 使能。
  • 1:使能地址 2 响应。

  • 0:禁用。

Reserved

30:10

/

0x0

/

  • I2C_TIME_OUT

  • 地址偏移: 0x48

字段

位域

属性

复位值

描述

TIME_OUT_CNT

15:0

RW

0x0

超时计数值(单位:SCL 周期)。
  • 0:禁用超时检测。

  • 非 0:启用 SMBus 超时。

Reserved

31:16

/

0x0

/

  • DMA_RX_DATASIZE

  • 地址偏移: 0x64

字段

位域

属性

复位值

描述

DMA_RX_SIZE

1:0

RW

0x0

DMA 接收数据长度(字节)。
  • 配置单次 DMA 接收传输的字节数。

Reserved

31:2

/

0x0

/

  • DMA_TX_DATASIZE

  • 地址偏移: 0x68

字段

位域

属性

复位值

描述

DMA_TX_SIZE

1:0

RW

0x0

DMA 发送数据长度(字节)。
  • 配置单次 DMA 发送传输的字节数。

Reserved

31:2

/

0x0

/

  • TXFIFO_WM_CNT

  • 地址偏移: 0x7C

字段

位域

属性

复位值

描述

TX_WM_CNT

1:0

RW

0x0

发送 FIFO 水位线计数。
  • 触发 TX DMA/中断的阈值。

  • 0:1 字节;1:2 字节(FIFO 深度为 2)。

Reserved

31:2

/

0x0

/

  • RXFIFO_WM_CNT

  • 地址偏移: 0x80

字段

位域

属性

复位值

描述

RX_WM_CNT

1:0

RW

0x0

接收 FIFO 水位线计数。
  • 触发 RX DMA/中断的阈值。

  • 0:1 字节;1:2 字节(FIFO 深度为 2)。

Reserved

31:2

/

0x0

/

  • DEBUG

  • 地址偏移: 0x98

字段

位域

属性

复位值

描述

STATUS

14:0

RO

3

I2C 内部信号,用于系统调试

Reserved

31:15

/

0x0

/

  • IP_VERSION

  • 地址偏移: 0x9C

字段

位域

属性

复位值

描述

IP_VER

31:0

RO

0x03000002

IP 版本号。
  • 高 16 位:主版本。

  • 低 16 位:次版本。

  • CFG_START_SETUP_TIME

  • 地址偏移: 0xA0

字段

位域

属性

复位值

描述

START_SETUP_TIME

31:0

RW

0x32

该字段用于在主模式下生成 SCL 高电平与 SDA 下降沿之间的延迟 (tSU:STA):

SCL 高电平将在 SDA 下降沿之前保持一段时间。 tsu_start = (CFG_START_SETUP_TIME+1) * t_PRESC

  • CFG_START_HOLD_TIME

  • 地址偏移: 0xA4

字段

位域

属性

复位值

描述

START_HOLD_TIME

31:0

RW

0x32

该字段用于在主模式下生成 SDA 下降沿与 SCL 下降沿之间的延迟 (tHD:STA):

SCL 高电平将在 SDA 下降沿之后保持一段时间。 t_hd_start = (CFG_START_HOLD_TIME+1) * t_PRESC

  • CFG_SDA_SETUP_TIME

  • 地址偏移: 0xA8

字段

位域

属性

复位值

描述

SDA_SETUP_TIME

31:0

RW

0x5

该字段用于在主模式或从模式下,生成 SDA 边缘与 SCL 上升沿之间的延迟 (tSU:DAT):

t_su_dat = (CFG_SDA_SETUP_TIME+1) * t_PRESC

Note: 此字段应配置为 SCL 低电平周期减去从模式下的实际建立时间。

  • CFG_SDA_HOLD_TIME

  • 地址偏移: 0xAC

字段

位域

属性

复位值

描述

SDA_HOLD_TIME

31:0

RW

0x4

该字段用于在主模式或从模式下,生成 SDA 边缘与 SCL 下降沿之间的延迟 (tHD:DAT):

t_su_dat = (CFG_SDA_HOLD_TIME+1) * t_PRESC

  • CFG_SCL_HIGH_PERIOD

  • 地址偏移: 0xB0

字段

位域

属性

复位值

描述

SCL_HIGH_PERIOD

31:0

RW

0x32

该字段用于在主模式下生成 SCL 高电平周期:

tSCLH = (CFG_SCL_HIGH_PERIOD+1) * t_PRESC.

  • CFG_SCL_LOW_PERIOD

  • 地址偏移: 0xB4

字段

位域

属性

复位值

描述

SCL_LOW_PERIOD

31:0

RW

0x32

该字段用于在主模式下生成 SCL 低电平周期:

tSCLL = (CFG_SCL_LOW_PERIOD+1) * t_PRESC.

  • CFG_STOP_SETUP_TIME

  • 地址偏移: 0xB8

字段

位域

属性

复位值

描述

STOP_SETUP_TIME

31:0

RW

0x32

该字段用于在主模式下生成 STOP 设置时间 (tSU:STO),其测量单位为 t_PRESC:

tSU:STO = (CFG_STOP_SETUP_TIME+1) * t_PRESC.

  • CFG_BUS_FREE_TIME

  • 地址偏移: 0xBC

字段

位域

属性

复位值

描述

BUS_FREE_TIME

31:0

RW

0x32

该字段用于在主模式下生成 STOP 和 START 条件之间的 BUS FREE 时间 (tBUF):

tBUF = (CFG_BUS_FREE_TIME+1) * t_PRESC.

  • I2C_ADVANCED_SETUP

  • 地址偏移: 0x100

字段

位域

属性

复位值

描述

Reserved

0

/

0x0

/

SBCEN

1

RW

0x0

从设备字节控制模式使能:
  • 0: 禁用从设备字节控制模式

  • 1: 启用从设备字节控制模式

PECCN

2

RW

0x0

包校验检查使能:
  • 0: 禁用包校验检查

  • 1: 启用包校验检查

PECIRQ

3

W1S

0X0

包校验检查字节请求标志:
  • 0: 关闭包校验检查字节的传输

  • 1: 请求传输包校验检查字节

Note: 写入 0 是无效操作。 注意:当 continuous=1 时,此位无效。 当 sbc=1 时,此位无效。 此位在 PEC 传输完成后由硬件清除。

SMDEN

4

RW

0x0

SMBus 默认地址使能:
  • 1: 启用默认地址

  • 0: 禁用默认地址

SMHEN

5

RW

0x0

SMBus 主机地址使能:
  • 1: 启用主机地址

  • 0: 禁用主机地址

TIDLEN

6

RW

0x1

SMBus IDLE 超时或 SCL 低电平超时使能:
  • 1: 启用 IDLE 超时

  • 0: 启用 SCL 低电平超时

TEXTEN

7

RW

0x0

SMBus 拉伸 SCL 低电平超时使能:
  • 1: 启用

  • 0: 禁用

TEXT_NUM

19:8

RW

0x0

拉伸 SCL 低电平超时数值:

tEXT=(TEXT_NUM + 1) * t_PRESC

ALERTEN

20

RW

0x0

SMBus 警报发送使能:
  • 1: 启用

  • 0: 禁用

Reserved

31:21

/

0x0

/

  • I2C_ADVANCED_STATUS

  • 地址偏移: 0x104

字段

位域

属性

复位值

描述

PECERR

0

WIC

0x0

包校验错误状态:
  • 0: 正确的 PEC

  • 1: 错误的 PEC

PECBYTE

8:1

RO

0X0

包校验字节请求标志。

ALERT_STUS

9

WIC

0x0

SMBus 警报状态:
  • 1: 检测到 SMBus 警报

  • 0: 未检测到 SMBus 警报

SBC_TCR

10

WIC

0x0

从机控制传输完成标志:
  • 1: 传输完成

  • 0: 传输未完成

PEC_BYTE_TC

11

WIC

0x0

PEC 字节控制传输完成标志:
  • 1: 传输完成

  • 0: 传输未完成