3. I3C设备角色:主设备与从设备

这一章我们来聊聊I3C总线上的两个基本角色:Master(主设备)和Slave(从设备)。很多人刚开始学I3C时,觉得这不就是I²C那套主从关系吗?

其实差别不小。I3C的主设备和从设备,在动态地址分配这个场景里,职责划分更细,也更灵活。我个人习惯先理清角色,再去看协议细节,这样思路不会乱。

3.1 主设备的职责

主设备,说白了就是发起总线通信的那个家伙。在I3C总线上,同一时刻只能有一个Master,但它可以有好几个——通过动态角色切换来实现。

主设备的核心任务:

  • 产生总线时钟(SCL)并控制数据传输速率
  • 发起START条件、发送地址、产生STOP条件
  • 管理动态地址分配(DA过程)
  • 处理总线错误(如超时、奇偶校验失败)
  • 支持/发起角色切换(Handoff)

我在项目中遇到过一种情况:用普通MCU做Master,结果动态地址分配时时钟频率跑得不够稳,导致某些Slave丢了响应。后来加了个硬件I3C控制器才解决。嗯,这里要注意——如果你是纯软件模拟时序,务必留好余量。

3.2 从设备的职责

从设备更“被动”,它不能自己发起传输,只能响应主设备的命令。但I3C的Slave有个厉害的地方:支持带内中断(IBI)和热接入(Hot-Join)。说白了,它能主动“插话”,只是需要先请求。

主设备 vs 从设备职责对比
职责项主设备从设备
产生时钟是否
发起传输是否(IBI除外)
动态地址分配控制者参与者
带内中断(IBI)接收并响应发起请求
热接入支持检测并分配地址发送热接入请求
角色切换可以主动交出控制权可以升级为Master

我曾经在一个多传感器项目中,用了一个低成本的MCU做Master,结果它不支持动态地址分配的所有子状态。没办法,只能外挂一个I3C桥接芯片。所以选主设备时,最好查一下它的I3C控制器版本——MIPI I3C Basic还是I3C Full?区别不小。

3.3 动态地址分配中的角色互动

你想想看,动态地址分配(DA)其实就是Master给Slave发身份证的过程。Master轮询总线上的新设备,收到请求后分配一个唯一的7位地址,再让Slave确认。

举个例子:一个Master带着三个刚上电的从设备。Master先发ENEC命令开启动态地址分配事件,然后依次发送SETDASA或ENTDAA。Slave收到后,会用自己的临时地址(或0x7E)应答。整个过程像考试发卷子——Master喊名字,Slave领卷子。

避坑:有些Slave在动态地址分配时,如果Master发的地址校验码(奇偶位)不对,它会直接忽略。这在多Master切换时容易出问题。我建议在分配完成后加一次验证读取,确保地址写进去了。

3.4 I3C总线角色关系图

下面这张图展示了典型的I3C总线主从结构,以及动态地址分配的简要流程。箭头方向代表通信发起方。

I3C 主从设备与动态地址分配流程图 主设备 (Master) Slave A (DA阶段) Slave B (DA完成) Slave C (Hot-Join) 双向总线 (SCL + SDA) 动态地址分配过程中 Master 遍历所有从设备 → 分配唯一地址 → 从设备确认 (若支持 Hot-Join,从设备可后来申请地址) 主设备 从设备(DA) 已分配 热接入

注意图中的“Hot-Join”从设备,它可以在主设备完成其他地址分配后,再通过带内中断请求分配地址。这个功能在热插拔场景特别有用。我当年做手机传感器集线器时就靠它,省了一个外部的地址选择引脚。

3.5 实际项目中的角色选择建议

选主设备时,我建议优先考虑带硬件I3C控制器的芯片。纯软件模拟虽然可行,但动态地址分配的时间窗口很窄,一不小心就超时。另外,如果系统需要多主能力,得确认Master是否支持角色切换(即Secondary Master)。

从设备方面,第一要看它是否提供默认的静态地址(一般是7位或7位+1位奇偶),第二要看它能否通过Dynamic Address Assignment重新编号。有些老器件只支持固定地址,那就没法进DA流程,只能退回到I²C兼容模式。

// 伪代码示例:Master执行动态地址分配流程
for (each slave in bus) {
    master_send_entdaa();           // 启动动态地址分配
    slave_respond_with_its_uid();   // 从设备返回唯一ID
    master_assign_new_addr();       // 主设备分配地址并发送
    slave_ack_or_nack();            // 从设备应答
    if (nack) retry;
}

再次提醒:动态地址分配过程中,如果Master中途断电或复位,所有Slave的地址会丢失。下次再上电必须重新分配。要是你的产品需要掉电保持地址,记得让Slave把地址存到非易失存储器里——但I3C本身不强制这么做,得靠应用层实现。

好了,这一章关于主从设备角色就说到这里。记住一个核心:Master是“话事人”,Slave是“听话但能敲门”的。搞清楚了这两者的职责,后面学动态地址分配流程就会轻松很多。