惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threat Research - Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
V
Vulnerabilities – Threatpost
GbyAI
GbyAI
P
Proofpoint News Feed
L
LINUX DO - 热门话题
P
Palo Alto Networks Blog
A
About on SuperTechFans
T
Tenable Blog
M
MIT News - Artificial intelligence
IT之家
IT之家
I
Intezer
D
DataBreaches.Net
爱范儿
爱范儿
T
Threatpost
C
CERT Recently Published Vulnerability Notes
云风的 BLOG
云风的 BLOG
博客园 - 三生石上(FineUI控件)
WordPress大学
WordPress大学
K
Kaspersky official blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
Y
Y Combinator Blog
Cyberwarzone
Cyberwarzone
酷 壳 – CoolShell
酷 壳 – CoolShell
D
Darknet – Hacking Tools, Hacker News & Cyber Security
H
Help Net Security
Microsoft Security Blog
Microsoft Security Blog
Spread Privacy
Spread Privacy
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AWS News Blog
AWS News Blog
博客园 - 聂微东
C
Check Point Blog
S
Securelist
有赞技术团队
有赞技术团队
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
Last Week in AI
Last Week in AI
Stack Overflow Blog
Stack Overflow Blog
MongoDB | Blog
MongoDB | Blog
D
Docker
G
GRAHAM CLULEY
T
The Exploit Database - CXSecurity.com
C
Cybersecurity and Infrastructure Security Agency CISA
T
Tailwind CSS Blog
L
Lohrmann on Cybersecurity
G
Google Developers Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LangChain Blog

博客园 - yooooooo

【ARM CoreLink 系列 5 -- CI-700 控制器介绍 】 ARM CoreLink 系列 4.3 -- NI-700 Component and interface identifiers ARM CCI-500 与 NI0700 的关系. ARM NIC-400 与 NI-700 的区别 claude code命令使用 【ARM Trace32(劳特巴赫) 使用介绍 2.2 -- TRACE32 进阶命令之 DIAG 弹框命令】 trace32 .cmm脚本和.t32文件的区别 【ARM Trace32(劳特巴赫) 使用介绍 2.1 -- TRACE32 Practice 脚本 cmm 脚本学习】 【ARM Trace32(劳特巴赫) 使用介绍 1.1 - Veloce 环境中使用trace32 连接 Cortex-M33】 PCIe 总线的 ASPM 和 链路状态机制总结 fw_devlink 功能 UART 协议规范 BPF 调度器 sched_ext 实现机制、调度流程及样例 Android Camera性能分析 录像Buffer Path详解 【UEFI基础】Protocol介绍 【UEFI实战】在库中使用全局变量 sched feature TTWU_QUEUE 【ARM CoreLink 系列 4.2 -- NI-700 Function units 详细介绍】 edk2构建编译流程 UEFI:FDF文件及FD、FV、FFS EDK II PCD的概念、类型、使用 PELT算法浅析 load_balance函数代码详解 - yooooooo UEFI Boot Manager Linux misfit task Linux 内核中sched_prio_to_weight转换关系 CFS任务放置代码详解 CFS任务的负载均衡(load balance)
I3C协议详解
yooooooo · 2026-02-19 · via 博客园 - yooooooo

I3C最初的设计目的是为移动设备创建一个能够使用多个传感器的单一接口。随着现代化移动设备对于传感器数量的增加以及对性能的提高,I2C和SPI已经达到了他们所能支持的临界点,而I3C的出现就是为了解决这一问题,I3C可以在同一根主线上支持更多的传感器设备,而且不会因为要支持中断或睡眠模式而增加额外的逻辑信号。I3C可以在更低功耗的情况下提供更快的传输速率,该特性的提升不止是对移动设备,对其他的嵌入式设备也都是很大的帮助。例如穿戴设备,需要在有限的物理空间中使用多个传感器并且要求更小的耗电。

一、简述

​ I3C(Improved Inter Integrated Circuit)升级版的集成电路总线,同样两根总线:SDA和SCL
​ I3C接口致力于改善I2C的性能,并提供向后兼容,即兼容I2C。

名词解释:

SDR:Single Data Rate 单一数据传输模式
HDR:High Data Rate 高速数据传输模式
Main Master:当前被配置为I3C总线的主设备
Secondary Master:可以作为I3C的主设备,但是当前被配置为从设备。除了Current Master以外,总线上任何一个具有I3C Master功能的设备
Current Master:此时此刻是主设备

二、连接方式

SDR模式是I3C总线上的默认通讯模式,也是从Current Master向Slave传输私有消息的主要模式。I3C SDR模式与传统的I2C协议非常相似,无论是处理过程还是条件,因此I3C与许多I2C设备可以并存。

那么如何区分是I2C的数据包还是I3C的呢?

  • 从I3C master到I2C的数据包会被I3C slave忽略

  • I3C Master到I3C Slave的数据包一般不会被I2C Slave检测到,因为I2C的低通滤波器会阻止I3C较高的时钟进入设备内部电路。

    image

