前言
本篇文章依赖于I2C协议作为基础,I2C协议可以参考:详细介绍GPIO、I2C、SPI通讯原理以及物理层原理
起源
I3C是由MIPI联盟开发与完善,它是基于I2C协议改进而来,诞生的目的是为了统一传感器通讯协议,随着Micro Chip的发展,MCU越来越强大,诞生了许多移动设备,这些移动设备主要使用I2C、SPI、Uart作为通讯协议,但并不统一,比如A传感器使用Uart,B传感器使用SPI,如果你想要在你的设备上使用这两个传感器那么需要在你的设备里集成Uart和SPI的通讯模块,这无疑大大增加了MCU走线布局,其次Uart和SPI使用的线较多,SPI用了4根线,虽然SPI可以达到较高的传输赫兹,但是使用的线数较多,而且不能解决多主多从的情况,而Uart需要至少三根线,其次是Uart很慢且内部中断需要额外的GPIO线。
I2C虽然两根线,但功能和传输速度都不算优秀,而且中断需要外接线,其次也不支持多主多从的情况。
同时这些协议有一个通病,就是不支持热拔插,如果设备在连接着突然断了,再次接入协议会影响继续通讯,热拔插是需要主设备恢复从设备的状态,这个情况就影响了低功耗,比如某些传感器在这一时刻需要进入低功耗模式,进入沉睡,那么此时唤醒就会导致无法继续正常工作。
为此MIPI在I2C的基础上诞生了I3C,它与I2C一样使用两根线,并且支持IBI中断和热拔插,同时频率可以达到较高的频率,因为它与I2C不同,I2C两根引脚使用的是开漏输出,开漏内部接地是无法输出高电平的,如果需要输出高电平必须外接上拉电阻才能实现高电平输出,但是电阻会阻碍电流导通,所以会比较耗时,I2C最高也才达到5MB,但是I3C可达12.5MB,并且功能比I2C强大许多且它支持I2C,向前兼容。
只有在推挽输出模式下I3C才可以达到12.5MB,并且特定模式下的频率可以达20MB
推挽输出与漏极输出
I3C与I2C不同之处在于SCL和SDA线两根线分别使用了推挽与开漏:SCL(推挽输出时钟线),SDA(开漏输出数据线),而I2C则全部使用开漏输出,则全部需要外接上拉电阻,这就降低了时钟频率
SCL电路:
SDA电路:
奇偶校验位
与I2C不同,I3C为了安全与可靠,第九位采用的是奇偶校验位,原始的I2C第九位为ACK信号,接收方收到这个信号时需要把SDA拉低已表示收到ACK信号并返回确认ACK信号告知主机已经接收完成,I3C第九位使用的是奇偶校验位,XOR (Data [7:0], 1),即所有位与1进行异或的结果,接收方接收到以后需要自行异或并与第九位做比较,如果相同则回复ACK确认,否则NACK要求重发
I3C总体下来每次传输数据可以说是传输十位
data[7 : 0] → T [0] → ACK [0]
I3C把这个位称之为T位,也叫过渡位/交换位
应答的方式
I2C
发送方将SCL拉高,随后将SDA也拉高,接收方需要在一个周期内将SDA拉低以回应确认收到信息,如果周期内没有拉低则代表NACK
I3C
发送方将SCL拉低,随后SDA拉高,从机需要将SDA拉低来确认ACK,如果不将SDA拉低则意味着NACK
I3C上因为SCL是推挽电路,但同时I3C仍然支持I2C的ACK确认方式,只是某些情况下I3C要求只能使用I3C的方式来进行ACK,这么做的目的是忽略掉总线上I2C的设备,例如分配动态地址是时不想让I2C设备参与进来那么久使用这个方式来忽略掉I2C设备,因为传统I2C设备只会在SCL拉高时来确认ACK,如果I3C将SCL拉低那么I2C设备会把此次通讯视为没有ACK讯息视为失败则放弃本次通讯
I3C CCC通用命令码
简介
I3C CCC(Common Command Codes)是I3C下CMD命令代码,用于通讯方面,设备收到指定命令应做出对应的响应,类似于Linux上的Shell
广播命令与直接命令
简介
I3C CCC有255个指令有部分是保留的指令,其中有15个标记为必须的是要求I3C设备必须支持的,I3C设备在支持这些命令时需按照I3C CCC定制的规范来实现,并且广播和直接命令都有一个固定范围,从机可以根据命令码的范围来判断是属于广播还是直接命令
广播(Broadcast)
针对所有从机,命令码:0x00 - 0x7F
当从机收到广播命令时忽略地址,对这条命令进行响应
广播使用地址为7’h7E
直接(Direct)
针对特定从机,命令码:0x80 - 0xFE
当从机收到直接命令时需确认地址是否属于自己,否则不响应
CCC命令集
命令码
命令代码 | 通用命令类型 | 必须 | 命令名称 | 作用 | 默认 | 简述 |
---|---|---|---|---|---|---|
0x00 | 广播 | Y | ENEC | 启用事件命令 | Y | 启用从属事件驱动中断 |
0x01 | 广播 | Y | DISEC | 禁用事件命令 | N | 禁用从属事件驱动中断 |
0x02 | 广播 | Y¹ | ENTAS0 | 进入活动状态0 | Y | 将活动模式设置为状态0(正常操作) |
0x03 | 广播 | N¹ | ENTAS1 | 进入活动状态1 | N | 将活动状态设置为1 |
0x04 | 广播 | N¹ | ENTAS2 | 进入活动状态2 | N | 将活动状态设置为2 |
0x05 | 广播 | N¹ | ENTAS3 | 进入活动状态3 | N | 将活动状态设置为3 |
0x06 | 广播 | Y | RSTDAA | 重置动态地址分配 | - | 忘记当前动态地址并等待新分配 |
0x07 | 广播 | Y | ENTDAA | 进入动态地址分配 | - | 进入从机动态地址分配工作,如果从机已经分配了地址,则不参与 |
0x08 | 广播 | N | DEFSLVS | 定义从属列表 | - | 主设备定义每个从设备的动态地址、dcr类型和静态地址(或0) |
0x09 | 广播 Y⁶ | SETMWL | 设置最大写入长度 | - | 单个命令中的最大写入长度 | |
0x0A | 广播 Y⁷ | SETMRL | 设置最大读取长度 | - | 单个命令中的最大读取长度 | |
0x0B | 广播 | N | ENTTM | 进入测试模式 | - | 主机已进入测试模式 |
0x0C-0x1F | - | - | MIPI 保留 | - | - | 保留供MIPI联盟未来使用 |
0x20 | 广播 | N³ | ENTHDR0 | 进入HDR模式0 | - | master已进入HDR-DDR模式。i3c基本规范不支持此模式。若要访问此功能,请与MIPI联盟联系 |
0x21 | 广播 | N³ | ENTHDR1 | 进入HDR模式1 | - | master已进入HDR-TSP模式。i3c基本规范不支持此模式。若要访问此功能,请与MIPI联盟联系 |
0x22 | 广播 | N³ | ENTHDR2 | 进入HDR模式2 | - | master已进入HDR-TSL模式。i3c基本规范不支持此模式。若要访问此功能,请与MIPI联盟联系 |
0x23 | 广播 | N³ | ENTHDR3 | 进入HDR模式3 | - | 主机已进入HDR模式3 |
0x24 | 广播 | N³ | ENTHDR4 | 进入HDR模式4 | - | 主机已进入HDR模式4 |
0x25 | 广播 | N³ | ENTHDR5 | 进入HDR模式5 | - | 主机已进入HDR模式5 |
0x26 | 广播 | N³ | ENTHDR6 | 进入HDR模式6 | - | 主机已进入HDR模式6 |
0x27 | 广播 | N³ | ENTHDR7 | 进入HDR模式7 | - | 主机已进入HDR模式7 |
0x28 | 广播 | N | SETXTIME | 交换定时信息 | - | 此ccc命令不包含在i3c基本规范中。要获得此功能,请联系MIPI联盟 |
0x29 | 广播 | - | SETAASA | 将静态地址设置为动态地址 | - | 所有从机使用其已知的静态地址作为其动态地址 |
0x2A-0x48 | 广播 | - | - | 保留 | - | 保留供MIPI联盟未来使用 |
0x49-0x57 | 广播 | - | MIPI保留给其他工作组-广播CCC | - | - | 保留供MIPI联盟未来使用 |
0x58-0x5B | 广播 | - | MIPI保留给其他工作组-广播CCC | - | - | 保留供MIPI联盟未来使用 |
0x5C-0x60 | 广播 | - | MIPI保留给其他工作组-广播CCC | - | - | 保留供MIPI联盟未来使用 |
0x61-0x7F | 广播 | - | 供应商扩展-广播CCC | - | - | 供供应商使用 |
0x80 | 直接 | Y | ENEC | 启用事件命令 | Y | 启用从属事件驱动中断 |
0x81 | 直接 | Y | DISEC | 禁用事件命令 | N | 禁用从属事件驱动中断 |
0x82 | 直接 | Y¹ | ENTAS0 | 进入活动状态0 | Y | 将活动模式设置为状态0(正常操作) |
0x83 | 直接 | N¹ | ENTAS1 | 进入活动状态1 | N | 将活动状态设置为1 |
0x84 | 直接 | N¹ | ENTAS2 | 进入活动状态2 | N | 将活动状态设置为2 |
0x85 | 直接 | N¹ | ENTAS3 进入活动状态3 | N | 将活动状态设置为3 | |
0x86 | 直接 | Y | RSTDAA | 重置动态地址分配 | - | 忘记当前动态地址并等待新分配 |
0x87 | 直接设置 | N | SETDASA | 从静态地址设置动态地址 | - | 主设备将动态地址分配给具有已知静态地址的从设备 |
0x88 | 直接设置 | Y | SETNEWDA | 设置新的动态地址 | - | 主设备将新的动态地址分配给任何I3C从设备 |
0x89 | 直接设置 | Y² | SETMWL | 设置最大写入长度 | - | 单个命令中的最大写入长度 |
0x8A | 直接设置 | Y² | SETMRL | 设置最大读取长度 | - | 单个命令中的最大读取长度 |
0x8B | 直接获取 | Y² | GETMWL | 获取最大写入长度 | - | 获取从设备的最大可能写入长度 |
0x8C | 直接获取 | Y² | GETMRL | 获取最大读取长度 | - | 获取从设备的最大可能读取长度 |
0X8D | 直接获取 | Y | GETPID | 获取provisional ID | - | 获取从设备的provisional ID |
0X8E | 直接获取 | Y | GETBCR | 获取BCR | - | 获取从设备的BCR |
0X8F | 直接获取 | Y | GETDCR | 获取DCR | - | 获取从设备的DCR |
0X90 | 直接获取 | Y | GETSTATUS | 获取设备状态 | - | 获取设备的活动时状态 |
0X91 | 直接获取 | N | GETACCMST | 获得并接受主控权 | - | 当前主机正在请求并确认来自次主机的总线主控权 |
0x92 | - | - | - | 保留 | - | 保留供MIPI联盟未来使用 |
0x93 | 直接设置 | N | SETBRGTGT | 设定桥梁目标 | - | MASTER(通过动态地址和类型/ID)告诉网桥(与I2C、SPI、UART等通信)它正在与哪些端点通信。 |
0x94 | 直接获取 | N⁴ | GETMXDS | 获取最大数据速度 | - | 主设备要求从设备提供其SDR模式最大值,读取和写入数据速度(可选最大读取周转时间) |
0X95 | 直接获取 | N⁵ | GETHDRCAP | 获取HDR功能 | - | 此ccc不包含在i3c基本规范中。要获得此功能,请联系MIPI联盟 |
0x96-0x97 | - | - | - | 保留 | - | 保留供MIPI联盟未来使用 |
0x98 | 直接 | N | SETXTIME | 设置交换定时信息 | - | 此ccc不包含在i3c基本规范中。要获得此功能,请联系MIPI联盟 |
0x99 | 直接 | N | GETXTIME | 获取交换定时信息 | - | 此ccc不包含在i3c基本规范中。要获得此功能,请联系MIPI联盟 |
0x9A-0xBF | 直接 | - | - | 保留 | - | 保留供MIPI联盟未来使用 |
0xC0-0xD6 | 直接 | - | - | MIPI保留给其他工作组-直接CCC | - | 保留供MIPI联盟未来使用 |
0xD7-0xDA | 直接 | - | - | MIPI保留给其他工作组-直接CCC | - | 保留供MIPI调试工作组使用 |
0xDB-0xDF | 直接 | - | - | MIPI保留给其他工作组-直接CCC | - | 保留供MIPI RIO WG使用 |
0xE0-0xFE | 直接 | - | - | 供应商扩展直接CCC | - | 供供应商使用 |
0xFF | - | - | - | 保留 | - | 保留供MIPI联盟未来使用 |
Note
1)
应允许从设备根据此信息进行自功率管理
2)
该ccc应由能够传输16个或更多连续字节的设备支持
3)
i3c basic不支持HDR模式,但是为了保持与i3c v1.x的兼容性,设备必须检测HDR输入、HDR重启和HDR退出模式
4)
该CCC应由总线控制寄存器(BCR)位[0]设置为1’b 1的从属设备支持
5)
该ccc应由支持任何hdr模式的从属设备支持。
6)
获取最大写入长度(SETMWL/GETMWL)
7)
获取最大读取长度(SETMRL/GETMRL)
CCC通讯帧
领域 | 作用 |
---|---|
S或Sr(重复) | CCC通常以起始条件或重复条件开始 |
7’h7E/W/ACK | 三部分: 7‘h7E:以全局广播地址开始,所有I3C从机都可以看到CCC代码。 ------------------------------- W:写位清零(值1‘b0),表明主机正在向从机写一条消息。 ------------------------------- 此消息时钟包含CCC代码,并且视CCC代码的值而定,可以选择包含其它数据。 ------------------------------- ACK:1个或多个I3C从期间的集体ACK(SDA驱动为低电平) |
Command Code/T | 一个8位的值指示正在发送哪个命令,后面跟一个T位。 |
Defining Byte(Optional)/T | 根据需要,此可选字段与广播和直接读取写入CCC消息一起使用。它后面是一个T位。 |
Data(Optional)/T | 根据需要,此可选字段与广播和直接读取/写入CCC消息一起使用。它后面是一个T位。 |
Sr/Broadcast Addressor P | CCC总是以STOP或重复的START和广播地址结尾。 |
CCC命令格式
ENEC/DISEC
下图为Direct(直接)和Broadcast(广播)的格式
如果为Direct(直接)CCC命令则格式为:
Satrt信号→7’h7E广播地址 (外加1位写位(ACK为响应))→Direct CCC命令(外跟一位T位)→ 重复Start信号→ 从设备地址(写,ACK为响应)→ 事件类型(外跟一位T位)→ 重复信号或STOP信号
如果为Broadcast(广播)CCC命令则格式为:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ 事件类型→ 重复起始信号或STOP信号
事件类型如下:
**ENHJ/DISHJ:**热加入事件
**ENINT/DISINT:**中断请求事件
**ENMR/DISMR:**请求主控制权事件
ENTASx
如果为Direct(直接)CCC命令则格式为:
Start信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Direct CCC命令(外跟一位T位)→ 重复Start信号→ 从设备地址(写,ACK为响应)→ 重复信号或STOP信号
如果为Broadcast(广播)CCC命令则格式为:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ 重复起始信号或STOP信号
每个活动状态的操作延迟不一样:
CCC | 活动状态 | 最小总线活动间隔 |
---|---|---|
ENTAS0 | 活动0 | 1usec:无延迟操作 |
ENTAS1 | 活动1 | 100usec |
ENTAS2 | 活动2 | 2msec |
ENTAS3 | 活动3 | 50msec:最低活动操作 |
RSTDAA
如果为Direct(直接)CCC命令则格式为:
Start信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Direct CCC命令(外跟一位T位)→ 重复Start信号→ 从设备地址(写,ACK为响应)→ 重复信号或STOP信号
如果为Broadcast(广播)CCC命令则格式为:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ 重复起始信号或STOP信号
ENTDAA
ENTDAA只能为广播命令:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ STOP信号
从机收到此命令之后需要立即进入准备分配动态地址的状态
DEFSLVS
此命令用于广播当前总线存在哪些I3C从设备,用于告诉I3C次主要主要
DEFSLVS只能为广播命令:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ Count(外跟一位T位)→ Describes_Current_Master (描述当前主机)→ Describes First Slave (描述从主机)→ 重复信号或STOP信号
Count:
第几个从机
动态地址:
7个最高有效位(位[7:1])包含从机的主要主机分配的7位动态地址的当前值,而最低有效位(位[0])则填充值1’b0。 对于旧版I2C设备,动态地址的值应为7’h00。
DCR 类型:
从机的设备特性寄存器值,如果未知则0x00。对于旧版I2C设备,DCR类型值可以使设备的LVR值。
BCR 类型:
从机的总线特性寄存器值,若未知则为0x00。
静态地址:
从机的原始7位静态I2C地址,其中7个最高有效位(位[7:1]),最低有效位(位[0])填充了值1’b0。 如果没有静态地址,则该值为7’h00。
对于旧式I2C设备,“动态地址”字段的值为7’h00,而DCR字段将包含设备的旧版虚拟寄存器(LVR)的值。
除非存在至少一个辅助主机设备,否则主机不会发送DEFSLVS CCC。
每个热加入事件后主机发送DEFSLVS CCC用于更新从属性列表
ENTTM
此命令代表进入测试模式,支持此命令的I3C从设备在收到此命令时会进入指定测试模式
ENTTM只能为广播命令:
Start信号或重复起始信号→ 7’h7E广播地址 (外加1位写位(ACK为响应))→ Broadcast CCC命令(外跟一位T位)→ 测试类型→ 重复信号或STOP信号
测试类型如下:
值 | 测试模式 | 说明 |
---|---|---|
0x00 | 退出测试模式 | 此值将所有i3c设备从测试模式中移除 |
0x01 | 供应商测试模式 | 该值表示在动态地址分配过程中,i3c设备应返回Provisional id中的随机32位值 |
0x02-0xFF | 保留供mipi联盟未来使用 | 保留供mipi联盟未来使用 |
SETDASA
这个指令允许主机利用从机的静态地址给该从机分配动态地址。比ENTDAA动态地址分配方法要快。SETDASA要在ENTDAA使用前使用,除了已经分配动态地址的从机外,所有的从机都要响应ENTDAA CCC。
注意:SETDASA命令代码与众不同,因为它通过其I2C静态地址而不是其动态地址来寻址所需的I3C设备。 结果,此CCC只能发送到具有I2C静态地址的从站。
新分配的地址在表34中所示的动态地址字节中发送,其中7个最高有效位(位[7:1])包含7位动态地址,最低有效位(位[0])填充为值1’b0。
SETDASA CCC还可以专门用于I3C最小总线使用案例中的简单点对点通信。 I3C最小总线是具有一个I3C主机(可能功能降低)和一个I3C从机的I3C总线。 在SETDASA CCC的这种特殊用法中,主机既使用固定值7’h01作为静态地址,又使用固定(且保留)值7’h01作为动态地址)。
SETDASA CCC的这种特殊用法允许使用更简单的主机,还可以选择使用更简单的从机,这些设备专门用于最小总线配置。
I3C从机应支持SETDASA CCC的这种特殊用法,除非这种支持会使从机在最小总线用例中无法使用。 支持SETDASA CCC的这种特殊最小总线用法的从机应与静态地址7’h01匹配,然后接受7’h01作为其新的动态地址(与SETDASA的自然结果相同)。 从机以这种方式接收到其动态地址后可能会选择不同的行为。
要使用这个特殊的形式,需要已知I3C总线只有一个主机,并且要么有一个活跃的I3C从机设备,该设备有能力支持这个SETDASA CCC特殊的用法,要么一个或者更多I3C从机设备,这些设备必须作为接收器,不能使用带内中断,不会收到读请求。实际上,这种布置允许单个主机广播到从机。
SETNEWDA
该命令允许I3C主机给单一I3C从机设备分配动态地址,动态地址中,前七位包含7位的动态地址,最后一位[0]由值1’b0填充。
GETPID
该命令获取单一I3C从机设备请求,来给主机返回其48位临时的ID。在该命令中,48位的值通过6个字节传输,以MSb开始。
GETBCR
该命令获取单一I3C设备请求,返回总线特性寄存器给主机。BCR的值由一个字节传输,以MSb开始。
GETDCR
该命令获取单一I3C设备请求,返回设备特性寄存器给主机。DCR的值由一个字节传输,以MSb开始。
GETSTATUS
该命令获取单一I3C设备请求,返回其当前的状态,由两个字节传输,字节0是LSb,字节1是MSb。
Bit描述
位 | 作用 | 描述 |
---|---|---|
15:8 | 供应商保留 | 为供应商特定含义保留 |
7:6 | 活动模式 | 包含从设备当前活动模式的两位ID(准备支持传感器或相关信心的数据读取) |
5 | 协议错误 | 如果设置为1‘b1,则代表从机在进行上一次状态获取时发生了协议错误,每次成功完成从机状态的主读取后,此值自动清除 |
4 | 保留 | 保留作为未来定义 |
3:0 | 待处理中断 | 包含任何未决中断的中断号:如果没有未决中断,则为0. 此编码最多允许15个编号的中断。 如果设置了多个中断,则应返回最高优先级(中断编号为最低的)的中断。 |
GETACCMST
该命令验证主机请求,允许当前主机提供主机角色给I3C的第二主机。这个命令用来确认第二主机是否接受角色,第二主机会返回其7位的动态地址,7为动态地址的值和从机地址的值是相同的。如果第二主机没有接受角色,则它会NACK请求。
只有以下四个步骤都发生,第二主机才会获得主机角色。步骤2到步骤4适用在当前主机上。
- 当前主机响应主机角色请求。
- 当前主机发送一个GETACCMST命令给第二主机。
- 第二主机用7位动态地址回复命令。7为动态地址的值和从机地址的值是相同的。如果第二主机以NACK回复,或者以不正确的7位地址回复,则:第二主机将不会获得主机角色,取消GETACCMST命令,当前主机可以重试CCC,或者以STOP条件结束此过程
- 当前主机发出一个STOP:如果当前主机发出一个重复起始条件,则:第二主机将不会获得主机角色,取消GETACCMST命令,当前主机可以重试CCC,或者以STOP条件结束此过程。
SETBRGTGT
该直接CCC(表45)仅与桥接设备相关,即主机预先知道的I3C设备(不通过检查BCR位)为桥接设备。 I3C主机只能将此CCC发送到已知的接受它的桥接设备。
从机地址是从机的原始7位静态I2C地址,如果从机没有此类静态I2C地址,则为7’h00。
Count是桥接“从机”的数量。
每个描述的桥接“从机”由两个字段表示:
- 动态地址:7个最高有效位(位[7:1])包含从机的主主机分配的7位动态地址的当前值,而最低有效位(位[0])则用该值填充 1’b0。 对于旧版I2C设备,动态地址的值应为7’h00。
- ID:桥接设备的16位明确标识符(两个字节)
ID字段的含义不是本规范定义的,它应该是网桥和主服务器(或向主服务器提供此类信息的任何其他实体)之间的合同。 例如,高半字节可能指示通信类型(例如I2C,SPI,UART,LIN等),而低12位可能是端口(作为端口号和设备选择器)。
GETMXDS
主机利用此CCC决定一个从机设备的SDR模式数据速率限制。仅当被寻址的从机设备的总线控制寄存器(BCR,Bus Control Register)的位0设置为1’b1时,需要主机使用此命令。仅当上述条件发生时,从机才支持此命令。
总线特性寄存器的位0应该在从时钟到数据周转时间大于12ns的从机中设置。除非存在其他限制,否则tSCO延迟范围内的从机不应设置限制位(即位[0])。 但是设备应支持此CCC,以便在计算读取的最大有效频率时可以更好地考虑每个数字,因为可以告知主/系统设计者tSCO参数以及线长(传播时间),线电容,从站数量 和存根(如果有)。
tSCO延迟是从SCL输入到SDA输出的总内部延迟的量度,不包括其他因素,例如线路电容和路径延迟,这些因素不计入器件计算范围,而是纳入更广泛的计算范围。 tSCO延迟适用于主设备和从设备,因为基于系统配置,主设备在多主系统中可能充当从设备。
任何从时钟到数据的周转(tSCO)延迟大于12 ns的从设备,都应将maxRD字节的“时钟到数据的周转”字段设置为3’b111,并通过私下协议将此值报告给主设备。
最大读取周转时间用于通知主机在读取其请求的数据之前要等待多长时间。 这样,主机就可以为数据读取请求(不包括带内中断响应)获得从设备的周转延迟时间。因为某些从站可能会由于时钟启动效应,桥接,内部处理器变慢等原因而出现数据读取延迟(与CCC读取相反)。主机可以使用返回的延迟因子来避免由于过早读取设备而导致的NACK。从设备可以在报告时间之前准备好数据,主设备也可以估算时间,并在最大读取周转时间之前重试读取。主机应意识到,在最大时间之前,来自从设备的读取请求的任何NACK都是正常情况,并且不需要恢复方法;相反,在最大数据周转时间之后的NACK应作相应处理。
注意:此CCC与位数据速率和读取周转时间有关,与数据大小无关。 数据大小是CCC获取最大读取长度(GETMRL)和获取最大写入长度(GETMWL)的主题。
从机设备返回格式有两种:
格式1:两个数据字节包含从机设备的最大读/写速度
格式2:五个数据字节包含从机设备的最大读写速度以及三字节最大读转换速度。
从机通过返回的数据字节数来表示要返回的格式:两个字节表示格式1,五个字节表示格式2。
从机选择格式1与格式2,应基于是否需要将最大读取周转时间传达给主设备。
表48,表49和表50分别显示了对返回字段maxWr,maxRd和(仅对于格式2)maxRdTurn的解释。
SETAASA
这个CCC允许主机请求所有连接的从机使用自己已知的静态地址作为他们的动态地址。这是为带静态地址的从机分配I3C动态地址最快的方法。
动态地址
简介
对于I3C从设备来说,动态地址由主设备分配,主设备会动态为从设备分配地址,在分配动态地址时I3C会有一个仲裁的过程,当有多个从设备的情况下,主设备需要利用仲裁器产生一个仲裁的过程,这个过程会在所有的从设备里选择一个获胜的设备,获胜的设备获取到本次仲裁,仲裁的结果就是将动态地址分配给这个设备
使用动态地址的好处就是可以忽略I2C上面的复用电路,在I2C上若有多个相同地址的从设备那么需要使用复用电路来进行通讯,而动态地址可以更加灵活的避免这个问题,同时也节省了电路上的布局和复杂性
对于I3C从设备来说,它分配的地址大小是7 BIT的,这与I2C静态地址一样
I3C向前兼容所以依然支持I2C的复用电路,仅发生在与I2C设备通讯上
登记册的标准化特征
简介
每个I3C设备都应有两个寄存器,这两个寄存器的作用为特性寄存器,名为BCR、DCR,其次还有一个临时的48位BIT的ID,这个ID由厂商设置,这三个值组合为Standardized characteristics register(登记册的标准化特征)
BCR
简介
BCR(Bus Characteristic Register)是只读寄存器,它的作用是告诉主机从设备对IBI请求的支持,以及通用CCC命令的响应类型
寄存器位介绍
BIT | Name | Description |
---|---|---|
BCR [7] — BCR [6] | 设备角色 [1] — 设备角色 [0] | 2’b00-I3C从机 2’b01-I3C主控 2’b10-保留供MIPI Sensor WG未来定义 |
BCR [5] | 仅SDR/SDR和HDR功能 | 0 - 仅限SDR 1 - 具有HDR功能 |
BCR [4] | 桥识别器² | 0 - 不是桥接装置 1 - 是桥接装置 |
BCR [3] | 离线能力³ | 0 - 设备将始终响应i3c总线命令 1 - 设备始终不会响应i3c总线命令 |
BCR [2] | IBI有效载荷 | 0 -接受的IBI后面没有数据字节 1 - 一个或多个数据字节必须遵循公认的IBI。 数据字节连续性由T位表示 |
BCR [1] | 支持IBI请求 | 0 - 不支持 1 - 支持 |
BCR [0] | 最大数据速度限制 | 0 - 无限制 1 - 限制 |
Note
1)
对于充当I3C主控的I3C设备,BCR设备角色位将包含值2’b01
2)
桥接设备需要符合I3C的MIPI规范
3)
具有脱机功能的设备保留动态地址,并在第2.2节中规定
4)
主机应使用GETMXDS CCC询问从机的具体限制
DCR
简介
DCR(Device Characteristic Register)用于描述I3C设备类型
寄存器位介绍
BIT | Name | Description |
---|---|---|
DCR [7] — DCR [6] — DCR [5] — DCR [4] — DCR [3] — DCR [2] — DCR [1] — DCR [0] | 设备ID [7] — 设备ID [6] — 设备ID [5] — 设备ID [4] — 设备ID [3] — 设备ID [2] — 设备ID [1] — 设备ID [0] | 255个用于描述传感器或设备类型的可用代码。 — 示例:加速度计、陀螺仪、复合设备 — 默认值为8’b0:通用设备 |
Provisional ID
简介
Provisional ID用于表示临时48位ID,这个ID不是随便设定的,是具有一定规范,具体规范可以参考下面的寄存器介绍
寄存器位介绍
BIT | Description |
---|---|
PID [47:33] | MIPI制造商ID [MIPI01](15位)注意:MIPI制造商ID的最高有效位被丢弃,即仅使用15个最低有效位 |
PID [32] | 临时ID类型选择器(一位,1’b1:随机值,1’b0:供应商固定值) |
PID [31:0] | 32位包含供应商固定值或随机值,具体取决于位[32]的值: >如果位[32]的值为1’b0:供应商固定值: *位[31:16]:部件ID:此16位字段的含义留给设备供应商来定义。 *位[15:12]:实例ID:此4位字段中的值应使用系统设计者选择的方法来标识单个设备。 例如:皮带,保险丝,非易失性存储器或其他合适的方法。 *位[11:0]:此12位字段的含义留有定义,并具有其他含义。 例如:更深的设备特征,可以选择包括设备特征寄存器值。 如果[32]位的值为1’b1:随机值: *位[31:0]:设备随机生成的32位值。 可以使用命令代码进入测试模式(ENTTM)通过常规测试模式查询该值。 |
在测试模式下临时ID可以随机化
分配动态地址过程
简单来说:I3C主机会开始发送设置动态地址的命令,同一时刻下会有多个I3C设备收到这条命令,此时I3C主机是有每个从设备的登记册的标准化特征,最终仲裁结果将由特征值最小的I3C设备获得本轮仲裁,并得到这个动态地址
具体过程如下:
- I3C主设备会发送START信号表示要开始工作,随后发送ENTDAA命令,当从机(只有没有分配动态地址且不是热连接设备才会响应)响应到此命令时会立即作出反应 (返回ACK),因是广播命令所以所有的从机都会在此刻收到这条命令,为了唯一性主机需要进行一轮仲裁在所有响应的从设备里选中一个从设备,并让这个从设备得到本次分配动态地址的权力
- 发送重复START信号以表示开始分配动态地址,使用广播地址7’h7E,且RnW位为高(即读)
- 主机只能驱动SCL线。 主控主机应将SDA线释放到High-Z(高阻抗,因此时是在漏极开漏下进行工作,如果想输出高电平需让NMOS短路才能使其上拉正确工作,否则NMOS源极接地会将电平拉至地)状态,以允许SDA通过总线上拉电阻变为高电平
- 从设备发送有效48位登记特征码,48位连续发送不带ACK / NACK脉冲
- 主设备收到所有登记特征码后选择其中最小的一个登记特征码获得本次仲裁
- 主机发送登记特征码至从机,从机判断是否属于自己的登记特征码来决定是否接收下一次的数据
- 主设备发送包含7位动态地址的数据,由上一次对应的登记特征码从设备作出响应并接收
- 主设备发送第九位数据,这个数据是XOR奇校验(XOR(dynamic_address [7:1])),所以第九位理应为0
- 从设备收到奇偶校验位时回复ACK或NACK,此时主机决定是重复此过程还是发送STOP命令来结束,主机会尝试重复开始步骤,直到没有收到ACK返回时则发送STOP信号来结束通讯
如果从机不确认分配的动态地址,即回复NACK,则重新开始一次仲裁,从机可以继续使用登记特征来赢得仲裁,如果第二次仍然不确认则主机理应退出地址分配程序,进入错误工作
针对辅助主设备,可以使用DEFSLVS命令获取主设备的从设备属性列表,假如主设备此时已经分配过动态地址了,如果再让辅助主设备在进行一次分配很明显是不合理的,所以可以使用DEFSLVS命令来从主设备获取到从设备属性列表
或者辅助主机遵循动态地址分配过程,遵循相同步骤的辅助主设备将收到所有相同的数据(即监听主机分配地址过程,将主机分配的过程记录下来)
在任何情况下,从设备都应使用登记特征作为仲裁的条件,除非从设备支持静态地址且需要主机也支持静态地址分配
重复登记特征
因无法保证临时48位ID是不重复的,虽然很小概率会遇到重复的设备,主机需要具有能够检测这些重复ID的功能,并且需要主设备自己能够处理重复地址的问题
IBI带内中断
简介
带内中断是I3C特有的中断方式,它不需要额外的PIN线即可实现中断电平请求,传统的I2C传感器是需要Master实时读取数据,当有新的数据时I2C是无法主动发起通讯要求Master读取的,而I3C则提供了带内中断,此中断与IRQ中断不同,它没有内部定义事件处理函数,它的处理过程行为由从机和Master共同决定,I3C传感器可以通过带内中断来让Master读取数据
前提要求
如果BCR[1]为1且BCR[2](某些设备可能对数据流有硬性要求)也为1则要求主机先执行SETMRL命令设置读取字节限制
如果BCR[2]不为1则无需设置,那么IBI不会读Check读取字节限制,以T位作为有效位连续读取
请求过程
- I3C从设备将SDA线拉低然后等待Master将SCL拉低来回应ACK
- 当Master将SCL拉低以后则同时将SCL时钟提供给从机,随后从机享有SDA控制权
- 随后从机通过SDA发送带有自己动态地址的数据同时会带有值为1’b1的RnW位(强制要求RnW位为1,否则master会视此次请求为无效请求)
- 至此完成了一次IBI请求
处理过程
I3C主机收到从机发来的动态地址后随后会从自己的存储器里取出从设备属性列表,并从中取出BCR,同时从BCR[2]来决定接下来的操作,如果此位为1则代表需要进行读取操作,那么Master需要对从机进行读取操作,至于读取多少位取决于数据位的T位,若T位有效则代表后续还有数据,直到遇到非有效的T位则停下,随后主机可以决定是发送START重复信号还是STOP来结束通讯
其次若BCR[2]为0则代表没有强制要读取的字节流,Master可以对它进行其它任意CCC命令的操作,或者直接STOP在或者再次发送START重复条件来重新启动通讯
这里T位的有效位需要详细说明一下,即I3C主机每次取到数据都进行奇校验若正确则后续还有数据,若不正确(即从机故意发送一个损坏的奇校验数据)则意味着没有要强制读取的数据了,注意这个情况仅限IBI中断
IBI概念时序图
优先级
同一时间下可能有多个从设备一起请求IBI,则此时Master会立即进入仲裁,它会收到从设备的动态地址,并在从设备属性列表里取出优先级随后选择优先级最高的那个处理IBI,即选择地址登记特征值最低的那个从设备
线与
简介
线与是指的是在一根PIN线上外接其它超过两根以上PIN线则可以实现按位与的功能
原理
I3C仲裁发生在SDA线上,而SDA线使用的是漏极开漏输出(OD门),所有的从设备SDA都是采用漏极开漏输出,当有两个以上的OD门通道时那么可以实现逻辑与的功能,核心原理在于所有的通道输出当输出为1(高电平)时漏极为开路状态,呈现高阻抗状态,那么电平则通过上拉输出高电平,那么整个通道就呈现为1,如果有一个电平输出为低电平,源极导通会将整个通道上的电流拉入到地线上,从而使整个电路呈现低电平
通俗易懂的说就是只有此刻接在通道上面的所有通道为1时才为1,只要有一个不为1都为0
在I3C中的体现
在I3C中因为只有两根线,若上面外接了多个从设备那么同一时刻只有一个从设备可以进行通讯,但是最开始时每个从设备并不知道自己是否拥有总线控制权,所以当从设备发送Start时都会将自己视为拥有总线控制权,假如此时有两个从设备同时发送Start信号,那么主设备实际上只收到了一个Start信号,然后两个从设备继续开始发送数据,但是每次发送之后从设备都需要检查SDA线是否与自己发送的电平一致。
如A设备发送高电平,B设备发送低电平,那么根据线与特性此时SDA呈现低电平,那么由B设备获得本次仲裁继续发送电平,而A设备发送与自己发送的不一致则放弃本次通讯,同时由于前面通讯数据一致所以不会造成数据不一致的情况
至此完成了多个设备同时发送START信号时的仲裁,以低电平优先。
热加入机制
简介
热加入机制也称为热连接机制,其目的是为I3C从设备提供一种能够动态加入的总线的方法,为一些需要时常进入睡眠的设备提供的一种方案。
例如某些设备在收到变化之前才会产生数据,那么此时这个设备可以使用内部的低功耗模块进入低功耗,将时钟关闭直到数据醒来,那么此时就需要从I3C总线上断开,断开之后当唤醒时又通过热加入机制接入I3C总线继续通讯。
同时热连接设备属于特殊设备,它与普通I3C设备不同,它无法参与I3C初始化与地址分配。
热连接过程
I3C热加入设备是通过IBI来实现热加入的,与普通IBI不同,热加入产生IBI时发送自己的地址在I3C中MIPI有一个特殊地址,用于产生IBI热连接加入时的标注:7’b0000_010(0x02)
- 首先热连接设备需要等待总线处于空闲状态(SCL、SDA都为高电平)
- 随后将SDA拉低,等待Master将SCL拉低
- Master将SCL拉低后,热加入设备享有SDA控制权与SCL时钟信号享有权
- 热加入从设备发送Start信号,随后发送地址,其RnW为写(1),地址为:7’b0000_010
- 随后Master确认地址是7’b0000_010时会要求从机发送登记特征值
- 收到登记特征值后为其分配动态地址
- Master将登记信息记录到从设备属性列表里
至此热加入设备与普通从设备一样没有其它区别
在I3C总线完成地址分配之前,热连接设备不允许加入I3C总线,只能等待总线分配完成之后加入,也就是说热连接设备会忽略动态分配地址的CCC命令
在等待Master收到热加入设备发送的7’b0000_010时Master可以做三个操作:
- 响应并分配动态地址
- 拒绝热加入设备的请求
- 回复广播CCC来拒绝加入请求
I3C第二主机请求成为当前主机
请求流程
- 为了执行请求,I3C辅助主机应等待一个START(不是重复的START)或总线可用状态,然后发出自己的START。
- 启动后,I3C辅助主设备应在I3C总线上发布其自己的动态地址,其后的RnW位为0,以请求成为当前主设备。
- 如果I3C辅助主机通过拥有较低的动态地址而赢得仲裁,并且如果当前主机当前愿意将主控权交还给请求者,则当前主机应以ACK做出响应。
- ACK之后,当前主控方可以发出一个或多个命令,然后发出GETACCMST CCC,然后发出STOP,这将释放SCL线的控制权,因此也释放I3C总线的主控权。
- 在STOP和总线可用状态之后,I3C辅助主设备承担当前主设备的角色,并控制I3C总线。
工作模式
简介
I3C支持两个工作模式:SDR Mode、HDR Mode,HDR Mode为高频模式,频率可以达到20MB
Single Data Rate (SDR) Mode
简介
Single Data Rate简称为SDR模式,这个模式为I3C默认的工作模式,即I3C设备完成初始化后默认使用此模式
特点
IBI带内中断
Master提供的中断机制,从机可以利用此中断来主动对Master发起通讯要求
热加入机制
热加入允许I3C从设备在主设备完成初始化之后在接入I3C总线,这个机制允许从设备可以进入低功耗状态,在有需要时唤醒在接入I3C总线
CCC命令码
命令码分为广播与直接,用于与从机交互
动态地址分配
区别于I2C静态地址,动态地址可以解决地址重复的问题
I2C设备到I3C设备的转换
可以支持非传统I2C设备到I3C设备的转换,列如I3C从机是兼容I2C的,它可以在开始接入总线时以I2C方式工作,随后可以通过利用Matser的CCC命令来切换到I3C从机
兼容I2C设备
I3C设备兼容传统I2C设备的通讯,同时支持I2C静态地址寻址方式,不支持非传统的I2C设备
12.5MB的工作频率
因SCL时钟线使用推挽输出电路,所以其时钟工作频率可达12.5MB
流量忽略
当I3C主设备在与I2C设备通讯时需要进行分频,将频率与I2C设备一致才可以与之通讯,因为I2C通讯频率最高为5M,标准模式下也才100kbit,这与I3C相差甚大
通讯时总线上的I3C从设备能够正确忽略掉I3C主设备与I2C从设备的流量,原因是因为频率差,I3C通讯时是需要在一个时钟周期内响应ACK的,但由于与I2C设备通讯时频率较慢所以I3C从设备并不能正确的识别是否为Start信号,即便I3C从设备收到了信号也会认为可能本次通讯是一次噪声产生的,会主动忽略
由于I3C下工作频率过高,如果想要与I2C设备通讯需要进行分频至与I2C一致才能正常通信,同时I3C通讯时频率过高所以传统的I2C设备是看不到I3C的流量的,其次I3C从设备也会忽略掉I3C主设备与I2C从设备通讯时的流量
I3C不支持I2C 10bit扩展地址
High Data Rate(HDR)Mode
简介
基础的I3C设备是不支持HDR模式的,HDR为High Data Rate(高数据速率),基础的I3C设备不支持HDR模式,但需要能够检测并支持进入、退出、重启HDR模式,若HDR某一子模式与自身工作频率相同那么可以在此模式上进行通讯
子模式
HDR模式是利用两个时钟沿来做时钟信号,所以时钟频率会快至两倍,SDR模式只有在SCL为高时进行一次采样,而HDR模式在SCL为高或低时都进行一次采样
HDR-DDR
双速率模式(HDR-DDR),通讯模式与SDR无异样,与SDR模式一样使用CCC命令来进行通信,传输频率高达:25Mbit/s
HDR-TSL
Ternary Symbol Legacy (HDR-TSL) Mode(三元编码模式),此模式拥有更高的速率并且使用三元编码来进行编码传输,以此获得更高速率,它不使用普通传输协议,不兼容I2C协议,其传输频率高达:30 Mbit/s
HDR-TSP
Ternary Symbol Pure-bus (HDR-TSP) Mode(三值编码模式),此模式拥有更高的速率并且使用三值编码来进行编码传输,以此获得更高速率,它不使用普通传输协议,不兼容I2C协议,其传输频率高达:37.5 Mbit/s
只有DDR模式下的通讯过程与SDR一样以外,其它两个模式均不一样,需要特定的解码,具体需要联系MIPI联盟
进入与退出
传统I3C设备需要具备监听进入HDR模式的进入与退出,当退出HDR模式时则为SDR模式
HDR进入
- I3C主机广播一个进入HDR模式的CCC,指明将要进入哪个HDR模式
- 总线上的I3C设备转换到HDR模式
HDR退出
- SDA起始高电平,SCL起始低电平
- SDA从高电平向低电平转换四次,同时SCL保持低电平
- 每个SDA转换之间的间隔至少为50ns
- 拉高SCL电平
HDR重启
- SDA起始高电平,SCL起始低电平
- SDA翻转四次(下降,上升,下降,上升)
- 下一边缘是SCL上升。SDA可能会随着SCL上升而改变,但SCL保持上升
检测器
上述的退出与重启电平变化需要I3C设备自主监听,所以MIPI定制了一种检测器的电路结构,用于检测退出与重启,因为对于进入I3C只是检测CCC命令码所以不需要额外的检测器
当退出与重启时都由检测器来进行检测当前是否退出或重启HDR模式,并且这些检测器只有在进入HDR模式时才会使能
检测器是利用触发器实现的,下图是退出模式的检测器原理图与说明:
对于数字逻辑实现,基本的逻辑模型中SCL位于低电平,所以将SCL拉高将复位检测器。仅使用SDA下降沿,将SDA当作时钟。原理如下图:
检测器使用SDA的反相版本作为时钟(因此为上升沿逻辑,但可以使用下降沿逻辑),并在SCL为高电平或模块不在HDR模式时复位。 复位的异步特性保证了安全性。 如图28所示。由于在HDR模式下SCL与SDA的特性同时发生变化,因此在SDA之后和下一个SDA之前,总线从机可能会看到SCL发生变化。如果HDR退出模式检测器只使用时钟逻辑,则它根本看不到任何变化(在此示例中,SDA上升沿时将始终看到SCL为低电平)。 因为检测器在SCL上使用异步复位,所以即使在上述情况(b)中,SCL的更改也会影响计数器。 请注意,每次更改之间SCL和SDA仍将保持约50ns。 因此,如图所示,如果SCL随时升高,则应重置HDR退出模式检测器,因此不会错误地发出错误的退出信号。
重启与退出类似,在退出的检测器上额外增加了一些数字电路:
在基本的逻辑模型中,SCL保持低电平(0),当SCL拉高时会复位主检测器。同时利用SDA的下降沿,将SDA当作时钟。仅当出现两个下降沿的时候会检测到HDR重新启动,并先验证上升沿,然后验证HDR重新启动所需的SCL更改。
这个检测器以HDR退出模式检测器为基础建立,两个SDA下降沿出现之后,伴随着一个上升沿,HDR重启模式检查SCL的上升沿。无需考虑相同时刻SDA是否变为低电平;关键点在SCL的拉高。因为即使SDA变为低电平(因此触发退出模式检测器中的下一个触发器),由于尚未看到SDA的上升沿,因此左上触发器仍将保持1。
对于检测器,可以使用数字逻辑也可以使用软件形式实现,这个取决于供应商,只要能够检测到电平周期的变化响应退出周期和重启周期就可以了
公共传输格式
SDR与HDR均使用此协议传输
- Start或重复Start信号
- 地址位
- 命令位
- 数据位
- 重复或停止信号
这是大致格式类型,具体格式是根据CCC命令来封装的,请参考CCC 命令章节
对比
特性对比
说明 | UART | SPI | I2C | I3C |
---|---|---|---|---|
通信速率 | 最大115200bps | 不定,最高几M | 400K,最高1M | SDR 4/8.8M,HDR 20M以上 |
通信方式 | 全双工异步串行 | 全双工同步串行 | 半双工同步串行 | 同步串行 |
clk | 事先约定好 | 可调 | 可调 | 可调 |
从属关系 | 不存在从属关系 | 存在主从设备。SPI用 片选信号选择从机 | 存在主从设备。IIC用地址(静态)选择从机。存在主从设备。 | 用地址(动态、广播)选择从机。 |
信号线 | RX、TX、GND | SDO、SDI、SCLK SS | SDA SCLK | SDA、SCLK |
单次传输 | 5-8bit | 8bit | 8bit8bit |
功耗对比
通讯优势
与I2C不同,从设备不能操控SCL线,只能由Master来控制SCL线,从设备只能监听SCL线的时钟变化来对SDA进行操作,这样的好处在于不需要从设备去拉低或拉高SCL线,这样如果Master和从设备一起去拉SCL可能导致总线卡住,I3C上完全由Master来控制SCL线,从设备只能监听