马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
I3C主要通讯协议和模式是SDR模式。SDR协议大部分是基于I2C协议的,部分引入一些显著的变更。 l
I3C的START与STOP仍然是可以被I2C的START、STOP识别,但是timing稍微有些变化。 l
I3C的地址头仍然与I2C的地址头在格式和信号上相匹配,但是时序上可能有变化。 l
仍然沿用9bit字长,但是第9bit定义改变。 l
I3C中SCL线只被Master驱动。一般情况下采用Push-Pull,但也可以是Open Drain。 正因如此,地址头、数据长度都是相同的,I3C Slave只需要知道一条发送到本设备地址的消息是否为I3C消息即可。 一条I3C消息起始于START终止与RepeatedSTART或STOP,包含全部需要传输的信息。 一条I3C消息一定是SDR模式的,如果满足下列条件: 地址头是7’h7E,广播地址,所有I3CSlave都对该地址进行响应。任何I2C设备都不会对该地址进行响应,因为在I2C中该地址是保留的。 地址头选中了动态分配地址。 所有的I3C设备都不应对广播地址以及动态地址以外的地址进行响应,而必须响应广播地址和自身动态地址,必要时候可以NACK。
1.1.1.1
I3C Slave 设备的角色 I3C Slave设备不需知道自身处在I2C总线上或是I3C总线上。如果其自身有一个I2C静态地址,那么它可以一直使用这个地址,知道被赋予一个动态地址。一旦被赋予了动态地址,它就必须作为一个I3C Slave设备工作,除非被要求重置。 在被赋予动态地址之前,I3C Slave 设备只能以I2C设备的方式工作,但是添加了以下特性: 必要时候紧接着START条件可以响应I3C广播协议。 正确处理CCC的ENTDAA和SETDASA命令。 I3C Slave的角色应当如下: 紧随START或Repeated START条件,以任何速率尝试对I3C总线上的广播地址或指向自己的地址进行响应。一旦被选中,则I3C Slave就把这一条消息当成SDR模式处理。 如果一条消息指向Slave的动态地址,那么Slave可以ACK或简单NACK这个地址头。 如果ACK,则I3C Slave以SDR模式处理这条消息。 如果NACK,则抛弃接下来的任何数据,等待下一个START或Repeated START。 如果消息是一条广播消息,且读写标识为写,则Slave需要至少处理数据中的头一个字节。 如果广播消息的数据为一个字节,则这则消息为CCC。 I3C Slave 必须处理所有可以应用的CCC命令。一条命令可能是必须的,也可能根据上下文可选的。 如果CCC命令改变了了I3C总线的模式,则I3CSlave必须以下述两种方式中的一种来处理: 如果新的模式为动态地址指定模式,并且请求的是所有I3C Slave,则当前没有动态地址的设备都要参与地址的指定;已经有动态地址的则等待动态地址指定模式的退出。 如果新的模式为HDR,则支持HDR的Slave 可以选择进入HDR,不支持HDR的设备则启动本设备的HDR退出监测器以监听HDR Exit序列的到来。 如果消息的地址头既不是广播也不是动态地址,则I3C Slave必须等待Repeated START 或是 STOP。Slave可以记录或监测总线上传输的位流,但在总线上只能进行等待。 1.1.1.2
I3C的地址头 I3C的地址头紧随着START或Repeated START。地址头的格式同I2C完全一致:7bit地址,1bit读写位,1bit应答位。 紧随着START的地址头是一个可仲裁的地址头、这意味着,START,至少地址的起始bit,以及应答位使用SDA的Open Drain模式。但是,一些可仲裁的地址头也可以使用Push-Pull模式来加速通讯速率。 紧随着Repeated START的地址头永远使用SDA的Push-Pull模式来驱动,除非有ACK/NACK例外。 使用I3C可仲裁的地址头,I3C Slave可以想Master传输以下三种请求: In-Band 中断请求,这等同于使用额外的中断总线请求Master的介入控制。In-Band中断请求必须使用RnW位置1的设备动态地址。 Secondary Master 请求,除非I3C Slave标记为支持此功能,否则不应请求这个功能。Secondary Master 请求必须使用RnW位置0的地址头。 热接入请求,只有当I3C总线可操作时,I3CSlave才可以发出此请求。该请求使用的头地址必须为特殊的7’h02 Hot-Join。 I3C Slave只能在以下两种总线状态下发出上述请求: 1.
START起始在总线上出现,注意不是Repeated START,并且接下来是总线可用状态,SLAVE就可以传送自己的动态地址,或是Hot-Join地址,并遵循地址仲裁机制。 2.
总线处在可用状态,这时Slave就是可通过将SDA拉低来起始一个START序列 a.
如果Slave将SDA拉低后,然后Master尽快将SCL拉低,这段时间并未进行严格定义。 b.
Master也应该将SDA拉低一段时间,形成时间重叠。 c.
一旦Master将SDA拉低后,Slave就可以使用Open-Drain模式控制SDA线。 d.
此时Slave就可以传输地址了。 I3C地址仲裁 紧随着START的地址头是可仲裁的,意味着Master和Slave双方都有可能个试图驱动SDA线。这样的地址头被定义为可仲裁的地址头。 仲裁机制采用常用的Open-Drain模式。所有传输地址的设备都要遵守这一个规则: 1.
如果当前要传输的bit为0,则设备需要在SCL下降沿之后将SDA线拉低,并保持到下一个SCL 的下降沿。 2.
如果当前要传输的bit为1,设备就释放SDA线,在SCL的下降沿后将SDA置为高阻态。 a.
另外,设备需要在SCL的上升沿后监测SDA有没有变为低电平,以探测是否有其他设备在驱动SDA线。 b.
如果有其他设备驱动SDA线,导致SDA变为低电平,那么当前设备就丢失了对总线的控制权,并退出。也就是说,这时候当前设备不可再传输任何数据,而需要等待以后出现的START条件。 I3C地址仲裁优化 I3C可仲裁地址头的传输过程是可以被优化的。 前述I3CMaster 设备传送范围为7’h03-7’h7B范围的7bit动态地址,由于I3CMaster将整个9bit都视为Open-Drain模式,因此没有办法知道此时是否有别的Slave Device正在传送其地址。 注意,对于I3C Secondary Master和I3C In-Band中断请求的Slaves来说,I3C Master不必限制动态指定的地址在低半段(7’h03-7’h3F),保留地址的A6位为0. 采用了这样的做法以后,I3C Master就可以可选性得对地址进行仲裁了: l
如果I3C Master传送一个bit 1,例如传送7h’7E时,那么就可以在SCL的上升沿监测SDA的状态。如果SDA确实变为1,那么I3C Master可以将剩余的地址使用Push-Pull方式传输完。 l
如果I3C Master传输一个bit 0,或者SDA被Slave 拉低,那么I3C Master必须将剩余的地址使用Open-Drain方式传输。 l
如果I3C Master是单独向I3C 设备传输数据,那么可以将SCL的脉冲宽度降低到50nS以下,结果是I2C设备仅仅看到纵向上的0。降低脉冲宽度获得了更快的数据传输速率,因为Open-Drain的仲裁机制仅仅是将低电平延长了。
l
如果I3C Master希望想I2C设备传输数据,那么它必须使用低速的I2C时序来完成。
Master使用I3C Slave 地址启动一帧传输的序列 I3C Master通常应使用7’h7E或是I2C 的静态地址。 两种情形下,地址都可能被仲裁,所以Master必须监测总线上是否有IBI,Mastership 请求,Hot-Join请求发生。 l
如果没有发生这些请求,则按照正常流程处理即可。 l
如果发生这些请求,则Master需要ACK或NACK这些请求。 如果Master使用动态地址来启动一次传输,那么需要引入特殊,因为相同的地址可能正在请求IBI,Mastership ,Hot-Join。可能有如下的情况发生: 1.
地址相同,但是RnW位不同,并且Master正在写(RnW=0);所以Master获得控制权(Slave为IBI,RnW=1),可以正常执行。 2.
地址相同,但是RnW位不同,并且Master正在读(RnW=1);所有Master失去控制权,Master应该ACK或NACKSlave 的Mastership请求。 3.
地址和RnW都相同,这时Master和Slave都等待对方进行ACK或NACK。 a.
这是一个困境,因为Master无法得知NACK是由于上述情形导致的还是Slave主动NACK的。 b.
Master应该在Repeated START后再次发送设备地址。这样可以探测究竟是哪种情况导致了死锁的发生。 Repeated START后使用Push-Pull输出的地址头 在Repeated START后传送的地址头不应该被仲裁。也就是说,Repeated START后不应该有任何设备尝试传输自己的地址或是Hot-Join地址。
因此,如果不是发往I2C Slave的消息,应使用Push-Pull模式的SDA。接下来RnW位后的ACK/NACK永远是Open-Drain,以允许Slave ACK或被动NACK。
|