三、通讯协议

1、SDR动态分配地址

  • I3C可以为所有的I3C从设备动态的分配7-bit address
    • 在I3C从设备中会有两个standardized characteristics register和内部的48-bit的临时ID去协助此过程
  • Bus Characteristic Register 这个只读寄存器描述了I3C兼容设备在动态地址分配和通用命令代码中使用的角色和功能

image

  • Device Characteristic Register 这个只读寄存器描述了I3C兼容的设备类型(例如加速计、陀螺仪等),用于动态地址分配和通用命令代码

  • 仍然支持I2C的静态地址

    • 传统I2C设备需要提供的只读寄存器:Legacy Virtual Register,用来描述该I2C设备的功能(工作模式,时钟频率等)

2、主设备发送的地址

image

  • 发送静态地址:持有该地址的I2C从设备响应
  • 发送7位的0X7E:此地址为广播地址,所有的I3C从设备都会对这个地址进行响应,所有的I2C从设备都不会对这个地址进行响应,因为I2C中该地址是保留的。
  • 发送动态地址:持有该地址的I3C从设备响应

I3C Slave设备不需知道自身处在I2C总线上或是I3C总线上。如果其自身有一个I2C静态地址,那么它可以一直使用这个地址,直到被赋予一个动态地址。一旦被赋予了动态地址,它就必须作为一个I3C Slave设备工作,除非被要求重置。在被赋予动态地址之前,I3C Slave 设备只能以I2C设备的方式工作,但是添加了以下特性:

必要时候紧接着START条件可以响应I3C广播协议。

正确处理CCC的ENTDAA和SETDASA命令。

3、I3C从设备的职责

紧随START或Repeated START条件,以任何速率尝试对I3C总线上的广播地址或指向自己的地址进行响应。一旦被选中,则I3C Slave就把这一条消息当成SDR模式处理。

如果一条消息指向Slave的动态地址,那么Slave可以ACK或简单NACK这个地址头。

如果ACK,则I3C Slave以SDR模式处理这条消息。

如果NACK,则抛弃接下来的任何数据,等待下一个START或Repeated START。

如果消息是一条广播消息,且读写标识为写,则Slave需要至少处理数据中的头一个字节。

如果广播消息的数据为一个字节,则这则消息为CCC。

I3C Slave 必须处理所有可以应用的CCC命令。一条命令可能是必须的,也可能根据上下文可选的。

如果CCC命令改变了了I3C总线的模式,则I3C Slave必须以下述两种方式中的一种来处理:

如果新的模式为动态地址指定模式,并且请求的是所有I3C Slave,则当前没有动态地址的设备都要参与地址的指定;已经有动态地址的则等待动态地址指定模式的退出。

如果新的模式为HDR,则支持HDR的Slave 可以选择进入HDR,不支持HDR的设备则启动本设备的HDR退出监测器以监听HDR Exit序列的到来。

如果消息的地址头既不是广播也不是动态地址,则I3C Slave必须等待Repeated START 或是 STOP。Slave可以记录或监测总线上传输的位流,但在总线上只能进行等待。

4、公共传输格式

image

  • 对应的start和stop跟I2C时序完全相同。
  • start+7bit(地址)+1bit(读写位)+1bit(应答位/非应答)
  • 当地址头是个可仲裁的地址时,从设备可以向主设备发送如下三种请求:
    • In-Band中断请求,等同于使用额外的中断总线请求Master的介入控制。In-Band中断请求必须使用RnW位置1的设备动态地址
    • Secondary Master 请求,除非I3C Slave标记为支持此功能,否则不应请求这个功能。Secondary Master 请求必须使用RnW位置0的地址头。
    • 热接入请求,只有当I3C总线可操作时,I3C Slave才可以发出此请求。该请求使用的头地址必须为特殊的7位0x02 Hot-Join。
      • 如果Slave将SDA拉低后,然后Master尽快将SCL拉低,这段时间并未进行严格定义。
      • Master也应该将SDA拉低一段时间,形成时间重叠。
      • 一旦Master将SDA拉低后,Slave就可以使用Open-Drain模式控制SDA线。
      • 此时Slave就可以传输地址了。

5、特性

  • 带内中断

I3C允许从设备启动带内中断,这对于I2C和SPI设备来说都需要一根额外的信号线才能实现。当总线处于空闲状态时,从设备可以通过中断机制发送一个"START"信号,然后主设备会为从设备提供一个时钟信号,从设备可以通过主设备提供的分配地址将设备驱动到总线上来启动中断。如果此时有多个从设备尝试启动中断,则地址最小的从设备获得此次仲裁。同时主设备发出ACK信号响应此次中断并重新启动总线或者继续从从设备接收数据,也可以发出NACK信号来结束通信。例如,光传感器通常用于控制设备中显示器背光亮度,如果光条件改变,传感器向系统发出中断,请求发送数据到系统,当光条件稳定时,传感器不需要发送中断和数据,系统也不必查阅传感器数据,从而节约了功耗和实效。

  • 热接入

