首页 > 其他分享 >协议篇-I3C协议 本章带你真正使用I3C

协议篇-I3C协议 本章带你真正使用I3C

时间:2024-07-17 11:27:08浏览次数:8  
标签:协议 本章 地址 寄存器 I3C I2C CCC 设备

        上一章讲到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

相关文章

  • 应用层协议
                       ......
  • BGP 协议(转载)
    BGP协议BGP协议介绍BGP全称是BorderGatewayProtocol,对应中文是边界网关协议。BGP是互联网上一个核心的去中心化自治路由协议。从这个解释来看,首先这是一个用于互联网(Internet)上的路由协议。它的地位是核心的(目前是最重要的,互联网上唯一使用的路由协议),它的目的是去中......
  • Java中的网络编程与TCP/IP协议详解
    Java中的网络编程与TCP/IP协议详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在现代软件开发中,理解和掌握网络编程以及TCP/IP协议是构建高性能网络应用的关键。本文将深入讨论Java中的网络编程技术和TCP/IP协议的工作原理与应用。一、网络编程基础......
  • Day34.以太网协议协议ip协议ARP协议
    #todo4.五层协议'''计算机1:计算机2:应用层应用层传输层传输层网络层网......
  • 盘点视频流协议及其在视频汇聚平台EasyCVR视频监控技术中的应用
    一、视频流协议概述视频流协议是实现视频数据的实时传输和播放的关键技术,广泛应用于网络视频监控、视频会议、在线教育等领域。这些协议定义了数据传输的格式、方式和控制机制,以确保视频数据能够准确、高效地传输到目标终端并进行解码播放。1、RTMP协议RTMP(RealTimeMessaging......
  • python网络编程---TCP协议进行
        在这里简单实现一个TCP服务器,用于监听来自客户端的连接,接收客户端发送的消息,并向客户端发送响应消息。下面我将详细解释这个代码的工作原理和各个部分的作用。    首先建立一个客户端(client),一个服务端(server),在客户端进行连接到运行在本地机器(IP地址为127.......
  • Modbus Tcp协议
    一:modbus起源1.起源Modbus由Modicon公司于1979年开发,是一种工业现场总线协议标准。Modbus通信协议具有多个变种,其中有支持串口,以太网多个版本,其中最著名的是ModbusRTU、ModbusASCII和ModbusTCP三种其中ModbusTCP是在施耐德收购Modicon后1997年发布的。分类:1)Modb......
  • 满满干活-wireshark进阶篇《Wireshark的TCP协议数据包常见报错提示》,练就你火眼金睛,助
    文章目录概要1.TCPPORTNUMBERSREUSED当四元组相同时会出现报错2.TCPWINDOWFULL与TCPZEROWINDOW之你怎么还不回我啊与我不行了。3.TCPWindowUpdate之我又行了能工作了小结概要本文介绍Wireshark的数据包常见报错提示,包括TCPPORTNUMBERSREUSED和TCPW......
  • IP协议学习笔记
    目录IP地址格式IP分类CIDR和子网掩码介绍NAT+公网、私网地址CIDR与VLSMVLSM子网划分案例练习ReferenceIP的作用类似物理世界中的地址,用于定位机器的位置。只不过物理的地址是文字描述,计算机世界的IP是一串二进制数,并且它是有一定约定和规则的。下面我来学习关于IP的一些历......
  • Java 网络协议面试题答案整理,最新面试题
    TCP和UDP的主要区别是什么?TCP(传输控制协议)和UDP(用户数据报协议)的主要区别在于TCP是面向连接的协议,而UDP是无连接的协议。这导致了它们在数据传输方式、可靠性、速度和使用场景方面的不同。1、连接方式:TCP是面向连接的协议,数据传输前需要三次握手建立连接。UDP是无连接......