STM32H5 I3C P3T1755 测试笔记

来源:Freak嵌入式 通信方案 21 次阅读
摘要:目录 - I3C 简介 STM32H5 I3C I3C 常见缩写 CubeMX 配置选项 P3T1755 I3C P3T1755 简介 原理图与PCB 支持的 CCC 命令 目标地址 PID BCR DCR 核心寄存器 STM32H5 P3T1755 I3C 测试 开源链接 I3C 简介 I3C(Improved Inter-Integrated Circuit)

目录

  • - I3C 简介
  • STM32H5 I3C
  • I3C 常见缩写
  • CubeMX 配置选项
  • P3T1755 I3C
  • P3T1755 简介
  • 原理图与PCB
  • 支持的 CCC 命令
  • 目标地址
  • PID BCR DCR
  • 核心寄存器
  • STM32H5 P3T1755 I3C 测试
  • 开源链接

I3C 简介

I3C(Improved Inter-Integrated Circuit)是由MIPI联盟制定的下一代串行控制总线接口标准,旨在统一传统I²C和SPI的优点,为现代传感器系统提供更高性能、更低功耗的解决方案:

  • • 两线接口(SDA和SCL),向下兼容传统I²C设备, 但是外部不需要像I2C那样上拉, 内部可以动态切换(开漏+推挽, Open-Drain + Push-Pull)
  • • SDR模式:基础速率12.5 MHz(实际数据速率约11 Mbps); HDR模式:最高可达33.3 Mbps原始速率(实际速率约30 Mbps), 有多种 多种HDR子模式(HDR-DDR、HDR-BT、HDR-TSL); I3C 甚至可以类似 QSPI 那样, 到100Mbps(四通道 模式); 本篇主要是 SDR 模式.
  • • 部分亮点:
  • • 带内中断(IBI, In-Band Interruption):从设备可通过总线本身发起中断,无需额外引脚
  • • 动态地址分配(DAA, Dynamic Address Assignment):控制器可为从设备动态分配地址,支持热插拔
  • • 通用命令码(CCC, Common Command Code):标准化的控制命令集,用于总线管理和设备配置
  • • 热加入(Hot Join):支持设备在系统运行时动态加入总线. (注: 本篇不探讨这个功能)
  • • 版本演进:
  • • v1.0, 2017年, 定义基础协议框架
  • • v1.1, 2022年, 增强HDR模式,新增GETCAPS CCC命令
  • • v1.1.1, 2023年, 修正兼容性问题
  • • v1.2, 2024年底, 整理内容,分清强制与可选特性
  • • 嵌入式中一般是 I3C Basic, 是MIPI I3C成员版本的一个丰富子集,以无版税条款授权,适用于更广泛的嵌入式应用

STM32H5 I3C

具体文档参考 Introduction to I3C for STM32 MCUs - Application note, 这里尽量不摘录了.

当前支持 I3C 的 STM32 系列有: STM32H5、STM32H7R3/7S3、STM32H7R7/7S7、STM32U3、STM32N6、STM32C5 等. 纯I3C(Pure I3C)总线, SCL 在推挽模式下可运行至 12.5 MHz,在开漏模式下可运行至 4 MHz。如 STM32H5, 仅支持 I3C SDR, 支持 MIPI I3C 规范 v1.1 中 I3C 主控制器、辅助控制器和目标设备的所有功能.

动态地址最好参考下表, 本篇用的 0x30 和 0x31

在这里插入图片描述

I3C 总线数据格式, 基本是单个或多个这样的片段拼起来的

在这里插入图片描述

片段内部的速率并不是恒定的, 会在 OD 和 PP 间来回切换, 如

在这里插入图片描述