I3C允许从设备在总线配置完成之后再连接到总线上,即热接入特性。连接在同一总线上的传感器可以暂时关闭,直到需要唤醒的时候才激活唤醒。热连接应遵守特定的电气限制,不得干扰MIPI I3C线路。已为启用和禁用事件、管理MIPI I3C特定功能(动态寻址、定时控制等)等标准操作定义了一组通用命令代码(CCCs)。该通用命令代码可以发送广播(发送给所有设备)或者可以指向总线上的特定设备。在使用传感器时功耗和性能是我们必须考虑的,因为即使主程序处理器处于空闲状态(低功耗模式或者深度睡眠),Always-on sensors 和 sensor hubs也会不断的累积数据,累积的传感器数据通常是有规律的,需要在sensor、sensor hub和application processor之间定期快速传输,从而最大限度地降低功耗。

五、代码相关

https://blog.csdn.net/u010787514/article/details/88557561

六、与之前的进行对比

UART SPI I2C I3C
通信方式 全双工异步串行 全双工同步串行 半双工同步串行 同步串行
信号线 RX、TX、GND SDO、SDI、SCLK、SS SDA、SCLK SDA、SCLK
从属关系 不存在从属关系 存在主从设备。SPI用 片选 信号选择从机 存在主从设备。IIC用地址(静态)选择从机。 存在主从设备。用地址(动态、广播)选择从机。
通信速率 最大115200bps 不定,最高几M 400K,最高1M SDR 4/8.8M,HDR 20M以上
单次传输 5-8bit 8bit 8bit 8bit
clk 事先约定好 可调 可调 可调

image

I3C在不同模式下与I2C每传输一个bit数据消耗的能量对比(左图)以及比特率的对比(右图)。从结果来看,I3C在各方面都更具优势。I3C的HDR_TSP模式是数据速率最快功耗最低的一种模式,能够支持超过33Mbps的有效数据比特率。


七、I3C 与 I2C 的区别

I3C 和 I2C 都是两线串行总线(SCL + SDA),但 协议结构、时序机制、仲裁方式、地址管理、带宽能力 都有本质差异。下面系统对比。

一、基础定位区别

项目 I2C I3C
标准组织 传统 Philips / NXP MIPI Alliance
兼容性 原生 I2C 向下兼容 I2C
最高速率 3.4 MHz (HS) 12.5 MHz (SDR)
驱动方式 开漏 开漏 + 推挽
动态地址

二、物理层区别(最关键)

I2C:全程开漏

  • SDA / SCL 都是开漏
  • 必须外接上拉电阻
  • 上升沿慢(RC 决定)
  • 速度受限
SDA: 只能拉低
SCL: 只能拉低

I3C:混合驱动

阶段 驱动方式
起始仲裁 开漏
数据阶段 推挽

优势:

  • 无需强上拉
  • 上升沿快
  • 功耗更低
  • 速率高

I3C 在数据传输阶段使用 Push-Pull 驱动 SCL,这是性能飞跃的核心原因。


三、协议帧格式对比


I2C 帧格式

START
7bit Addr + R/W
ACK
DATA
ACK
...
STOP

特点:

  • 每 8bit 后必须 ACK
  • 只有主机发起
  • 从设备不能主动发数据

I3C 帧格式

I3C 有三种基本传输类型:

(1) SDR (Single Data Rate)
START
Dynamic Addr
R/W
DATA
Parity
STOP

差异:

  • 没有传统 ACK bit
  • 使用奇偶校验 (Parity)
  • 时钟推挽
  • 更高效率

(2) HDR (High Data Rate)

更高速模式:

  • DDR
  • TSP
  • TSF

数据在 SCL 双边沿传输。


(3) CCC (Common Command Code)

I3C 独有命令广播机制:

START
Broadcast Address (7'h7E)
CCC
DATA
STOP

可用于:

  • 动态地址分配
  • 设备发现
  • 中断控制
  • 功耗管理

四、地址管理区别

I2C

  • 固定 7bit 地址
  • 硬件决定
  • 容易冲突

I3C

  • 启动时动态分配地址
  • 使用 ENTDAA 流程

ENTDAA(Enter Dynamic Address Assignment):

  1. 主机发广播 CCC
  2. 所有从设备按 PID 排序
  3. 主机依次分配动态地址

解决了地址冲突问题。


五、仲裁机制区别

I2C

  • 多主机
  • SDA 低优先
  • 位级仲裁

I3C

  • 默认单主
  • 支持 Secondary Master
  • 使用 In-Band Interrupt (IBI)

六、I3C 独有功能

1️⃣ IBI(In-Band Interrupt)

从设备可以主动请求总线:

Device 拉低 SDA
发送 IBI
主机响应

I2C 不支持从机主动通信。


2️⃣ 热插拔

I3C 支持 Hot-Join:

新设备加入总线后可请求地址分配。


3️⃣ 无需上拉电阻

因为推挽驱动。