静态地址与动态地址:地址分配机制简介
说实话,地址分配是I3C总线里最容易让人头晕的地方之一。你想想看,一条总线上挂着好几个设备,主控怎么知道谁是谁?靠的就是地址。但I3C跟I2C不一样,它给了我们两套方案:一个叫静态地址,一个叫动态地址。这两者怎么配合,就是我们今天要聊的核心。
什么是静态地址?
静态地址,说白了就是设备出厂时厂家烧好的一个固定编号。它跟I2C的从机地址是一个路子。每个I3C设备都有个7位的静态地址,范围是0x08到0x7E。这里有个细节,0x00到0x07是保留的,我不建议你碰。
我记得刚做I3C项目那会儿,跟一个传感器厂商对过地址表。他们设备静态地址是0x1E,我说行,那就用这个。结果板上电一测,冲突了——另一家的芯片也用了0x1E。嗯,这就是静态地址最头疼的问题:你得人工协调,保证总线上没有重复地址。
静态地址的优点也很明显:简单、稳定。设备上电就能用,不需要任何握手流程。主控只管发地址,匹配上了就响应。我习惯把静态地址理解成人的身份证号——出生就定了,一辈子不变。
那动态地址又是什么?
动态地址就灵活多了。上电后主控会通过特定流程,给每个设备分配一个新地址。这个地址不再是固化的,是主控说了算。设备收到分配指令后,会把自己的通信地址改成这个新值。
你可能会问:「那要静态地址干嘛?直接用动态的不就完了?」
别急。动态地址分配有一个前提:设备必须能响应一个叫「ENTDAA」的协议。这个协议依赖设备本身的唯一ID,也就是DCR(Device Characteristic Register)和BCR(Bus Characteristic Register)。不是所有设备都支持这个流程,所以静态地址负责兜底。
我做的一个项目里,挂了三类芯片:主控、传感器、还有一颗老式的EEPROM。那EEPROM不支持动态地址分配,只能靠静态地址撑着。幸好静态地址只有它一个,没有冲突。说实话,这种混合场景在工程里非常常见。
地址分配怎么进行?
分配流程可以分为下面几步。我建议你用逻辑分析仪抓一遍,印象会深很多。
- 主控发起ENTDAA:主控在总线上发送ENTDAA命令,广播给所有从设备。
- 从设备应答:支持动态地址分配的从设备会依次响应,先发送自己的DCR和BCR信息。
- 主控分配地址:主控根据收到的信息,生成一个唯一动态地址,并通过SETNEWDA指令写入从设备。
- 从设备确认:从设备接收新地址后,回复ACK,并且从此刻起使用新地址通信。
- 重复直到完毕:主控继续询问下一个从设备,直到总线上所有支持动态地址的设备都被分配完毕。
静态 vs 动态:一张表说清楚
我整理了一张对比表,你直接存着看就行。这些差异在实际调试时非常有用。
| 对比维度 | 静态地址 | 动态地址 |
|---|---|---|
| 来源 | 厂商预设,固化在芯片中 | 主控分配,上电后动态协商 |
| 唯一性保障 | 需人工保证不冲突 | 主控负责分配唯一地址 |
| 灵活性 | 低,更换设备可能冲突 | 高,支持热插拔和动态拓扑 |
| 支持设备 | 所有I3C设备都必须支持 | 可选功能,老设备可能不支持 |
| 使用场景 | 上电初期、不支持的设备 | 正式通信、多设备环境 |
| 地址范围 | 0x08 - 0x7E | 由主控决定,无严格固定范围 |
从表格能看出来,静态地址适合做基础通信,动态地址解决扩展性问题。工程上我们一般先用静态地址握手,再切到动态地址工作。我个人的习惯是:上电后尽快完成动态地址分配,分配给每个设备之后,后面所有的读写操作全走动态地址。这样就不用手动维护地址冲突表了。
为什么要搞两套地址?
原因其实很简单:纯静态地址不够用。总线上设备多了,地址冲突概率直线上升。纯动态地址呢?老设备不支持,又没法兼容。所以I3C设计者折中了一下:静态地址做基础,动态地址做扩展。
你想想看,如果只有静态地址,那每次更换一个传感器,都得去翻手册确认地址有没有冲突。万一冲突了,就只能换设备或者改PCB,多麻烦。动态地址一出,主控自动分配,再也不用人工对地址表了。
当然,这不是说静态地址就真没用。有些场景下,比如系统刚上电、主控还没跑起来,只能靠静态地址维持基本通信。动态地址依赖主控的协议栈,哪天主控崩了,设备就失联了。静态地址则更可靠,甚至不用主控干预,设备自己就能被识别。我做过一个板子,主控挂掉后,我直接用静态地址从设备读寄存器,愣是找到了故障原因。
嗯,这里要注意一点:动态地址的分配时机。别在总线繁忙时去分配,容易丢包。我建议每次系统初始化后、在进入正常通信之前完成分配。分配完成后,主控应当记录一张地址映射表,方便后续查找。这个表在调试阶段特别有用,我能根据地址直接锁定是哪个设备出问题了。
总结一下地址分配的知识结构
我把核心逻辑画成了一张图,方便你理解。注意看静态地址和动态地址的分工,以及它们如何协作。
静态地址是硬件层的基础,动态地址是软件层的扩展。我做过好几种I3C设备的适配器,从传感器到微控制器,没有一次能完全避开静态地址的参与。说到底,这不是一个选择题,而是一个协作题:静态地址给出路,动态地址做优化。懂了这个逻辑,你再去看地址分配时序,会发现清晰很多。