I3C 常见缩写

  • • S = START, 起始
  • • Sr = repeated START, 重复/重新起始位, 与 S 区别是无需先发P(停止位)
  • • P = STOP, 停止
  • • T: Transition bit (parity bit for write data) from controller
  • • T*: transition bit (end of data for read data) from controller and/or from target.
  • • ACK = acknowledge, acknowledge from the addressed target without handoff
  • • NACK = not acknowledged
  • • 7h'7E 或 7'h30, 7是7bit二进制数如I3C的7bit地址, h hex 十六进制, 后面的十六进制数取低7bit. 7h'7E 是 I3C 的广播地址
  • • W, Write, 写
  • • R, Read, 读
  • • A, Address 地址
  • • D, Data 数据
  • • OD, Open Drain 开漏
  • • PP, Push Pull 推挽
  • • PAR, Parity, 校验位

CubeMX 配置选项

以 STM32H503 I3C1 的 Controller 模式为例, 主时钟是250MHz.

在这里插入图片描述

部分参数解释:

  • • SDA Rise Time (ns), 350(默认, 适用中等长度I3C总线), SDA 信号上升时间,单位为纳秒, 用于计算总线时序补偿,需匹配实际硬件上拉电阻和电容负载
  • • Bus usage, I3C pure bus, 纯I3C总线, 另一个选项是 Mixed I3C and I2C, 本篇是纯I3C
  • • 开漏(OD)频率 2.551MHz, 推挽(PP)频率 12.5MHz, I3C 占空比 40%. (250M / 12.5M = 20, 20 0.4 = 8 => 0x07 + 1, 20 0.6 = 12 => 0x0b + 1, 如果想设置 1MHz, 50%占空比, 就是 0x7C 0x7C)
  • • SDA Hold Time, SDA 数据保持时间, 保持 0.5 个内核时钟周期
  • • Wait Time, 主控制器和新控制器在发出启动信号前应等待的时间(ns)
  • • Target Hot Join Acknowledgement, Disable, 不自动响应设备的热加入请求
  • • Own Dynamic Address, 控制器自身动态地址, 最好是按建议的地址范围设置

P3T1755 I3C

P3T1755 简介

P3T1755DP, 温度传感器, I3C, I²C, TSSOP, 12位, ±0.5°C | NXP 半导体 :

  • • 支持2线串行I3C(高达12.5MHz 推挽模式)和I²C(高达3.4MHz)
  • • I2C下支持 32 个目标地址、SMBus Alert、通用呼叫、超时功能(SDA/SCL 拉低 > 45ms 复位)
  • • I3C下支持动态地址分配、IBI 带内中断(无额外中断引脚)、48 位 Provisional-ID、BCR/DCR 寄存器
  • • 范围 –40°C ~ +125°C, 12bit 二进制补码存于温度寄存器, 分辨率为 0.0625°C, 精度:
  • • -20°C ~ +85°C 范围:±0.5°C(最大值)
  • • -40°C ~ +125°C 全范围:±1°C(最大值)
  • • 供电电压 1.4V ~ 3.6V, 本篇用于 3.3V
  • • 封装 TSSOP8:3.0mmx3.0mm
  • • 工作模式:
  • • 连续转换模式:持续测温,SD=0(默认)
  • • 单触发模式(One-shot):关断模式下触发单次测温,完成后返回关断(OS=1 启动)
  • • 关断模式:仅保留 I3C/I2C 接口,最小化功耗(SD=1)
  • • 转换时间(可编程, 配置位 [R1 R0])
  • • [0 0] 27.5ms
  • • [0 1] 55ms(默认)
  • • [1 0] 110ms
  • • [1 1] 220ms
  • • 告警功能
  • • 模式选择:比较器模式(TM=0,默认)/ 中断模式(TM=1)
  • • 阈值寄存器:
  • • THIGH(03h):高温阈值,默认 80°C
  • • TLOW(02h):低温阈值,默认 75°C
  • • 故障队列[F1 F0]:可编程 1/2/4/6 次连续故障触发告警(默认 2 次)
  • • 告警极性:POL=0(低有效,默认)/ POL=1(高有效)

原理图与PCB

