使用 LPC553x/LPC55S3x 构建 I3C 传感器网络
1 简介
一些最新的 NXP MCU(i.MX RT6xx、i.MX RT5xx、LPC553x/LPC55S3x)
已集成 MIPI I3C 控制器,以支持更快、更节能、标准化传感器通信,同时仍保持落后与传统 I2C 兼容。这一重大改进预计将用于许多移动和物联网应用程序。
I3C 总线协议支持:
• 带内命令代码(通用命令代码 (CCC))
• 动态地址分配 (DAA)
• 带内中断(IBI):中断可以从从设备到主设备,无需额外的线路,从设备可以临时控制总线并向主机报告某些事件。
• 多主机/多点
• 热连接
• 与传统 I2C 兼容,但没有时钟延长
本应用笔记描述了如何使用 LPC553x/LPC55S3x I3C 控制器作为主控制器,充分利用一些关键I3C 的 DAA 和 IBI 等特性,如何构建传感器网络,并与网络上的这些从传感器进行通信。
它首先概述了 I3C 的基本功能,然后介绍了如何使用 NXP SDK API 进行通信通过 CCC 命令与 I3C 从传感器,动态分配从地址,并与这些传感器交换数据最后,直接给出了一些示例,如何使用 SDK 提供的回调来处理来自这些从传感器的带内中断。
S/W 封装在与板载 InvenSense ICM42688 通信的 LPC553x/LPC55S3x EVK 板上进行测试运动跟踪传感器,并与 NXP 温度传感器模块板上的两个 P3T11xx 温度传感器连接外部通过 I3C 总线。
2 MIPI I3C 基础
本节提供有关 LPC553x/LPC55S3x MCU I3C 控制器和通用命令功能的基本信息代码 (CCC)。
2.1 特点
LPC553x/LPC55S3x MCU I3C控制器支持:
• 2 线多点总线,时钟速度为 12 MHz,最多可连接 11 个设备。
• 使用具有4 mA 驱动的标准焊盘(I2C 使用特殊焊盘)。
• 从机不需要静态地址,它的地址可以由主机动态分配。但是,奴隶可以在启动时分配一个 I2C 静态地址,以便从机可以自然地在I2C 总线上运行。
• 带内中断(IBI),它允许从设备通知主设备而不需要外部引脚。
2.2 通用指令码(CCC)
MIPI I3C 主控可以使用通用命令码 (CCC) 广播命令一次或直接控制多个 I3C 设备命令来控制每个单独的设备,而 I3C 从设备侦听并支持许多 CCC 命令来控制并报告某些设备特性和状态,例如,总线复位、报告设备临时 ID (PID)、总线特性寄存器 (BCR)、设备特性寄存器 (DCR)、启用/禁用从机事件,例如带内中断或更新从机动态地址。
MIPI I3C 规范中有许多 CCC 命令。有些是广播的,有些是直接的。为了支持动态地址分配 (DAA),这里只列出了与本应用笔记相关的几个最重要的命令。这些 CCC的命令是:
• RSTDAA 重置总线上所有从设备上的动态地址。
• ENTDAA 强制所有 I3C 从设备(如果它们尚未分配动态地址)进入地址分配模式。
• SETDASA 从静态地址设置动态地址。注意:并非所有人都需要此 SETDASA CCC 命令支持I3C 从设备。
• SETNEWDA 设置新的动态地址。
• ENEC/DISEC 启用/禁用从属事件。
有关 CCC 命令的更多信息,请查看 http://mipi.org
3 设置 I3C 传感器网络
在此传感器网络示例中,使用了三个 I3C 从传感器:
• InverSense ICM42688 运动跟踪传感器
• NXP P3T1175 温度传感器
• NXP P3T1108 温度传感器
在 LPC553x/LPC55S3x IOCON 上,这三个引脚用于 I3C 通信。
PIO0_9 I3C_SCL(I3C 时钟)
PIO0_24 I3C_SDA(I3C 数据)
PIO0_28 I3C_PUR(SDA 线上的 I3C 上拉控制)。
在 LPC553x/LPC55S3x EVK 板上,这些引脚直接连接到板载运动跟踪传感器 ICM42688P。
在外部,EVK 板还连接到 NXP P3T11xx 温度模块,其中 P3T1175 和 P3T1108 都在相同的 I3C 总线。两块板之间的连接如下表所示:
注意
本应用笔记末尾描述了一个已知问题,解释了为什么板载 Arduino 连接器无法使用 NXP P3T11xx 温度模块。 有关跳线设置的更多信息,请参阅 LPC553x/LPC55S3x-EVK 板用户手册。
P3T11xx 温度模块跳线设置(如果下面未提及,则使用原理图中的默认设置):
JP2 1-2 关闭 I3C SCL
JP3 1-2 关闭 I3C SDA
由于 JP1 2-3 关闭,温度模块默认使用 3.3 V 电源,JP1,电压选择器,打开LPC553x/LPC55S3x EVK 板,1-2 应相应闭合 (3.3 V)
4 I3C DAA 和传感器网络发现
本节介绍使用 SDK 中现有的 I3C 驱动程序 API 将 I3C 控制器配置为 I3C 主机的步骤,使用 CCC 命令并为网络上的这些传感器分配动态地址,插入回调以监听 IBI来自从站的中断,最后,连续读取传感器数据并响应 IBI 中断。除了应用笔记之外,还有在 Keil、IAR 和MCUXpresso IDE。包含两个 zip 文件,一个用于 Keil 和 IAR,另一个用于 MCUXpresso。 Keil 是 IAR 项目位于目录 \boards\lpcxpresso55s36\driver_examples\i3c\i3c_sensor_network 中。
4.1 I3C主机初始化和DAA
本例中的 I3C 主控初始化 i3c_sensor_network.c 包括以下内容:
• 根据系统时钟设置,您可能需要 I3C 时钟的时钟分频器。
— 主机需要一个准确的时钟,其频率是 I3C 时钟的倍数。更高的波特率
您需要达到的速率,您必须为 I3C 控制器考虑更高的时钟频率。例如,这个示例为 I3C 控制器设置 50 MHz 时钟,该控制器理想地支持 2.5 MHz 和 10 MHz I3C 时钟。
— 由于连接到 I3C 总线的 I3C 从机的各种设备特性,必须使用较慢的推挽波特率
在 DAA 之前使用。此示例最初将 PPBAUD 设置为 2 Mbit/s,将 ODBAUD 设置为 400 Kbps。一旦地址分配完成后,可以使用更高的推挽波特率进行数据通信。 SDK I3C 驱动程序 API I3C_MasterSetBaudRate() 可用于为传感器数据读取设置更高的波特率。
— PPBAUD 的分频器是 MCONFIG 寄存器中的 4 位字段。无法设置非常快的 I3C 时钟。
如果某些设备在 DAA 期间不支持更高的 PPBAUD,则可以设置更慢的 I3C,在 DAA 之前与较低的 PPBAUD 一起时钟,然后设置一个更快的 I3C 时钟以及较高的 PPBAUD。
•为 I3C 总线上的所有传感器创建一个设备地址表,让所有这些传感器监听来自主机的广播命令。
• 创建一个I3C 辅助主机作为总线上的第一个节点,并为该辅助主机分配一个动态地址NXP 供应商 ID 和一些伪设备特征。
• I3C_BusMasterCreate() API 是用于创建主结构和分配的最重要的引擎动态地址到总线上的设备。
主机结构创建不仅必须包括主机的所有资源能力,还必须考虑连接到总线的所有可能的设备,I3C 或 I2C,因此,所有波特率、I2C 波特率、I3C 推挽式波特率、此处必须考虑和配置 I3C 开漏波特率。
• 首先向总线上的所有从站发出RSTDAA CCC 广播命令,以确保干净启动。
• 向所有从机发出DISEC CCC 广播命令以在DAA 期间禁用从机事件,以防止诸如从机带内中断等事件。
• 主机使用内置的输入动态地址分配 (ENTDAA) 机制来简化分配
对奴隶的 DA。这种内置机制还负责处理那些不支持 SETDASA CCC 的从设备命令。在 LPC553x/LPC55S3x 用户手册中,“为 I3C 设备分配动态地址”部分描述了DAA 机制详解。在用于 LPC553x/LPC55S3x 的 SDK 中,I3C 驱动程序中的 API I3C_BusMasterDoDAA() 完全正确将动态地址分配给从设备。
• 在DAA 过程中,master 也会读取slave 的唯一设备信息和能力,例如partnumber、Vendor ID(VID)、BCR、DCR注册并保存在每个设备的设备信息数据结构中。
• 在DAA 完成后,向所有从机发出ENEC CCC 广播命令以重新启用从机事件。
一旦 DAA 完成,在 i3c_sensor_network.c 文件中,主程序 demo_i3cBus.i3cDevList 包含一个列表在 I3C 总线上找到的设备。唯一的设备信息数据用作列表中所有设备的标识符。设备句柄是根据唯一的部件号和设备 VID 提取的,用于点对点通信在主设备和传感器设备之间。
表 3. DAA 前后的传感器特定信息
。 。 。 未完 完整版点击下方下载 ↓
|