I3C
简介
改进型内部集成电路 (I3C) 是 MIPI 联盟定义的一组通信协议的一部分。该规范的开发旨在通过为传感器提供快速、低成本、低功耗的双线数字接口,简化移动无线产品中的传感器系统设计架构。
MIPI I3C 主控制器是一个数字核心,实现了 MIPI I3C 规范中定义的与主主控制器相关的所有协议功能。MIPI_I3C 核心在系统(应用)和 I3C 接口之间提供了一个接口,允许与 I3C 设备和传统 I2C 设备(从设备)进行通信,但存在 MIPI I3C 规范中指定的限制。
双角色 MIPI_I3C 控制器可以通过处理器接口 (ICB) 配置为 I3C 主主控制器或 I2C 主设备/从设备。该控制器满足 MIPI I3C 规范中规定的 I3C 协议和 I2C 协议的要求。
系统框图
I3C 系统确保可靠的数据发送和接收。I3C 接口旨在改进 I2C 接口的特性,同时保持向后兼容性(但存在一些限制,例如不支持时钟拉伸)。
I3C 协议支持不同角色的设备,如下所示:
主主控制器
次级主控制器
I3C 从设备
I2C 从设备
主主控制器是一种专业的主控制器,在上电复位后启动,负责为连接到 I3C 总线的每个 I3C 设备分配动态地址。次级主控制器是一个能够同时充当主设备和从设备的 I3C 实例。它在上电复位后作为从设备启动。次级主控制器必须获得 I3C 总线的所有权才能成为当前主控制器,然后才能向其关联的从设备发起任何传输。
标准符合性
MIPI_I3C 控制器符合以下标准:
MIPI 联盟改进型内部集成电路规范,版本 1.0 - 2018年7月19日
I2C-BUS 规范和用户手册,Rev. 6 - 2014年4月4日
主要特性
I3C 的主要特性如下:
双线 I3C 串行接口 - 由串行数据线 (SDA) 和串行时钟线 (SCL) 组成
仅支持主主控制器角色,该角色发送大部分 I3C 命令 (CCC),寻址所有从设备(广播 CCC)或特定的单个从设备(定向 CCC)
仅支持单数据率消息传输 (SDR)
广播消息,发送给总线上的所有 I3C 从设备
定向消息,寻址到特定的从设备
主模式下的时钟停滞支持
硬件辅助的动态地址分配 (DAA)
检测由于传入 IBI 导致的仲裁丢失,并随后重新传输命令
带内中断(无有效载荷)处理
支持 DMA 访问以实现多数据通信
RX 和 TX 的 FIFO 大小可在 RTL 级别配置
整个 I3C 控制器设计同步于一个时钟域:ICB_CLK
MIPI_I3C 控制器支持 I2C 规范的以下通用特性:
并行总线/I2C 协议转换器
主设备和从设备能力:同一接口可以充当主设备或从设备
I2C 主设备特性: - 时钟生成 - 起始和停止条件生成
I2C 从设备特性: - 可编程的 I2C 地址检测 - 停止位检测
7位/10位寻址的生成和检测
支持最多两个从设备地址响应(均具有可配置的掩码字段)
支持通用呼叫软件复位
支持不同的通信速度: - 标准速度 (最高 100 kHz) - 快速速度 (最高 400 kHz) - 快速模式增强版 (最高 1 MHz)
状态标志: - 发送器/接收器模式标志 - 字节传输结束标志 - I2C 忙标志
时钟拉伸能力: - TX 数据未就绪 - RX 数据未被 CPU 或 DMA 核心读取
支持通过 DMA 控制器进行 DMA 访问,用于高速数据通信
SMBus 规范 rev 2.0 兼容性: - 硬件 PEC(数据包错误检查)生成和验证,带 ACK 控制 - 支持地址解析协议 (ARP) - 支持主机和从设备设备 - 支持 SMBus 警报 - 支持超时和空闲条件检测
PMBus rev 1.1 标准兼容性
功能描述
MIPI_I3C 核心接口描述
MIPI_I3C 控制器具有以下接口:
ICB(内部芯片总线)从设备接口
用于外部 IO 连接的 I3C SDA/SCL IO 接口
中断接口
用于外部 DMA 核心的 DMA 握手和配置接口
MIPI_I3C 内部模块描述
本节描述了 I3C 模块框图 (图 6.1) 中所示的内部模块。
寄存器块模块
I3C 寄存器块包含所有 mipi_i3c 寄存器。mipi_i3c 中的所有寄存器都是 32 位宽。mipi_i3c 中的寄存器接口用于为不同的总线模式、时序参数以及中断的启用/禁用来编程控制器。
寄存器接口还用于向控制器传输命令和 Tx 数据,以及从控制器接收 Rx 数据和响应。
中断控制模块
中断控制模块将中断使能为一个单一引脚。中断的生成和清除基于中断寄存器设置。
DMA 访问控制模块
DMA 访问控制模块负责基于 Tx-FIFO 和 Rx-FIFO 的占用水平来断言和取消断言 DMA 握手接口。
CFG 控制模块
CFG 控制块是一个状态机,控制 mipi_i3c 在当前主控制器模式下的发送和接收操作。该模块从应用接口检索命令,并指示发送和接收总线控制块进行相应的操作。
总线控制模块和从设备控制模块
总线控制块用于控制主设备 (I3C/I2C) 和 I2C 从设备的与协议相关的发送或接收信号(包括时序信号),并用于仲裁丢失检查。
主控制器功能 MIPI_I3C 内部模块
MIPI I3C 核心中主控制器角色概述
MIPI I3C 倡导分层总线架构,在任何给定时间只有一个主控制器(当前主控制器)控制 I3C 总线。I3C 总线上必须有一个主主控制器,可以有选择地拥有次级主控制器。
主控制器转变为当前主控制器的过程基于总线拓扑:
单主控制器系统 - 主主控制器始终是当前主控制器,因为它是单主控制器系统中唯一的主控制器。
多主控制器系统 - 在总线初始化期间,主主控制器是当前主控制器;之后,任何次级主控制器都可以基于主控制器请求和主控制器权限移交机制成为当前主控制器。
Nuclei MIPI_I3C 核心始终充当主主控制器,在上电后拥有 I3C 总线。这意味着 MIPI_I3C 核心驱动 SCL 线并在 SDA 线上发起传输。
动态地址分配 (DAA)
DAA 概述
Nuclei_MIPI_I3C 核心作为主主控制器,负责执行动态地址分配 (DAA) 过程,为连接到 I3C 总线的每个 I3C 设备提供唯一的动态地址。主主控制器在以下条件下为设备提供动态地址:
在 I3C 总线初始化时。
当设备连接到已配置的 I3C 总线时(通过热加入或其他方法指示)。
一旦设备接收到动态地址,这个分配的动态地址将在设备后续在 I3C 总线上的所有事务中使用。
DAA 方法描述
SETDASA 过程(格式 1:主要)
主主控制器使用定向命令码 - 从静态地址设置动态地址 (SETDASA) 为任何已知静态地址的 I3C 设备分配动态地址。这比使用 ENTDAA 过程更快。SETDASA 过程在系统冷启动后由主主控制器启动。
以下流程描述了使用 SETDASA 过程的动态地址分配:
应用程序初始化 MIPI_I3C 控制器。
应用程序按如下所示编程寄存器。
2.1 编程 SETUP[2] 寄存器以在 SCL 和 SDA 总线上生成 START 条件。 2.2 使用 8’hFC 编程 TXDATA[7:0] 寄存器,这表示 SETDASA 过程的 7’h7E + W。 2.3 等待从设备将 SDA 拉低 (STATUS[2] = 0),这表示从设备确认命令数组 (7’h7E + W)。 2.4 使用
SETDASA CCC编程 TXDATA[7:0] 寄存器,编程 SETUP[16] 以使能奇偶校验位可以自动插入到 SDA 总线。 2.5 编程 SETUP[2] 寄存器以在 SCL 和 SDA 总线上生成重新开始条件。 2.6 使用特定从设备地址 + W 编程 TXDATA[7:0] 寄存器。 2.7 等待从设备确认其自身地址 (STATUS[2] == 0)。 2.8 使用特定从设备地址 + W 编程 TXDATA[7:0] 寄存器。 2.9 等待从设备确认此动态地址 (STATUS[2] == 0)。 2.10 使用动态地址编程 TXDATA[7:0] 寄存器,并编程 SETUP[16] 以使能奇偶校验位可以自动插入到 SDA 总线。 2.11 编程 SETUP[2] 寄存器(发送 START 条件)以重新开始动态地址分配,或编程 SETUP[3] 寄存器(发送 STOP 条件)以完成动态地址分配。
ENTDAA 过程
主主控制器使用广播命令码 - 进入动态地址分配 (ENTDAA) 为任何之前未分配动态地址的 I3C 设备分配动态地址。此过程在冷启动后、完成使用 SETDASA 过程为静态地址设备进行动态地址分配之后,或者如果从任何 I3C 设备接收到热加入请求时,由主主控制器启动。
以下流程描述了使用 ENTDAA 过程的动态地址分配:
应用程序初始化 MIPI_I3C 控制器。
编程 SETUP[2] 寄存器以在 SCL 和 SDA 总线上生成 START 条件。
使用 8’hFC 编程 TXDATA[7:0] 寄存器,这表示 SETDASA 过程的 7’h7E + W。
等待从设备确认 (STATUS[2] == 0) 此广播地址 (7’h7E)。
使用 I3C 模式广播 CCC (ENTDAA) 和 T 位编程 TXDATA[7:0] 寄存器,编程 SETUP[16] 以使能奇偶校验位可以自动插入到 SDA 总线。
编程 SETUP[2] 寄存器(发送 START 条件)以重新开始动态地址分配,并使用 8’hFD 编程 TXDATA[7:0] 寄存器,这表示 SETDASA 过程的 7’h7E + R。
等待从设备确认 (STATUS[2] == 0) 广播地址 (7’h7E)。
编程 SETUP[10] 以使 MIPI_I3C 核心发送 64 个 SCL 并完成 8 字节数据读取,同时保持 SDA 线拉高。
使用动态地址编程 TXDATA[7:0] 寄存器,并编程 SETUP[16] 以使能奇偶校验位可以自动插入到 SDA 总线。
等待从设备确认此动态地址 (STATUS[2] == 0)。
主主控制器应重复此过程,跳回步骤 4,直到 I3C 总线上没有任何设备发出 ACK。
此动态地址分配过程应由主主控制器发出 STOP 来结束。
主模式下的带内中断 (IBI) 流程
I3C 非当前主控制器设备可以通过带内中断 (IBI) 向当前主控制器发起通信。在 MIPI_I3C 配置为主主控制器的情况下,I3C 总线上可能出现以下类型的 IBI:
热加入请求
从设备中断请求
来自次级主控制器的主控制器所有权请求
热加入请求的检测和处理
热加入请求是通用类型(保留地址 7’b000_0010),因此在设备控制寄存器中有一个单比特控制位 (SETUP[6]) 可用于控制响应。当控制位设置为 0 时,MIPI_I3C 控制器对所有热加入请求响应 ACK 并生成 IBI 中断 (STATUS[7] 为 “1”)。该响应进入 IBI 队列,通知应用程序采取必要行动(发出 ENTDAA 命令)。当控制位设置为 1 时,MIPI_I3C 控制器对所有热加入请求响应 NACK,并且也会生成 IBI 中断 (STATUS[7] 为 “1”)。
从设备中断请求的检测和处理
为了请求中断,I3C 从设备应在起始条件(但不是重复起始条件之后)之后,将其地址发送到仲裁的地址头中。如果在总线可用条件下没有出现起始条件,则 I3C 从设备可以通过拉低 SDA 线发出起始条件,然后等待当前主控制器拉低 SCL。
当控制位 (SETUP[6]) 设置为 0 时,MIPI_I3C 控制器对接收到的 SIR 响应 ACK 并生成 IBI 状态响应。当控制位设置为 1 时,MIPI_I3C 控制器对接收到的 SIR 响应 NACK。
主控制器请求的检测和处理
当 I3C 次级主控制器请求成为当前主控制器时:
为了执行请求,I3C 次级主控制器应等待起始条件(不是重复起始条件)或总线可用条件,并发出自己的起始条件。
在起始条件之后,I3C 次级主控制器应在 I3C 总线上发出自己的动态地址,后跟 RnW 位为 0,以请求成为当前主控制器。
如果 I3C 次级主控制器通过拥有较低的动态地址赢得仲裁,并且如果当前主控制器当前愿意将主控制器权限让给请求者,则当前主控制器应响应 ACK。
在 ACK 之后,当前主控制器可以发出一个或多个命令,然后应发出 GETACCMST CCC 后跟 STOP,此时它释放对 SCL 线的控制。
在 STOP 和总线可用条件之后,I3C 次级主控制器承担当前主控制器的角色并控制 I3C 总线。
当控制位 (SETUP[6]) 设置为 0 时,MIPI_I3C 控制器对接收到的 Master-Request 响应 ACK 并生成 IBI 状态响应。当控制位设置为 1 时,MIPI_I3C 控制器对接收到的 Master-Request 响应 NACK 并生成 IBI 状态响应。
I2C 模式描述
除了接收和发送数据外,此接口还将其从串行转换为并行格式,反之亦然。中断由软件启用或禁用。该接口通过数据引脚 (SDA) 和时钟引脚 (SCL) 连接到 I2C 总线。它可以连接到标准(最高 100 kHz)、快速(最高 400 kHz)、快速增强版(最高 1 MHz)或高速模式(最高 3.4 MHz)的 I2C 总线。
模式选择
该接口可以在以下四种模式之一运行:
主发送器
主接收器
从发送器
从接收器
默认情况下,它在主模式下运行,可以向 I2C 从设备外设生成 START 或 STOP 条件,并允许多主控制器能力。该接口可以通过设置 SETUP[11] 寄存器从主模式切换到从模式。
通信流程
在主模式下,I2C 接口发起数据传输并生成时钟信号。串行数据传输总是以起始条件开始,以停止条件结束。起始和停止条件都在主模式下由软件生成。
在从模式下,该接口能够识别其自身的双地址(7 位或 10 位)以及通用呼叫地址。
数据和地址作为 8 位字节传输,MSB 优先。起始条件之后的第一个字节包含地址(7 位模式下为一个,10 位模式下为两个)。地址总是在主模式下传输。
一个字节传输的 8 个时钟周期之后是第 9 个时钟脉冲,在此期间接收器必须向发送器发送一个确认位。
确认可以由软件启用或禁用。I2C 接口地址(双地址 7 位/10 位和/或通用呼叫地址)可以通过软件选择。
I2C 接口的框图如 I2C 模块框图 (图 6.6) 所示。
I2C 初始化
启用和禁用外设:
I2C 外设时钟必须在时钟控制器中配置和启用。
在通过设置 SETUP 寄存器中的 CFG_DNF_NUM 启用 I2C 之前,必须配置数字滤波器。
然后可以通过设置 SETUP 寄存器中的 ENABLE 位来启用 I2C。
注意:I2C 外设可以使用配置寄存器的默认值工作。用户无需再配置时序。
注意:当 I2C 传输正在工作时,不允许更改时序配置。
软件复位
可以通过设置 SETUP 寄存器中的 SOFT_RESET 位来执行软件复位。在这种情况下,I2C 线路 SCL 和 SDA 被释放。内部状态机被复位,通信控制位以及状态位恢复为其复位值。配置寄存器不受影响。
当软件设置 SETUP[7] 时,将生成一个软复位脉冲并立即复位 I2C 控制器。
主控制器 SCL 和 SDA 时序
I2C 总线时序特性在 I2C 协议时序生成 (图 6.8) 中给出。必须配置时序以保证正确的数据保持和建立时间,用于主模式和从模式。这通过编程以下时序寄存器来完成:
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,快速模式增强版为 1000 kbit/s。
必须配置时序以保证正确的数据保持和建立时间,用于主模式和从模式。
符号 |
参数 |
时序寄存器 |
|---|---|---|
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_TIMING.PRESC[31:0],它是 icb_clk 的预分频器。
I2C 主模式
在主模式下,I2C 接口发起数据传输并生成时钟信号。串行数据传输总是以 START 条件开始,以 STOP 条件结束。主模式是随着 START 位在总线上生成 START 条件而选择的。
以下是主 CPU 模式下的主要所需序列:
编程时序寄存器以生成正确的 I2C 时序
通过使能 SETUP[11] 寄存器中的 ROLE_MODE 位来配置 I2C 控制器在主模式下工作
编程 SETUP[1] 寄存器中的 ENABLE 位以启用 I2C 控制器
设置 SETUP[2] 寄存器中的 START 位以生成 START 条件
配置 TXDATA 寄存器
编程 SETUP[5:4] 寄存器中的 WRITE 或 READ 位以使主设备工作在发送器模式或接收器模式
当 STATUS[4] 中的 BYTE_ON_GOING 位为低电平时,表示字节传输完成
START 和 STOP 条件
所有事务都以 START (S) 开始,并以 STOP (P) 终止。当 SCL 为高电平时,SDA 线上从高电平到低电平的转换定义了 START 条件。当 SCL 为高电平时,SDA 线上从低电平到高电平的转换定义了 STOP 条件。
设置 START 位会导致接口在 SDA 和 SCL 线上生成起始条件。
在最后一个字节写入 TXDATA 寄存器后,由软件设置 STOP 位以生成 STOP 条件。
START 和 STOP 条件总是由主设备生成。总线在 START 条件之后被视为繁忙。I2C 控制器在 STOP 条件之后的一定时间后被视为再次空闲。
从设备地址传输
一旦发送了起始条件,从设备地址将从 TXDATA 寄存器发送。
然后从设备地址通过内部移位寄存器发送到 SDA 线。
在 7 位寻址模式下,发送一个地址字节。
一旦地址字节发送完毕,字节进行中位 (STATUS[4] 寄存器) 被硬件清除。然后主设备等待读取 STATUS[2] 寄存器中的 ACK 位,该位指示从设备在 SDA 线上发送握手信号。
主发送器模式
在地址传输之后,主设备从 TXDATA 寄存器发送字节到 SDA 线,通过内部移位寄存器。
当接收到确认脉冲时,STATUS 寄存器中的 ACK 位由硬件设置。
如果 STATUS[4] 寄存器中的 BYTE_ON_GOING 位被清除并且新的数据字节写入 TXDATA 寄存器,则主设备通过设置 SETUP[4] 寄存器中的 WRITE 位,将下一个字节从 TXDATA 寄存器发送到 SDA 线。
主接收器模式
在地址传输之后,I2C 接口进入主接收器模式。在此模式下,接口从 SDA 线接收字节到 RXDATA 寄存器,通过内部移位寄存器。并在每个字节后发送确认脉冲。
当发送确认脉冲(ACK 位为低电平)时,表示主设备发送握手信号,从设备将发送下一个数据到 SDA 线。
如果 STATUS[4] 寄存器中的 BYTE_ON_GOING 位被清除并且通过读取 RXDATA 寄存器获取了一个数据字节,则主设备可以通过设置 SETUP[5] 寄存器中的 READ 位,向 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) 进行比较。
从发送器模式
在地址接收和清除 ADDR 之后,从设备从 TXDATA 寄存器发送字节到 SDA 线,通过内部移位寄存器。从设备拉伸 SCL 为低电平,直到 TXDATA 填充了要发送的数据。
当接收到确认脉冲时:
STATUS[11] 寄存器中的 I2C_SLAVE_TXE 位由硬件设置,并且如果 INT_IE[3] 位置位则生成中断,这指示软件应将数据字节填充到 TXDATA 寄存器中。
如果数据字节写入 TXDATA 寄存器,则从设备将下一个字节从 TXDATA 寄存器发送到 SDA 线。
从接收器模式
在地址接收和清除 ADDR 之后,从设备从 SDA 线接收字节到 RXDATA 寄存器,通过内部移位寄存器。
在每个字节之后,接口按顺序生成:
如果 ACK 位置位,则生成确认脉冲
I2C_SLAVE_RXF 位由硬件设置,并且如果 INT_IE[3] 位置位则生成中断
如果在下一个数据接收结束之前未读取 RXDATA 寄存器中的数据,则 I2C_SLAVE_RXF 位置位,并且接口等待软件通过从 RXDATA 寄存器读取来获取接收到的数据,同时拉伸 SCL 为低电平。
通用呼叫地址
通用呼叫地址用于同时寻址连接到 I2C 总线的每个设备。
当 I2C 控制器在从模式下工作时,它可以响应通用呼叫复位作为自身的软复位。
当接收到 2 字节序列时,I2C 控制器将生成软复位。通用呼叫复位将 I2C 控制器的主逻辑复位到空闲状态并释放 SCL 和 SDA 线(上拉)。
I3C 私有 DMA 控制器
I3C 控制器在开始以传输或接收模式工作时,可以使用私有 DMA 控制器访问内存。也就是说,CPU 或 SoC 上的任何其他主设备在适当的内存位置准备感兴趣的数据(或在接收数据场景下准备足够的内存空间)。
通过编程 I3C 控制器的相应 CMD_TX/DATA_TX/DATA_RX 使能位,可以启用 DMA 传输,前提是所有其他配置寄存器(如基地址、传输大小等)已正确配置。
总共支持 3 个通道传输(CMD_TX/DATA_TX/DATA_RX),可以通过编程 I3C 控制器内的相应配置和控制位来实现。为了避免一个通道的数据传输持续占用物理总线,3 个通道遵循循环仲裁方案。
使用 DMA 的连续通信
I2C 能够使用 DMA 继续通信。CMD 缓冲区、RX 缓冲区和 TX 缓冲区的 DMA 请求是独立生成的。
[31:24] |
[23:0] |
|---|---|
CMD 代码 |
参数 |
CMD 名称 |
OP 代码 |
CMD 描述 |
|---|---|---|
I2C_CMD_START |
32’h0000_0000 |
I2C 传输开始命令 |
I2C_CMD_STOP |
32’h1000_0000 |
I2C 传输结束命令 |
I2C_CMD_RD_ACK |
32’h2000_0000 |
I2C 接收数据并确认命令 |
I2C_CMD_RD_NACK |
32’h3000_0000 |
I2C 接收数据并不确认命令 |
I2C_CMD_WR |
32’h4000_0000 |
I2C 发送数据并等待确认命令 |
I2C_CMD_WAIT |
32’h5000_0000 |
I2C 等待虚拟周期命令 |
I2C_CMD_RPT |
32’h6000_0000 |
I2C 下一个命令重复命令 |
I2C_CMD_CFG |
32’h7000_0000 |
I2C 配置命令 |
I2C_CMD_WAIT_EV |
32’h0800_0000 |
I2C 等待 DMA 外部事件命令 |
I2C_CMD_WRB |
32’h3800_0000 |
I2C 写字节命令 |
I2C_CMD_EOT |
32’h4800_0000 |
信号传输结束 |
I2C_CMD_SETUP_UCA |
32’h1800_0000 |
设置 RX 或 TX 通道起始地址 |
I2C_CMD_SETUP_UCS |
32’h2800_0000 |
设置 RX 或 TX 通道传输大小+使能 |
SMBus 特性
系统管理总线 (SMBus) 是一个双线接口,各种设备可以通过它与彼此以及系统的其余部分通信。它基于 I2C 操作原理。SMBus 为系统和电源管理相关任务提供控制总线。
SMBus 涉及三种类型的设备:
从设备
主设备
主机设备
I2C 可以配置为主设备或从设备,也可以配置为主机。
SMBus 命令协议
设备支持十一种命令协议。设备可以使用这十一种命令协议中的任何一种或全部进行通信。
地址解析协议 (ARP)
SMBus 从设备地址冲突可以通过为每个从设备动态分配新的唯一地址来解决。
从设备字节控制
SMBus 设备允许在从模式下进行 ACK 控制。
主机通知协议
SMBus 设备通过设置 I2C_ADVANCED_SETUP 寄存器中的 SMHEN 位来支持主机通知协议。
SMBus 警报
仅从设备可以通过 SMBALERT# 向主机发出信号,表示它想要通信。
数据包错误检查 (PEC)
数据包错误检查是通过在每条消息传输末尾附加数据包错误代码 (PEC) 来实现的。
超时
SMBus 定义了 10 KHz 的最小总线时钟频率 F5MB。SMBus 的最大时钟频率定义为 100 KHz。
中断
中断标志 |
使能控制位 |
|---|---|
i2c_eot |
int_ie[0] |
i2c_arlost |
int_ie[1] |
i2c_slave_txe_int |
int_ie[2] |
i2c_slave_rxf_int |
int_ie[3] |
i2c_timeout_int |
int_ie[4] |
i3c_sir_int(slave_request_int) |
int_ie[5] |
i3c_hjr_int(hot_join_request_int) |
int_ie[5] |
i3c_smr_int(second_master_request_int) |
int_ie[5] |
i2c_dma_cmd_load_status |
int_ie[6] |
i2c_dma_rx_en_load_status |
int_ie[7] |
i2c_dma_tx_en_load_status |
int_ie[8] |
I3C 寄存器
偏移地址 |
寄存器名称 |
功能描述 |
|---|---|---|
0x24 |
STATUS |
I2C 状态寄存器 |
0x28 |
I2C_TIMING |
时序预分频器 |
0x2C |
I2C_SETUP |
I2C 设置配置寄存器 |
0x30 |
TXDATA |
发送数据寄存器 |
0x34 |
RXDATA |
接收数据寄存器 |
0x38 |
INT_IE |
中断使能寄存器 |
0x3C |
I2C_SLAVE_ADDRESS1 |
从设备地址 |
0x44 |
I2C_SLAVE_ADDRESS2 |
从设备地址 |
0x48 |
I2C_TIME_OUT |
SCL 超时计数 |
0x4C |
I3C_PID_LOW |
从设备临时 ID[31:0] |
0x50 |
I3C_PID_HIGH |
从设备临时 ID[47:32] |
0x54 |
I3C_MASTER_BCR |
I3C 主设备总线特性寄存器 |
0x58 |
I3C_MASTER_DCR |
I3C 主设备设备特性寄存器 |
0x5C |
I3C_TSCO |
I3C 设置时序 |
0x64 |
DMA_RX_DATASIZE |
DMA RX 通道数据大小 |
0x68 |
DMA_TX_DATASIZE |
DMA TX 通道数据大小 |
0x7C |
TXFIFO_WM_CNT |
TXFIFO 水位线级别 |
0x80 |
RXFIFO_WM_CNT |
RXFIFO 水位线级别 |
0x98 |
DEBUG |
用于系统调试的 I2C 内部信号 |
0x9C |
IP_VERSION |
I2C 控制器的 IP 版本 |
0xA0 |
CFG_START_SETUP_TIME |
START 建立时间 |
0xA4 |
CFG_START_HOLD_TIME |
START 保持时间 |
0xA8 |
CFG_SDA_SETUP_TIME |
SDA 建立时间 |
0xAC |
CFG_SDA_HOLD_TIME |
SDA 保持时间 |
0xB0 |
CFG_SCL_HIGH_PERIOD |
SCL 高电平周期(主模式) |
0xB4 |
CFG_SCL_LOW_PERIOD |
SCL 低电平周期(主模式) |
0xB8 |
CFG_STOP_SETUP_TIME |
STOP 建立时间 |
0xBC |
CFG_BUS_FREE_TIME |
STOP 和 START 条件之间的总线空闲时间 |
0xC0 |
I2C_RX_SADDR |
RX 缓冲区基地址 |
0xC8 |
I2C_RX_SIZE |
RX 缓冲区大小(字节) |
0xCC |
I2C_RX_CFG |
RX 通道配置 |
0xD0 |
I2C_TX_SADDR |
TX 缓冲区基地址 |
0xD8 |
I2C_TX_SIZE |
TX 缓冲区大小(字节) |
0xDC |
I2C_TX_CFG |
TX 通道配置字段 |
0xE0 |
I2C_CMD_SADDR |
CMD 缓冲区基地址 |
0xE8 |
I2C_CMD_SIZE |
CMD 缓冲区大小(字节) |
0xEC |
I2C_CMD_CFG |
CMD 通道配置字段 |
0x100 |
I2C_ADVANCED_SETUP |
I2C 高级特性设置配置寄存器 |
0x104 |
I2C_ADVANCED_STATUS |
I2C 高级特性状态寄存器 |
寄存器描述
STATUS 寄存器
偏移地址: 0x24
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
BUSY |
0 |
RO |
0x0 |
|
ARB_LOST |
1 |
W1C |
0x0 |
|
NACK_RECEPTION |
2 |
W1C |
0x0 |
|
EOT |
3 |
W1C |
0x0 |
传输结束 |
BYTE_DONE |
4 |
RO |
0x0 |
当字节发送或接收完成时,硬件设置此位 |
TIME_OUT |
5 |
W1C |
0x0 |
当 SCL 线低电平时间大于配置数值时断言此位 |
I3C_SIR_STATUS |
6 |
W1C |
0x0 |
I3C 从设备中断请求中断 |
I3C_HJR_STATUS |
7 |
W1C |
0x0 |
I3C 热加入请求中断 |
I3C_SMR_STATUS |
8 |
W1C |
0x0 |
I3C 次级主控制器请求中断 |
I2C_SLAVE_RECEIVE |
9 |
RO |
0x0 |
|
I2C_SLAVE_TRANSMIT |
10 |
RO |
0x0 |
|
I3C_EOT_STATUS |
11 |
W1C |
0x0 |
I3C DMA 命令 EOT 中断 |
TXFIFO_EMPTY |
12 |
RO |
0x1 |
当 TX-FIFO 为空时断言此位 |
TXFIFO_FULL |
13 |
RO |
0x0 |
当 TX-FIFO 满时断言此位 |
I3C_BUS_CONFLICT |
14 |
RO |
0x0 |
当多主设备驱动总线时的 I3C 总线冲突 |
RXFIFO_EMPTY |
15 |
RO |
0x1 |
当 RX-FIFO 为空时断言此位 |
RXFIFO_FULL |
16 |
RO |
0x0 |
当 RX-FIFO 满时断言此位 |
I3C_RD64_BIT_DONE |
17 |
W1C |
0x0 |
在 I3C 模式下读取 64 位数据时指示字节完成 |
CFG_CMD_EN |
18 |
RO |
0x0 |
来自 DMA 核心的 CMD 通道使能握手信号 |
CFG_TX_EN |
19 |
RO |
0x0 |
来自 DMA 核心的 TX 通道使能握手信号 |
CFG_RX_EN |
20 |
RO |
0x0 |
来自 DMA 核心的 RX 通道使能握手信号 |
DMA_MODE_STATUS |
21 |
RO |
0x0 |
指示 I3C 在 DMA 模式下工作 |
DMA_CMD_LOAD_STATUS |
22 |
W1C |
0x0 |
指示 CMD 影子设置成功加载到主寄存器 |
DMA_RX_LOAD_STATUS |
23 |
W1C |
0x0 |
指示 RX 影子设置成功加载到主寄存器 |
DMA_TX_LOAD_STATUS |
24 |
W1C |
0x0 |
指示 TX 影子设置成功加载到主寄存器 |
TXFIFO_WM |
25 |
RO |
0x0 |
TX-FIFO 水位状态位 |
RXFIFO_WM |
26 |
RO |
0x0 |
RX-FIFO 水位状态位 |
ADDR_MATCH |
27 |
W1C |
0x0 |
|
BERR |
28 |
W1C |
0x0 |
当总线错误发生时设置此位为 1 |
MASTER_STATE |
31:29 |
RO |
0x0 |
|
I2C_TIMING 寄存器
偏移地址: 0x28
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
PRESC |
31:0 |
RW |
0xa |
|
I2C_SETUP 寄存器
偏移地址: 0x2C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
WORK_MODE |
0 |
RW |
0x0 |
|
ENABLE |
1 |
RW |
0x0 |
|
START |
2 |
RW |
0x0 |
|
STOP |
3 |
RW |
0x0 |
|
TRANSFER_DIRECTION |
4 |
RW |
0x0 |
|
ACK |
6 |
RW |
0x1 |
|
SOFT_RESET |
7 |
WO |
0x0 |
对 I2C 核心逻辑的软复位命令 |
TIME_OUT_ENABLE |
8 |
RW |
0x0 |
|
I2C_10BIT_ADDR_EN |
9 |
RW |
0x0 |
|
I3C_RD_64BIT_EN |
10 |
RW |
0x0 |
|
ROLE_MODE |
11 |
RW |
0x0 |
|
I3C_MODE_EN |
12 |
RW |
0x0 |
|
PUSH_PULL_MODE |
13 |
RW |
0x0 |
|
SCL_PULLUP_EN |
14 |
RW |
0x1 |
|
SDA_PULLUP_EN |
15 |
RW |
0x1 |
|
I3C_PARITY_MODE_EN |
16 |
RW |
0x0 |
|
CFG_DNF_NUM |
21:18 |
RW |
0x0 |
用于配置 SDA 和 SCL 输入上的数字噪声滤波器 |
CFG_AUTO_END |
22 |
RW |
0x0 |
|
TXDATA 寄存器
偏移地址: 0x30
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
TXDATA |
7:0 |
RW |
0x0 |
发送数据 |
RXDATA 寄存器
偏移地址: 0x34
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RXDATA |
31:0 |
RO |
0x0 |
接收数据寄存器 |
INT_IE 寄存器
偏移地址: 0x38
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
EOT_INT_IE |
0 |
RW |
0x0 |
最后传输中断使能 |
ARBITRATION_LOST_INT_IE |
1 |
RW |
0x0 |
仲裁丢失中断使能 |
TXFIFO_WM_INT_IE |
2 |
RW |
0x0 |
I2C TX-FIFO 水位中断使能 |
RXFIFO_WM_INT_IE |
3 |
RW |
0x0 |
I2C RX-FIFO 水位中断使能 |
TIME_OUT_ENABLE |
4 |
RW |
0x0 |
SCL 线超时中断使能 |
ADDRESS_MATCHED_INT_IE |
5 |
RW |
0x0 |
地址匹配中断使能 |
NACK_RECEPTION_INT_IE |
6 |
RW |
0x0 |
NACK 接收中断使能 |
I3C_INT_ENABLE |
7 |
RW |
0x0 |
I3C 中断使能 |
ERR_INE_IE |
8 |
RW |
0x0 |
错误中断使能 |
SBC_TCR_INE_IE |
9 |
RW |
0x0 |
从设备字节控制传输完成中断使能 |
PEC_BYTE_TC_INE_IE |
10 |
RW |
0x0 |
PEC 字节传输完成中断使能 |
DMA_CMD_LOAD_STATUS_INT_IE |
11 |
RW |
0x0 |
DMA 命令通道加载状态中断使能 |
DMA_RX_LOAD_STATUS_INT_IE |
12 |
RW |
0x0 |
DMA RX 通道加载状态中断使能 |
DMA_TX_LOAD_STATUS_INT_IE |
13 |
RW |
0x0 |
DMA TX 通道加载状态中断使能 |
I2C_SLAVE_ADDRESS1 寄存器
偏移地址: 0x3C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SLAVE_ADDRESS1 |
9:0 |
RW |
0x0 |
从设备地址1 |
SLAVE_ADDRESS1_MASK |
19:10 |
RW |
0x3FF |
从设备地址1 掩码寄存器 |
SLAVE_ADDRESS1_EN |
31 |
RW |
0x1 |
从设备地址1 使能 |
I2C_SLAVE_ADDRESS2 寄存器
偏移地址: 0x44
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SLAVE_ADDRESS2 |
9:0 |
RW |
0x0 |
从设备地址2 |
SLAVE_ADDRESS2_MASK |
19:10 |
RW |
0x3FF |
从设备地址2 掩码寄存器 |
SLAVE_ADDRESS2_EN |
31 |
RW |
0x0 |
从设备地址2 使能 |
I2C_TIME_OUT 寄存器
偏移地址: 0x48
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
NUM |
15:0 |
RW |
0xffff |
超时计数 |
I3C_PID_LOW 寄存器
偏移地址: 0x4C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
VALUE |
31:0 |
RO |
0x0 |
|
I3C_PID_HIGH 寄存器
偏移地址: 0x50
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
VALUE |
31:0 |
RO |
0x0 |
|
I3C_MASTER_BCR 寄存器
偏移地址: 0x54
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
VALUE |
7:0 |
RW |
0x40 |
总线特性寄存器 |
I3C_MASTER_DCR 寄存器
偏移地址: 0x58
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
VALUE |
7:0 |
RW |
0x0 |
设备特性寄存器 |
I3C_TSCO 寄存器
偏移地址: 0x5C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
TSCO |
31:0 |
RW |
0x1 |
|
DMA_RX_DATASIZE 寄存器
偏移地址: 0x64
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
DATASIZE |
1:0 |
RW |
0 |
|
DMA_TX_DATASIZE 寄存器
偏移地址: 0x68
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
DATASIZE |
1:0 |
RW |
0 |
|
TXFIFO_WM_CNT 寄存器
偏移地址: 0x7C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
WM_CNT |
3:0 |
RW |
0 |
TXFIFO 水位线级别 |
RXFIFO_WM_CNT 寄存器
偏移地址: 0x80
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
WM_CNT |
3:0 |
RW |
0 |
RXFIFO 水位线级别 |
DEBUG 寄存器
偏移地址: 0x98
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
STATUS |
14:0 |
RO |
3 |
用于系统调试的 I2C 内部信号 |
IP_VERSION 寄存器
偏移地址: 0x9C
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
VERSION_NUM |
31:0 |
RO |
0x0003_0002 |
I2C 控制器的 IP 版本 |
CFG_START_SETUP_TIME 寄存器
偏移地址: 0xA0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
START_SETUP_TIME |
31:0 |
RW |
0x32 |
用于在主模式下生成 SCL 高电平和 SDA 下降沿之间的延迟 |
CFG_START_HOLD_TIME 寄存器
偏移地址: 0xA4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
START_HOLD_TIME |
31:0 |
RW |
0x32 |
用于在主模式下生成 SDA 下降沿和 SCL 下降沿之间的延迟 |
CFG_SDA_SETUP_TIME 寄存器
偏移地址: 0xA8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SDA_SETUP_TIME |
31:0 |
RW |
0x5 |
用于在传输模式下生成 SDA 边沿和 SCL 上升沿之间的延迟 |
CFG_SDA_HOLD_TIME 寄存器
偏移地址: 0xAC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SDA_HOLD_TIME |
31:0 |
RW |
0x4 |
用于在传输模式下生成 SDA 边沿和 SCL 下降沿之间的延迟 |
CFG_SCL_HIGH_PERIOD 寄存器
偏移地址: 0xB0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SCL_HIGH_PERIOD |
31:0 |
RW |
0x32 |
用于在主模式下生成 SCL 高电平周期 |
CFG_SCL_LOW_PERIOD 寄存器
偏移地址: 0xB4
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SCL_LOW_PERIOD |
31:0 |
RW |
0x32 |
用于在主模式下生成 SCL 低电平周期 |
CFG_STOP_SETUP_TIME 寄存器
偏移地址: 0xB8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
STOP_SETUP_TIME |
31:0 |
RW |
0x32 |
用于在主模式下生成 STOP 建立时间 |
CFG_BUS_FREE_TIME 寄存器
偏移地址: 0xBC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
BUS_FREE_TIME |
31:0 |
RW |
0x32 |
用于在主模式下生成 STOP 和 START 条件之间的总线空闲时间 |
I2C_RX_SADDR 寄存器
偏移地址: 0xC0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RX_SADDR |
31:0 |
RW |
0x0 |
RX 缓冲区基地址 |
I2C_RX_SIZE 寄存器
偏移地址: 0xC8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
RX_SIZE |
19:0 |
RW |
0x0 |
RX 缓冲区大小(字节) |
I2C_RX_CFG 寄存器
偏移地址: 0xCC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CONTINUOUS |
0 |
RW |
0x0 |
RX 通道连续模式 |
EN |
1 |
RW |
0x0 |
RX 通道使能和开始传输 |
PENDING |
2 |
RO |
0x0 |
RX 传输在队列中挂起状态标志 |
CLR |
3 |
WO |
0x0 |
RX 通道清除和停止传输 |
I2C_TX_SADDR 寄存器
偏移地址: 0xD0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
TX_SADDR |
31:0 |
RW |
0x0 |
TX 缓冲区基地址 |
I2C_TX_SIZE 寄存器
偏移地址: 0xD8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
TX_SIZE |
19:0 |
RW |
0x0 |
TX 缓冲区大小(字节) |
I2C_TX_CFG 寄存器
偏移地址: 0xDC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CONTINUOUS |
0 |
RW |
0x0 |
TX 通道连续模式 |
EN |
1 |
RW |
0x0 |
TX 通道使能和开始传输 |
PENDING |
2 |
RO |
0x0 |
TX 传输在队列中挂起状态标志 |
CLR |
3 |
WO |
0x0 |
TX 通道清除和停止传输 |
I2C_CMD_SADDR 寄存器
偏移地址: 0xE0
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CMD_SADDR |
31:0 |
RW |
0x0 |
CMD 缓冲区基地址 |
I2C_CMD_SIZE 寄存器
偏移地址: 0xE8
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CMD_SIZE |
19:0 |
RW |
0x0 |
CMD 缓冲区大小(字节) |
I2C_CMD_CFG 寄存器
偏移地址: 0xEC
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
CONTINUOUS |
0 |
RW |
0x0 |
CMD 通道连续模式 |
EN |
1 |
RW |
0x0 |
CMD 通道使能和开始传输 |
PENDING |
2 |
RO |
0x0 |
CMD 传输在队列中挂起状态标志 |
CLR |
3 |
WO |
0x0 |
CMD 通道清除和停止传输 |
I2C_ADVANCED_SETUP 寄存器
偏移地址: 0x100
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
SBCEN |
1 |
RW |
0x0 |
从设备字节控制模式使能 |
PECEN |
2 |
RW |
0x0 |
数据包错误检查使能 |
PECIRQ |
3 |
W1S |
0x0 |
数据包错误检查字节请求标志 |
SMDEN |
4 |
RW |
0x0 |
SMBus 默认地址使能 |
SMHEN |
5 |
RW |
0x0 |
SMBus 主机地址使能 |
TIDLEN |
6 |
RW |
0x1 |
SMBus 空闲超时或 SCL 低电平超时使能 |
TEXTEN |
7 |
RW |
0x0 |
SMBus 拉伸 SCL 低电平超时使能 |
TEXT_NUM |
19:8 |
RW |
0x0 |
拉伸 SCL 低电平超时计数 |
ALERTEN |
20 |
RW |
0x0 |
SMBus 警报传输使能 |
I2C_ADVANCED_STATUS 寄存器
偏移地址: 0x104
字段 |
位 |
访问 |
复位值 |
描述 |
|---|---|---|---|---|
PECERR |
0 |
W1C |
0x0 |
数据包错误检查状态 |
PECBYTE |
8:1 |
RO |
0x0 |
数据包错误检查字节请求标志 |
ALERT_STUS |
9 |
W1C |
0x0 |
SMBus 警报状态 |
SBC_TCR |
10 |
W1C |
0x0 |
从设备字节控制传输完成标志 |
PEC_BYTE_TC |
11 |
W1C |
0x0 |
PEC 字节控制传输完成标志 |