做了一批 P3T1755 的板子, 放到了 XY 上:

  • • 纯 I3C 模式, SDA SCL 的上拉电阻不贴, 支持带内中断, 也无需连接 ALERT# 引脚
  • • A0 A1 A2 用于配置地址
  • • 3.3V 供电

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

支持的 CCC 命令

标准文档里 CCC 命令很多, 有些是必须支持的, 有些是选择支持的, P3T1755 支持的 CCC 命令:

CCC 类型命令代码命令名称默认设置核心功能描述
广播命令0x00ENEC启用全局启用目标设备的事件驱动中断(如 IBI)
0x06RSTDAA-全局重置所有设备的动态地址分配状态,清除当前动态地址,等待重新分配
0x07ENTDAA-全局触发动态地址分配流程,仅未分配动态地址的设备参与
直接命令0x80ENEC启用针对单个目标设备启用事件驱动中断(如 IBI)
0x81DISEC禁用针对单个目标设备禁用事件驱动中断(如 IBI)
0x87SETDASA-通过静态地址为指定设备分配动态地址(推荐在 ENTDAA 前使用)
0x88SETNEWDA-为已分配动态地址的设备重新分配新动态地址
0x8DGETPID-读取目标设备的 48 位 Provisional-ID(PID)
0x8EGETBCR-读取目标设备的总线特性寄存器(BCR)
0x8FGETDCR-读取目标设备的设备特性寄存器(DCR)
0x90GETSTATUS-读取目标设备的运行状态寄存器
0x9ARSTACT-配置并查询目标设备的复位操作和时序

如 SETDASA 0x87 通过静态地址(下图0x48)分配动态地址(0x30) 的示例(1MHz, 图中 60 应为 LA 解码错误):

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

目标地址

I3C 动态分配地址之前, 也是需要不同器件有不同的静态地址的, P3T1755 的地址分配引脚:

  • • A2  可以连接 GND VCC
  • • A1 A0 可以连接 GND VCC SDA SCL
  • • 合计 2 x 4 x 4 = 32 种静态地址, 参考下表, 地址 7’h5E 在 I2C 下可用, 在纯I3C下应避免
  • • 上面的 PCB 上可以通过移动电阻配置最常用的 8 种地址

32种硬件配置地址表

序号A2 引脚配置A1 引脚配置A0 引脚配置I2C 目标地址(7bit/7’hXX)I3C PID BITS [11:0](二进制 / 十六进制)备注
100SDA1000000 / 7’h40000010000000 / 0x800-
200SCL1000001 / 7’h41000010000010 / 0x802-
301SDA1000010 / 7’h42000010000100 / 0x804-
401SCL1000011 / 7’h43000010000110 / 0x806-
510SDA1000100 / 7’h44000010001000 / 0x808-
610SCL1000101 / 7’h45000010001010 / 0x80A-
711SDA1000110 / 7’h46000010001100 / 0x80C-
811SCL1000111 / 7’h47000010001110 / 0x80E-
90001001000 / 7’h48000010010000 / 0x810-
100011001001 / 7’h49000010010010 / 0x812-
110101001010 / 7’h4A000010010100 / 0x814-
120111001011 / 7’h4B000010010110 / 0x816-
131001001100 / 7’h4C000010011000 / 0x818-
141011001101 / 7’h4D000010011010 / 0x81A-
151101001110 / 7’h4E000010011100 / 0x81C-
161111001111 / 7’h4F000010011110 / 0x81E-
170SDASDA1010000 / 7’h50000010100000 / 0x820-
180SDASCL1010001 / 7’h51000010100010 / 0x822-
190SCLSDA1010010 / 7’h52000010100100 / 0x824-
200SCLSCL1010011 / 7’h53000010100110 / 0x826-
211SDASDA1010100 / 7’h54000010101000 / 0x828-
221SDASCL1010101 / 7’h55000010101010 / 0x82A-
231SCLSDA1010110 / 7’h56000010101100 / 0x82C-
241SCLSCL1010111 / 7’h57000010101110 / 0x82E-
250SDA01011000 / 7’h58000010110000 / 0x830-
260SDA11011001 / 7’h59000010110010 / 0x832-
270SCL01011010 / 7’h5A000010110100 / 0x834-
280SCL11011011 / 7’h5B000010110110 / 0x836-
291SDA01011100 / 7’h5C000010111000 / 0x838-
301SDA11011101 / 7’h5D000010111010 / 0x83A-
311SCL01011110 / 7’h5E000010111100 / 0x83C不支持 I3C SETDASA 命令,纯 I3C 模式不可用
321SCL11011111 / 7’h5F000010111110 / 0x83E-

