I3C协议与Hot-Join简介
I3C(Improved Inter Integrated Circuit)是由MIPI联盟推出的新一代串行通信协议,旨在替代传统的I2C协议。相比I2C,I3C提供了更高的数据速率、更低的功耗以及更丰富的功能特性,如动态地址分配、In-Band Interrupt(IBI)、Hot-Join、节能模式等。
与传统的I2C协议不同,I3C支持动态地址分配和更高效的事件通知机制。Hot-Join是I3C的关键特性之一,适用于系统运行过程中新增传感器或外设的场景。控制器必须识别该IBI为Hot-Join类型,并决定是否接受该设备加入。
Hot-Join是I3C协议中的一种机制,允许新的目标设备在总线运行过程中加入通信。目标设备通过拉低SDA线并发起In-Band Interrupt (IBI)请求,通知控制器其加入意图。
本文将详细介绍在LPC55S36平台上如何处理I3C协议中的Hot-Join(热插拔)事件,包括控制器寄存器配置、协议流程解析、目标设备代码实现,以及逻辑分析仪截图辅助说明。
硬件环境:
开发板:LPC55S36 EVK
软件环境:
IDE:MCUXpresso IDE v25.06.0
SDK:SDK Builder | MCUXpresso SDK Builder (nxp.com)
基础工程:
lpcxpresso55s36_i3c_interrupt_b2b_transfer_master; lpcxpresso55s36_i3c_interrupt_b2b_transfer_slave
I3C协议中的Hot-Join流程图
根据I3C spe中的Hot-Join流程图,Hot-Join流程概述:

