大家都知道 I2C ,它的全称是 Inter Integrated Circuit ,那 I3C 又是什么?
I3C 是 MIPI (Mobile Industry Processor Interface)移动产业处理器接口联盟推出的,全称是 Improved Inter Integrated Circuit ,顾名思义,I3C 就是改进型的 I2C。
I3C 仍然采用 2 根通信线,一根数据线 SDL ,一根时钟线 SCL ,I3C 向下兼容 I2C ,也就是说 I3C 的总线下是可以挂载传统的 I2C 接口的(但是不兼容 10 bit 的 I2C 扩展地址),I3C 的典型应用电路类型如下图所示:
图 1 I3C 的典型应用电路类型
为什么要有 I3C ?
常见的板间通信总线有 I2C 、SPI 、UART 、I2S 等,这类总线常用于 ADC 、DAC 、传感器等外设通信。随着物联网的应用越来越广,涌现各类传感器,比如温度、气压、心率和陀螺仪等。挂载传感器的激增,对传输功耗、性能、速率的要求也相应的提高,这就暴露出了传统总线的部分缺陷,主要问题有以下几点:
一、功耗问题:I2C 、SPI 、UART 设计之初未考虑到功耗问题,而对于物联网多传感器的应用来说,对功耗的要求比较严苛。
二、I2C 、SPI 、UART 都只支持单一的主机。
三、I2C 、SPI 是同步通信,必须由主机(处理器)发起时钟进行通信,从机没办法主动传输数据。
四、I2C 、SPI 一般需增加中断线通知主机来读取数据,随着传感器数量的增加,会占用大量的 IO 口和中断资源。
五、UART 是异步通信,虽然没有三 、四的缺点,但是它是点对点通信,一个总线只能挂一个从设备。
六、对于 I2C 来说,传输速率受限。
基于上述的问题,MIPI 主导并提出了 I3C 总线,可以解决现有的问题。
I3C 跟 I2C 的区别在哪?
下面我将通过一个表格让大家直观地看到它们的区别。
表1 I3C 和 I2C 的区别
通过表格我们不难看出 I3C 的特点有:
- 支持带内中断:
概念:In-Band Interrupt (IBI)。传统的I2C 需要额外的 PIN 线才能实现中断电平请求,会占用 IO 和中断资源,I2C 传感器是需要主机实时读取数据,当有新的数据时, I2C 是无法主动发起通讯要求主机读取的,而 I3C 则是应用了带内中断,它的处理过程由主机和从机共同决定, I3C 传感器可以通过带内中断来让主机读取数据。
过程:I3C 从机将 SDA 线拉低然后等待主机将 SCL 线拉低来回应 ACK ,当主机将 SCL 拉低以后同时将 SCL 时钟提供给从机,从机享有 SDA 的控制权,随后从机通过 SDA 发送带有自己动态地址的数据(带有值为 1'b1 的 RnW 位),即强制要求 1'b1 位为 1,否则主机则认为此次请求无效,在经历了这些过程后,就完成了一次 IBI 请求。
- 支持故障检测:I3C 协议中为主机和从机分别指定了一组必须方法,针对从设备中七种错误类型和主设备中两种错误类型的检测和恢复方法。更详细的介绍可以参考连接:I3C协议Single Data Rate(SDR)模式研读(七):SDR错误检测和恢复方法_sdr common error check pl von s--CSDN博客
- 支持多个主机:接在 I3C 总线上的辅助主机,可以给 I3C 主机发送请求成为当前的主机,需要经过原主机的响应,释放原主机对总线的控制权,由原来的辅助设备承担当前主设备,并控制 I3C 总线。
- 支持热插拔:热插拔即是允许 I3C 从机在主机完成初始化后才接入 I3C 总线,并且可以再为其分配动态地址,这个机制允许从机进入低功耗状态,在有需要的时候才唤醒。
- 支持动态寻址:区别于 I2C 静态地址,动态地址能够解决地址重复的问题。
- 支持多种通信模式:向下兼容 I2C 、SDR 模式、HDR 模式。
那么 I3C 到底是怎么工作的呢?
(下面介绍以 SDR 模式为例)
一、读写数据:
I3C SDR 模式下读写数据与 I2C 很相似,
写数据:
图 2 I3C 写数据时序
我们可以看到 I3C 主机写入数据的第 9 位是作为奇偶校验,而 I2C 的第 9 位是 ACK / NACK ,这个第 9 位被称作 T-bit 位(为“过渡”)。
读数据:
图 3 I3C 读数据时序
在 I2C 中,从机到主机的第 9 个数据位是主机的 ACK / NACK ,相比之下,I3C 则可以通过回传 T-bit 的值来允许从设备结束回传,并允许主机终止读取。
二、动态地址分配的设备要求
为了支持动态地址分配程序,在开始程序之前,连接到 I3C 总线上的每个 I3C 设备都应该以下面两种方式之一来标识:
1. 设备有一个静态地址,(假设主机已经知道该地址)主机可以使用此静态地址,例如 I2C 所规定的地址。
2. 设备具有 48 位的临时 ID 。这 48 位 ID 由以下部分组成。
图 4 I3C 48 位设备 ID 的组成
48位 ID 由三部分组成:
[47:33] 位是 MIPI 制造商 ID (15位),其最高位有效位被丢弃,仅使用15 个最低有效位。
[32] 位:临时 ID 类型选择(一位,1'b1:随机值,1'b0 :供应商固定值)
[31:16] 位:部件 ID :此 16 位字段的含义留给设备供应商定义。
[15:12] 位:实例 ID :此 4 位 字段中的值用来区分一条总线上的不同的 ID。
[11:0] 位:此 12 位字段的含义具有自身定义或者其他含义。例如:更深的设备特征,是什么样的传感器等。
三、带动态地址分配的总线初始化顺序
在此之前我们先了解一下 I3C 的通用命令代码(CCC),它是全局支持的命令,可以直接传输到特定的 I3C 从设备,也可以同时传输到 I3C 所有从设备。CCC 命令协议仅使用 I3C SDR 模式进行格式化,并且始终以 I3C 广播地址 (7'h7E)开头,也就是说,在启动或者重复启动之后,CCC 的命令地址始终都为 7'h7E。
一旦分配了 I3C 从机,所有 I3C 从机都将识别 7'h7E 广播地址和它们自己的动态地址。
而 I3C 的设备要保持通信功能,说明它们都应该在活动状态下,这就涉及到设备状态的配置,即 Enter Activity State 0-3 (ENTAS0 – ENTAS3)。
图 5 ENTAS 的配置时序
在激活后,主机需要一个或全部 I3C 设备清除 / 复位其主机分配的动态地址,清除后,这些设备为动态地址分配程序做好准备,即 Reset Dynamic Address Assignment (RSTDAA)。
图 6 RSTDDA 的配置时序
为地址分配做好准备后,要通过命令允许 I3C 主设备设置或获取一个从设备的最大数据写入长度(以字节为单位)。该最大写入长度不影响广播 CCC 的数据写入长度。设置 / 获取最大写长度值在两个字节传输,最高有效字节(MSb)首先传输。最大写入长度可以设置为的最小值是 8 ,即 Set / Get Max Write Length ( SETMWL / GETMWL)。
仅当从设备实现的任何专用写入消息或者任何扩展写入 CCC 支持每个消息的最大数据字节的可变限制时,才需要此 CCC 。
当然 I3C 的初始化指令还有其他的更多,可以通过阅读指令集了解,参考链接为大家送上:I3C协议通讯详解-CSDN博客
在介绍完上面几个概念以后,相信大家也比较好理解下面这个总线初始化流程图了:
图 7 I3C 总线初始化配置流程图
可能光这么说大家还是觉得有点抽象,下面我将第二点、第三点和代码、波形结合起来方便大家理解。以 NXP LPC865 EVK 板间通信为例子,I3C 初始化配置部分代码如下:
图 7 LPC865 I3C 传输初始化
在发送广播地址后,I3C 回传的设备 ID 如下所示:
图 8 I3C 从机回传48位的设备 ID
四、带内中断和其仲裁机制
在 I3C 中,带内中断有优先级控制,每个从设备的优先级都在其从设备地址中编较低的地址具有较高的优先级,也就是说这个地址更快地被处理,这是 I3C 仲裁机制 的结果,值为 0 的地址优先于值为 1 的地址,我们可以通过下图例子更直观地看出区别。
可以通过对比看出 7'h5F 将赢得仲裁。
图 9 I3C 带内中断仲裁机制
注:图 1、图 5、图 6、图 7 来源于 I3C 总线技术概述。
图 2、图 3、图 4、图 9 来源于 NXP Semiconductor。
参考资料:
I3C协议Single Data Rate(SDR)模式研读(四):总线初始化和动态地址分配模式Bus Initialization and Dynamic Address Assigned Mode_i3c动态地址分配冲突-CSDN博客
i2c我们用得很多,i3c又是什么?_i3c和i2c区别-CSDN博客
I3C协议通讯详解-CSDN博客
I3C协议Single Data Rate(SDR)模式研读(七):SDR错误检测和恢复方法_sdr common error check pl von s--CSDN博客
登录大大通,了解更多详情,解锁1500+完整应用方案,更有大联大700+FAE在线答疑解惑!