PID BCR DCR

Provisioned ID(PID,48 位设备标识), 可通过 I3C 的 CCC 命令 GETPID(0x8D) 读取, 包含厂商、设备、配置、版本等信息:

  • • BITS[47:33], 15bit 厂商 ID, 0x011B(二进制:0000 0001 0001 1011)对应 NXP
  • • BITS[32], 1bit 标识类型(随机 / 结构化), 0 代表结构化 ID, 不是随机生成的
  • • BITS[31:16], 16bit 设备 ID, 0x1520(二进制:0001 0101 0010 1010)是 P3T1755 专属
  • • BITS[15:12], 4bit 实例 ID, 对应 A0/A1/A2 引脚配置的硬件实例标识
  • • BITS[11:0], 12bit 设备版本 / I2C 地址映射, 参考上表中的 I3C PID BITS [11:0](二进制 / 十六进制) 列

Bus Characterization Register (BCR), 总线特征寄存器, 0x03, 仅为I3C 目标设备, 不支持 I3C 协议的可选高级功能, 非虚拟目标设备, 不挂载下游子设备, 始终响应 I3C 总线命令,无离线模式, IBI(带内中断)无后续数据字节,仅发送中断标识, 支持 IBI 带内中断(I3C 核心中断方式,无需 ALERT 引脚), 对 I3C 总线数据速率存在硬件限制(推挽模式最高 12.5MHz,开漏模式按标准时序)

Device Characteristic Register (DCR) , 设备特征寄存器, 参考 I3C Device Characteristics Register | MIPI, 温度传感器对应 0x63

在这里插入图片描述

PID BCR DCR 值的读取可以通过 CCC 命令 GETPID GETBCR GETDCR, 也可以尝试 ENTDAA 0x07 辅助采集, 如下(1MHz, PID 0x0236152A0090, BCR 0x03, DCR 0x63):

在这里插入图片描述

核心寄存器

寄存器名称指针地址读写属性功能描述
Temp00h只读存储 12 位测温数据(2 字节,低 4 位无效)
Conf01h读写配置工作模式、告警极性、故障队列、转换时间
TLOW02h读写低温阈值寄存器(2 字节,补码格式)
THIGH03h读写高温阈值寄存器(2 字节,补码格式)
指针寄存器-不可访问8 位,低 2 位选择目标寄存器(上电默认选择 Temp)

如读取 动态地址 0x30 设备的 0x00 Temp 寄存器, 读到 0x1A60. 图中可以看到, 前面波形稀疏的是 2.551MHz 的开漏模式, 后面波形密集的是 12.5MHz 的推挽模式

在这里插入图片描述

对应

在这里插入图片描述

参考手册, 去掉低 4 bit, 0x1A6 * 0.0625 = 26.375 ℃

在这里插入图片描述

Configuration配置寄存器 0x2A:

  • • bit 7, OS, One-Shot, 不论单发还是连续总会读到0
  • • bit [6..5], [R1 R0], 01, 转换时间, 55ms
  • • bit [4..3], [F1 F0], 01, Fault queue, 2次连续故障触发告警
  • • bit 2, POL, Polarity, 0, ALERT pin becomes active low
  • • bit1, TM, Thermostat mode, 1, 中断模式
  • • bit 0, SD, Shutdown mode, 0, 连续转换状态

STM32H5 P3T1755 I3C 测试

在这里插入图片描述

工程源码:

引脚:

  • • I3C: SDA=PC9 SCL=PC8
  • • Debug UART: TX=PA2 RX=PA1

接了 2 个 P3T1755, 静态地址分别为 0x48 和 0x4C

在这里插入图片描述

工程编译与下载(stlink)

## 工具链, 用 STM32CubeCLI 或 直接套 STM32CubeIDE 的
$TOOLCHAIN_BIN = 'C:\ST\STM32CubeIDE_2.1.0\STM32CubeIDE\plugins\com.st.stm32cube.ide.mcu.externaltools.gnu-tools-for-stm32.14.3.rel1.win32_1.0.100.202602081740\tools\bin'

.\build.ps1 build
.\build.ps1 flash

串口日志

=== stm32h503_i3c_p3t1755 ===
  board        : STM32H503 / I3C1 / USART1
  i3c pins     : SDA=PC9 SCL=PC8
  uart pins    : TX=PA2 RX=PA1
  static scan  : 0x48..0x4F
  dynamic base : 0x30
  [init] CCC TX DISEC  target=0x7E data=08
  [init] CCC TX RSTDAA target=0x7E

[init] Static Address Discovery
  [init] CCC TX SETDASA target=0x48 data=60
  target[1]
    static      : 0x48
    dynamic     : 0x30
    method      : SETDASA
  [init] CCC TX SETDASA target=0x49 data=62
  [init] CCC TX SETDASA target=0x4A data=62
  [init] CCC TX SETDASA target=0x4B data=62
  [init] CCC TX SETDASA target=0x4C data=62
  target[2]
    static      : 0x4C
    dynamic     : 0x31
    method      : SETDASA
  [init] CCC TX SETDASA target=0x4D data=64
  [init] CCC TX SETDASA target=0x4E data=64
  [init] CCC TX SETDASA target=0x4F data=64

[init] ENTDAA Identity Correlation
  [init] CCC TX DISEC  target=0x7E data=08
  [init] CCC TX RSTDAA target=0x7E
  target[1]
    static      : 0x48
    strategy    : isolate peers then ENTDAA
  [init] CCC TX SETDASA target=0x4C data=62
    parked peer : static=0x4C dynamic=0x31
  [init] CCC TX ENTDAA target=0x7E
    dynamic     : 0x30
    pid         : 0x0236152A0090
    bcr         : 0x03
    dcr         : 0x63
  [init] CCC TX DISEC  target=0x7E data=08
  [init] CCC TX RSTDAA target=0x7E
  target[2]
    static      : 0x4C
    strategy    : isolate peers then ENTDAA
  [init] CCC TX SETDASA target=0x48 data=60
    parked peer : static=0x48 dynamic=0x30
  [init] CCC TX ENTDAA target=0x7E
    dynamic     : 0x31
    pid         : 0x0236152A0098
    bcr         : 0x03
    dcr         : 0x63

[init] Target Summary
  count        : 2
  target[1]
    static      : 0x48
    dynamic     : 0x30
    pid         : 0x0236152A0090
    pid.mfg     : 0x011B
    pid.idsel   : 0
    pid.part    : 0x152A
    pid.inst    : 0x0
    bcr         : 0x03
    bcr.ibi     : 1
    bcr.payload : 0
    bcr.roleReq : 0
    bcr.offline : 0
    bcr.virtual : 0
    bcr.adv     : 0
    bcr.speed   : 1
    dcr         : 0x63
  target[2]
    static      : 0x4C
    dynamic     : 0x31
    pid         : 0x0236152A0098
    pid.mfg     : 0x011B
    pid.idsel   : 0
    pid.part    : 0x152A
    pid.inst    : 0x0
    bcr         : 0x03
    bcr.ibi     : 1
    bcr.payload : 0
    bcr.roleReq : 0
    bcr.offline : 0
    bcr.virtual : 0
    bcr.adv     : 0
    bcr.speed   : 1
    dcr         : 0x63
