上一章讲到I2C协议,作为IIC的升级版,I3C的优点非常明显。总线依然采用SDA和SCL通信。
相比较IIC,I3C协议要复杂很多,网上有很多对I3C的介绍,但是对于真正需要编写I3C代码的人来说并不友好,内容千篇一律,使用协议过程中遇到问题却很难找到答案,作者已经实现使用I3C协议对传感器寄存器进行读写操作。
接下来描述比较核心的内容,首先I3C的时钟一般使用推免输出,如下图所示:
图1 SCL推免式输出
SCL不是说一定要使用推免式输出,也可以使用开漏方式,主要是推免式输出可以达到更快的速度,I3C在SDR工作模式下速度可达到8.8M,HDR模式下可以到20M以上。
上面提到SDR和HDR,名词解释如下:
SDR:signal data rate 单一数据传输模式,即一个时钟周期上升沿采样数据,和IIC一样;
HDR:high data rate 高速数据传输模式,双沿采样。
I3C默认为SDR模式。
如下表所示为I2C和I3C特性
表1 IIC和I3C特性对比
说明 | I2C | I3C |
最大速度 | 1Mbps | 20Mbps |
速度 | 可调 | 可调 |
信号线 | SDA、SCL | SDA、SCL |
从属关系 | 有主从设备,IIC地址静态 | 有主从设备,IIC地址动态配置 |
单次传输 | 8bit | 8bit |
I3C可以向下兼容I2C,I2C不能向上兼容I3C,传感器默认静态地址支持I2C通信,此时的I3C设备被赋予了以下特性:
1、可以相应I3C广播协议;
2、正确处理CCC的ENTDAA(广播动态地址分配0x07)和SETDASA(直接设置动态地址0x87)命令;
ENTDAA:
SETDASA:这个指令允许主机利用从机的静态地址给该从机分配动态地址,比ENTDAA动态地址分配方法要快。SETDASA要在ENTDAA使用前使用,除了已经分配动态地址的从机外,所有的从机都要响应ENTDAA CCC。
一但配置动态地址将激活I3C通信,激活后除非复位或者断电,否则只能作为I3C设备运行。
I3C和IIC设备可以共用总线并存。规则如下:
1、I3C master到I2C的数据包会被I3C slave忽略
2、I3C master到I3C slave的数据包一般不会被I2C slave检测到,由于速度太快I2C会自动过滤,另外I3C地址头部使用的是7‘h7e,该地址在IIC是被忽略的。
以上是I2C和I3C的基本介绍,下面就I3C协议内容重点介绍:
CCC通用命令码
首先要说的是I3C通信都会用到CCC通用命令码,这是完全和I2C不一样的,CCC通用命令码协议如下表所示:
图2 I3C CCC命令时序图
上面三个时序图分别描述了I3C CCC寄存器广播配置、直接配置、直接读取三种模式;
I3C工作的第一件事情就是主设备通过CCC命令给从设备分配动态地址,激活I3C通信。
CCC寄存器分广播寄存器(0x00~0x7f)和直接寄存器(0x80~0xfe),对于一对一的设备,我们可以使用直接寄存器模式给I3C设备配置动态地址,只有总线上有多个设备时使用广播配置动态地址比较方便。
广播配置会使用仲裁机制,仲裁如何实现的呢?这里就要先说到SDA开漏模式电路了,前面I2C讲到只要总线上有一个设备SDA需要输出低电平,CMOS管会导通接地,那么SDA总线上输出低电平,简单理解设备之间SDA数据是信号与的关系,关系如下图所示:
图3 I3C地址仲裁
假设设备地址7'h10和7’h14进行动态地址仲裁,本轮仲裁结果经过与的关系后仲裁地址7'h10获胜,获胜的地址会获取主设备提供的动态地址然后退出仲裁。在I3C仲裁中,高地址设备总是输给低地址设备。
那么问题来了,I3C设备从哪里来的仲裁地址呢?
每个I3C有标准化特性登记册,这个登记册由三个值组成,分别是BCR、DCR、Provisional ID定义如下:
BCR(Bus Characteristic Register)是只读寄存器,它的作用是告诉主机从设备对IBI请求的支持,以及通用CCC命令的响应类型
DCR(Device Characteristic Register)用于描述I3C设备类型
Provisional ID用于表示临时48位ID,这个ID不是随便设定的,是具有一定规范,具体规范可以参考下面的寄存器介绍
这里Provisional ID作为仲裁地址,小的地址优先获取地址,依次仲裁。
以上内容会比较麻烦,前面说到如果是一对一的I3C设备,我们完全可以对指定设备直接分配动态地址。直接设备分配动态地址的CCC指令为0x87。
现在以BMP581进行I3C通信
首先进行直接动态地址配置,时序图如下:
图4 CCC协议
FPGA时序图如下图所示:
图5 I3C CCC命令配置
解析波形如下:
START+7E+ACK+0x87+T+RESTART+8E+ACK+0x02+T+STOP
命令解析:
默认0x8e静态地址改成动态地址0x02,激活I3C通信。
I3C写时序如下:
图5 I3C SDR时序
FPGA时序图如下图所示:
图6 I3C FPGA写时序
解析波形如下:
START+7E+ACK+RESTART+02+ACK+0x37+T+04+T+STOP
命令解析:从设备地址0x02的0x37寄存器写为0x04;
BMP581文档写时序如下:
图7 BMP581 I3C写时序
I3C读时序如下:
图8 BMP581 I3C读时序
FPGA波形如下:
图9 FPGA读时序
解析波形如下:
START+7E+ACK+RESTART+03+ACK+DATA+T+STOP
命令解析:从设备地址0x03读数据;
说到这里就有疑问了,这里读一直没有提到读哪个寄存器,需要如何设置?
这里类似IIC协议,需要先对读的地址写操作,整个FPGA波形如下:
图10 I3C协议 FPGA读指定寄存器
解析波形如下:
START+7E+ACK+RESTART+02+ACK+0x37+T+STOP
START+7E+ACK+RESTART+03+ACK+DATA+T+STOP
命令解析:读取设备地址0x02指定寄存器0x37的寄存器值;
I3C协议就写到这里,有疑问可以留言;
标签:协议,本章,地址,寄存器,I3C,I2C,CCC,设备 From: https://blog.csdn.net/weixin_51418325/article/details/140470161