I3C总线物理层:电平、时序、上拉电阻、总线状态
好了,咱们直接进入正题。这一章聊的是I3C的物理层,说白了就是那些看得见、摸得着的硬件规矩。你想想看,DMA要想高效地帮I3C分配地址,总线底层的这些电气特性如果搞不清楚,那上层软件写得再漂亮也白搭。我记得以前带过一个新人,上来就调DMA时序,折腾了一周没动静,最后发现是上拉电阻值选错了,信号毛刺太多。所以,物理层的东西,咱得先心里有数。
2.1 电平标准:不只是电压那么简单
I3C总线使用开漏(Open-Drain)和推挽(Push-Pull)两种驱动模式。这和I2C最大的区别就在于,I3C的动态更丰富。
- 开漏模式:用于传统I2C兼容场景和I3C的某些低速控制信号。总线空闲时是高电平,设备拉低来产生信号。其实这就是I2C的老办法。
- 推挽模式:I3C的高速传输(比如SDR、HDR模式)全靠它。主设备主动驱动总线到高或低,速度一下就上来了。我在项目里实测过,推挽模式的上升沿时间比开漏快了不止一个数量级。
电平具体是多少?I3C标准定义了VIL、VIH、VOL、VOH这几个阈值。简单说,逻辑“0”一般是0.4V以下,逻辑“1”是1.1V以上(以1.2V或1.8V总线电压为例)。你设计的DMA触发逻辑,得在这个范围内保证采样无误。
| 参数 | 最小值 | 最大值 | 说明 |
|---|---|---|---|
| VIL | -0.3V | 0.3 × VDD | 输入低电平阈值 |
| VIH | 0.7 × VDD | VDD + 0.3V | 输入高电平阈值 |
| VOL | 0V | 0.4V | 输出低电平(开漏时) |
| VOH | VDD - 0.4V | VDD | 输出高电平(推挽时) |
嗯,这里要注意,I3C允许从设备在开漏模式下应答,但主设备发送时基本都是推挽。DMA在配置GPIO或I3C控制器时,得清楚当前总线处于哪种驱动模式,否则电压匹配错了,数据就全乱了。
2.2 时序要求:DMA的节拍器
I3C的时序比I2C灵活,但核心的几个时间参数你必须吃透。DMA要想无缝接管地址分配,对下面这几个时间点得格外敏感。
- SCL时钟周期(tCYC):决定了总线速度。普通模式可以低至12.5MHz(80ns周期),高速模式能跑到30MHz以上。
- 数据建立时间(tSU)和保持时间(tHD):SDA相对于SCL的边沿要稳定。我习惯设tSU ≥ 5ns,tHD ≥ 0ns,这个余量够DMA反应了。
- 总线空闲时间(tIDLE):从STOP到下一个START,至少50ns。DMA得等这个时间过了才能启动下一轮传输。
为什么会这么讲究?因为DMA不像CPU会等中断,它按预设的传输描述符(Descriptor)干活。你想想看,如果DMA配置的采样点刚好落在数据变化中间,那抓到的就是错误数据。我曾经调试一个I3C地址分配超时问题,就是DMA的SCL边沿触发设置比实际快了2ns,导致地址字节总是多一个位偏移。
核心结论:时序参数是DMA与I3C握手的关键。你在设计DMA控制器时,必须把tSU和tHD设为可编程寄存器,方便适配不同从设备的工艺偏差。
2.3 上拉电阻:别小看这个电阻
I3C总线上,SCL和SDA都需要上拉电阻。但和I2C不同,I3C的主设备在推挽模式下不依赖上拉,只有从设备开漏应答时才靠它。所以阻值选多大,直接影响信号质量和功耗。
- 阻值范围:一般在1kΩ到10kΩ之间。总线速度快,电容大,就选小点的(比如1.5kΩ)。总线速度慢,功耗敏感,就选大点的(比如4.7kΩ)。
- 等效电容:每个从设备约有10pF寄生电容。总线总电容不能超过400pF,否则上升沿会变缓。我记得在某个传感器模组里,总线挂了8个设备,电容超过了极限,1MHz都跑不稳。
| 工作频率 | 总线电容 | 推荐上拉电阻 |
|---|---|---|
| ≤ 1 MHz | ≤ 100 pF | 4.7 kΩ |
| 1 ~ 12.5 MHz | 100 ~ 200 pF | 2.2 kΩ |
| ≥ 12.5 MHz | 200 ~ 400 pF | 1.5 kΩ |
警告:上拉电阻选小了,总线电流会变大,功耗飙升;选大了,上升沿变缓,DMA在采样时可能误判。我给你个避坑指南:在PCB量产前,务必用示波器测一下SCL的上升时间。我吃过一次亏——上拉选了10kΩ,结果信号斜率不够,DMA触发沿丢失,地址分配直接卡死。
2.4 总线状态:DMA的握手信号
I3C总线有五种基本状态:空闲、启动、数据、停止、以及热加入(Hot-Join)。DMA在地址分配场景中,最常打交道的是空闲、启动和停止。
- 总线空闲(Bus Idle):SCL和SDA都是高电平。DMA可以触发地址分配流程。
- 启动条件(START):SCL高电平时,SDA从高变低。DMA要能捕捉这个下降沿。
- 停止条件(STOP):SCL高电平时,SDA从低变高。DMA检测到后就知道传输结束了。
- 热加入:从设备主动拉低SDA请求参加。这个在地址分配里很常见,DMA得能响应这个动态事件。
你想想看,DMA要从一个状态顺畅地切换到另一个,硬件状态机必须知道总线的当前状态。我习惯在DMA控制器里加一个总线状态监视寄存器,实时反馈SCL/SDA电平。比如,空闲状态时,该寄存器为0x01;启动时,变成0x02;数据时,0x03。DMA拿到这个信息,才能决定下一步动作。
// 伪代码:DMA等待总线空闲后启动地址分配
if (bus_state_reg == BUS_IDLE) {
dma_start_address_assignment(); // 触发DMA传输
} else {
while (bus_state_reg != BUS_IDLE); // 轮询等待
}
一句话总结:物理层就是I3C的肢体语言,DMA是那个会读空气的执行者。电平、时序、上拉、状态,这四个维度你拿捏住了,后面的地址分配才能行云流水。