I3C bus timing switched to 12.5MHz for private SDR transfers
T1[0x48->0x30]=1A60/conf=0x2A/26.375 C T2[0x4C->0x31]=1A60/conf=0x2A/26.375 C
IBI setup for T1[0x48->0x30] tempRaw=1A60 temp=26.375 C
Config updated for interrupt mode: 0x2A
IBI thresholds programmed: T_LOW=27.375 C T_HIGH=27.875 C
  [init] CCC TX ENEC   target=0x30 data=01
IBI enabled for T1[0x48->0x30]
IBI setup for T2[0x4C->0x31] tempRaw=1A60 temp=26.375 C
Config updated for interrupt mode: 0x2A
IBI thresholds programmed: T_LOW=27.375 C T_HIGH=27.875 C
  [init] CCC TX ENEC   target=0x31 data=01
IBI enabled for T2[0x4C->0x31]
T1[0x48->0x30]=1A60/conf=0x2A/26.375 C T2[0x4C->0x31]=1A60/conf=0x2A/26.375 C
T1[0x48->0x30]=1A60/conf=0x2A/26.375 C T2[0x4C->0x31]=1A60/conf=0x2A/26.375 C
T1[0x48->0x30]=1A50/conf=0x2A/26.312 C T2[0x4C->0x31]=1A60/conf=0x2A/26.375 C
T1[0x48->0x30]=1A50/conf=0x2A/26.312 C T2[0x4C->0x31]=1A60/conf=0x2A/26.375 C
T1[0x48->0x30]=1AB0/conf=0x2A/26.687 C T2[0x4C->0x31]=1BF0/conf=0x2A/27.937 C
IBI event: T2[0x4C->0x31] payload=0x00000000 tempRaw=1CF0 conf=0x2A temp=28.937 C
T1[0x48->0x30]=1B20/conf=0x2A/27.125 C T2[0x4C->0x31]=1CF0/conf=0x2A/28.937 C
T1[0x48->0x30]=1AC0/conf=0x2A/26.750 C T2[0x4C->0x31]=1C20/conf=0x2A/28.125 C
T1[0x48->0x30]=1AB0/conf=0x2A/26.687 C T2[0x4C->0x31]=1BD0/conf=0x2A/27.812 C
T1[0x48->0x30]=1A90/conf=0x2A/26.562 C T2[0x4C->0x31]=1B90/conf=0x2A/27.562 C
IBI event: T2[0x4C->0x31] payload=0x00000000 tempRaw=1B40 conf=0x2A temp=27.250 C
T1[0x48->0x30]=1A80/conf=0x2A/26.500 C T2[0x4C->0x31]=1B40/conf=0x2A/27.250 C
T1[0x48->0x30]=1A80/conf=0x2A/26.500 C T2[0x4C->0x31]=1AE0/conf=0x2A/26.875 C
T1[0x48->0x30]=1A80/conf=0x2A/26.500 C T2[0x4C->0x31]=1AB0/conf=0x2A/26.687 C
T1[0x48->0x30]=1A80/conf=0x2A/26.500 C T2[0x4C->0x31]=1AC0/conf=0x2A/26.750 C

部分说明:

  • • 初始时用的 1MHz 进行配置, 对0x48..0x4F的静态地址进行了扫描, 识别出了 2个器件 0x48 和 0x4C, 分配了动态ID 0x30 和 0x31, 也读出了 PID BCR DCR 寄存器
  • • 切换到最大 12.5MHz(推挽, 开漏对应2.551MHz) 进行温度和 Conf 寄存器的读取, 读出一次后, 为了方便测试, IBI 设置高1℃为 T_LOW, 设置高1.5℃为 T_HIGH, 使能 IBI
  • • 进入1s一次的打印, 用嘴对着 T2 温度传感器吹气, 温度升高到 28.937℃, 高于 T_HIGH 的 27.875℃, 触发IBI event, 之后温度下降到低于 T_LOW 的 27.375℃, 再次触发 IBI event

P3T1755的带内中断后是没有跟具体数据信息的

评论区

登录后即可参与讨论

立即登录