2.1 总线空闲(Bus Idle)
总线处于空闲状态,目标设备检测到总线空闲后尝试发起Hot-Join。
2.2发送Hot-Join请求
设备发出START条件,并发送Hot-Join地址(固定为0x7E)。
RnW=0(写操作),表示Hot-Join请求。
2.3主机响应
主机根据当前总线状态和策略,可能:
2.3.1 ACK:接受Hot-Join
主机发送STOP,表示请求完成。
后续执行DAA(Dynamic AddressAssignment)流程,为新设备分配动态地址。
2.3.2 NACK:拒绝Hot-Join(暂时不允许加入)
设备会稍后重试。
目标设备(Slave) Hot-Join关键代码
i3c_slave_config_tslaveConfig;
I3C_SlaveGetDefaultConfig(&slaveConfig);
slaveConfig.staticAddr = I3C_STATIC_ADDRESS;
slaveConfig.vendorID = I3C_VENDOR_ID;
slaveConfig.offline =false;
I3C_SlaveInit(EXAMPLE_SLAVE, &slaveConfig, I3C_SLAVE_CLOCK_FREQUENCY);
i3c_slave_handle_tslaveHandle;
I3C_SlaveTransferCreateHandle(EXAMPLE_SLAVE, &slaveHandle, i3c_slave_callback,NULL);
I3C_SlaveTransferNonBlocking(EXAMPLE_SLAVE, &slaveHandle, kI3C_SlaveAllEvents);
I3C_SlaveRequestEvent(EXAMPLE_SLAVE, kI3C_SlaveEventHotJoinReq);
g_requestSent =false;
while(!g_requestSent)
{
}
I3C_SlaveRequestEvent(EXAMPLE_SLAVE,kI3C_SlaveEventHotJoinReq);
为目标设备的hot join请求。
主设备(master) Hot-Join关键代码
在LPC55S36中,控制器通过配置MCTRL寄存器来处理I3C总线上的Hot-Join请求。整个流程分为两个阶段:监听阶段和响应阶段,确保控制器能够灵活应对目标设备的动态接入。
4.1 配置MCTRL寄存器,进入AutoIBI +Manual模式
mctrlVal = I3C0->MCTRL; mctrlVal &= ~(I3C_MCTRL_REQUEST_MASK | I3C_MCTRL_IBIRESP_MASK); mctrlVal |= I3C_MCTRL_REQUEST(kI3C_RequestAutoIbi) | I3C_MCTRL_IBIRESP(kI3C_IbiRespManual); I3C0->MCTRL = mctrlVal;
kI3C_RequestAutoIbi:
控制器进入自动监听模式,当目标设备拉低SDA发起IBI(如Hot-Join)时,控制器自动检测
kI3C_IbiRespManual:
控制器在收到IBI后不立即响应,而是进入等待状态,由应用程序决定是否ACK或NACK
此阶段的配置是为了确保控制器能够捕捉到Hot-Join请求,并将处理权交给软件层
4.2轮询MSTATUS寄存器,等待Hot-Join IBI到来
do{
mstatusVal = I3C0->MSTATUS;
}while(((mstatusVal & I3C_MSTATUS_NACKED_MASK) == I3C_MSTATUS_NACKED(1)) ||
((mstatusVal & I3C_MSTATUS_IBITYPE_MASK) != I3C_MSTATUS_IBITYPE(3)) ||
((mstatusVal & I3C_MSTATUS_SLVSTART_MASK) != I3C_MSTATUS_SLVSTART(1)) ||
((mstatusVal & I3C_MSTATUS_MCTRLDONE_MASK) != I3C_MSTATUS_MCTRLDONE(1)) ||
((mstatusVal & I3C_MSTATUS_COMPLETE_MASK) != I3C_MSTATUS_COMPLETE(1)) ||
((mstatusVal & I3C_MSTATUS_IBIWON_MASK) != I3C_MSTATUS_IBIWON(1)));
4.3手动ACK Hot-Join请求
mctrlVal &= ~(I3C_MCTRL_IBIRESP_MASK | I3C_MCTRL_REQUEST_MASK); mctrlVal |= I3C_MCTRL_IBIRESP(kI3C_IbiRespAck) | I3C_MCTRL_REQUEST(kI3C_RequestIbiAckNack); I3C0->MCTRL = mctrlVal;
kI3C_RequestIbiAckNack:发起手动ACK/NACK请求
kI3C_IbiRespAck:明确表示接受该Hot-Join请求
此阶段是对第一阶段的补充,完成对目标设备的响应
4.4发送STOP
I3C_MasterEmitStop(I3C0,true);
4.5 执行DAA(Dynamic AddressAssignment)流程
I3C_MasterProcessDAA(EXAMPLE_MASTER, addressList, 8);
逻辑分析仪截图
逻辑分析仪显示,目标设备发起Hot-Join,主设备成功ACK并动态分配地址。

小结
本文基于LPC55S36平台,对I3C Hot Join机制进行了实践验证,完整梳理了Hot Join请求的发起流程以及主机侧的处理逻辑,为I3C总线设备的动态接入提供了可行的实现思路。
作者:Harry Zhang
-
寄存器
+关注
关注
31文章
5620浏览量
130423 -
总线
+关注
关注
10文章
3060浏览量
91868 -
串行通信
+关注
关注
4文章
610浏览量
37230
原文标题:一键上车:LPC55S36 I3C Hot-Join处理流程详解
文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
恩智浦LPC55S16 MCU获得了PSA 2级和SESIP 2级保证认证
当 I3C IBI 启动时如何删除 MDB 后的停止条件LPC55S36?
为什么无法在 LPC55S36 上使用 BLHost 转储代码(两块板上的 USB 连接问题)?
使用MCU链接调试器对LPC55s36板进行编程,调试会话后它永远不会连接的原因?
如何使用LPC55S36在目标模式下实现读取操作?
请问LPC5536是否包含代码看门狗 (CDOG) 外设?
Samsung S3C2440平台上的Vxworks BSP移植
I3C Introduction是什么意思
I2C和I3C的区别有哪些
I2C和I3C关于功耗和传输速率的对比
在恩智浦LPC55S36平台上如何处理I3C协议中的Hot-Join事件
评论