I3C的硬體電路設計

問題:

我看NXP i.mx95的SOC端I3C有三個pin: I3C_SDA, I3C_SCL, I3C_PUR
I3C_PUR作用我有些不理解,其在i.mx95 reference manual的描述如下:
Pull up resistance. There is an internal pullup resistance on SDA, which the I3C 
controls. If the internal pullup is not enough, PUR can control an external pullup 
resistance on SDA actively. See the chip-specific I3C information on whether 
this external pullup is available on your chip.

其I3C controller中的Controller Configuration (MCONFIG)有一個欄位"HKEEP"設定與PUR有關,描述如下:

If this field is 00b, use pull-up resistor (PUR). No separate pin_HK_SDA or pin_HK_SCL is used. Only 
pin_PUR_oena is used for SDA. The pin_SCL_oena pin is held high in this mode, SCL clock is push-pull, 
and pin_SCL_out toggles, which is the actual clock.
If this field is 01b, High-Keeper controls are in place; pin_HK_SDA or pin_HK_SCL (High-Keeper) controls 
are used. SCL may use an HK or that signal (pin_HK_SCL) may only OR into pin_SCL_oena. The 
pin_HK_SDA pin is used as well for SDA high keeper, along with pin_PUR_oena.
Use HKEEP = 10b for I2C modes.
Use HKEEP = 00b or 01b for I3C modes.

Your chip may not support any or all High-Keeper methods. You must check the availability 
of High-Keeper methods.

NOTE

00b - None
01b - WIRED_IN
10b - PASSIVE_SDA (I2C mode, no clock stretches mode). SDA is open drain, and will be 
Hi-Z (high-impedance) for Bus Free (IDLE) and hold. The pin pin_HK_SDA is not used in this 
option, only a combination of SDA_oena and pin_PUR_oena are used. SCL is push-pull. The pin 
pin_HK_SCL is not used in this option, only pin_SCL_oena is used. Since the controller does 
not support multi-controller mode, there is no need to have open-drain SCL for I2C. For a single 
controller application, the controller’s SCL output can be a push-pull driver design if there are no 
devices on the bus which would stretch the clock.
11b - Reserved

看來I3C的SDA/SCL的硬體可以設計成push pull(不須外部pullups)或opendrain(需pullups)其與PUR pin的關係為?因為我們的硬體沒有接I3C_PUR pin,所以應該要設計成push pull或是opendrain?

回答

好的,這是一個非常深入且關鍵的問題。您提供的 Reference Manual 內容正是解開謎團的核心。我來幫您梳理一下 I3C_PUR、push-pull 和 open-drain 之間的關係,以及針對您「沒有接 I3C_PUR pin」的情況該如何設計。

1. I3C_PUR Pin 的真正作用:主動式上拉 (Active Pull-up)

首先,要理解 I3C 協議的一個核心目標:在維持與 I2C 向下相容 (使用 Open-Drain) 的同時,大幅提升速度。速度的瓶頸往往在於訊號的上升緣 (rising edge)

2. 與 Push-Pull 和 Open-Drain 的關係

I3C 是一個混合模式的匯流排,它會在不同階段使用不同的電氣特性:

結論I3C_PUR 是 Open-Drain 模式下的效能強化選項,與 Push-Pull 模式無關。

NXP i.mx95 reference manual:

image.png

Linux kernel i3c driver中HKEEP的預設值為0 ->代表PUR pin只有針對SDA信號做主動式電阻補償
drivers/i3c/master/svc-i3c-master.c

reg = SVC_I3C_MCONFIG_MASTER_EN |
	      SVC_I3C_MCONFIG_DISTO(0) |
	      SVC_I3C_MCONFIG_HKEEP(0) |
	      SVC_I3C_MCONFIG_ODSTOP(odstop) |
	      SVC_I3C_MCONFIG_PPBAUD(ppbaud) |
	      SVC_I3C_MCONFIG_PPLOW(pplow) |
	      SVC_I3C_MCONFIG_ODBAUD(odbaud) |
	      SVC_I3C_MCONFIG_ODHPP(odhpp) |
	      SVC_I3C_MCONFIG_SKEW(0) |
	      SVC_I3C_MCONFIG_I2CBAUD(i2cbaud);

3. 您的情況:沒有接 I3C_PUR pin,該如何設計?

這是最關鍵的部分。既然您的硬體沒有將 I3C_PUR pin 拉出來使用,這代表您無法使用「主動式上拉」這個硬體加速功能
因此,您的設計必須是標準的 Open-Drain 設計

總結

  1. I3C_PUR 的作用:一個選配的 (optional) 控制信號,用於啟動外部的「主動式上拉」電路,以加速 SDA 線在 Open-Drain 模式下的信號上升速度。
  2. 您的設計選擇:因為您的硬體沒有連接 I3C_PUR,您唯一且正確的選擇就是採用傳統的 Open-Drain 設計,也就是在 SDA 和 SCL 上都必須使用外部的被動上拉電阻
  3. 對您當前問題的影響:您目前 i2cdetect 掃不到裝置的問題,I3C_PUR pin 無關。問題根源仍然在於基本的 Open-Drain 電路是否完整 (例如缺少 1.8V 側的上拉電阻) 以及 Device Tree 的 Pin Muxing 設定是否正確。請專注於這兩點進行偵錯。

I3C bus的hardware schematic reference design

1. i.mx95 EVK 15x15:

D:\Project\137.imx95\evk_schematic\i.MX 95 15x15 IOT EVK\SPF-87751_A.pdf
(SDA/SCL無外部pullups)
image.png
但linux 6.12.20 arch/arm64/boot/dts/freescale/imx95-15x15-evk.dts未定義此P3T1085
也許是因為此為optional線路(ethernet MDIO/I3C)二擇一 需跳電阻來將I3C bus連通

2. i.mx8ulp 9x9:

這是唯一一片NXP的板子有enable I3C
D:\temp\imx8ulp_9x9_schematic\sch-52007_b.pdf
(SDA/SCL無外部pullups)
image.png
雖然device tree有定義PUR pin的mux,但實際線路圖上沒接

arch/arm64/boot/dts/freescale/imx8ulp-9x9-evk-i3c.dts

&i3c2 {
	pinctrl-names = "default", "sleep";
	pinctrl-0 = <&pinctrl_i3c2>;
	pinctrl-1 = <&pinctrl_i3c2>;
	i2c-scl-hz = <400000>;
	status = "okay";

	lsm6dso_i3c: imu@6a,208006c0000 {
		reg = <0x6a 0x208 0x6c0000>;
		assigned-address = <0x6a>;
	};
};

&iomuxc1 {
	pinctrl_i3c2: i3c2grp {
		fsl,pins = <
			MX8ULP_PAD_PTE19__I3C2_PUR	0x3
			MX8ULP_PAD_PTF6__I3C2_SCL	0x3
			MX8ULP_PAD_PTF7__I3C2_SDA	0x3
		>;
	};
};

3.FRDM-MCXN947

NXP Documentation Portal
沒接外部pullups
temp_sensor.svg

結論:

以上三個線路接未通過level shifter,且皆無external pullups.
依照

與EDM-IMX95-EVM的線路比較,EDM-IMX95 I3C SDA/SCL的硬體線路有通過level shifter IC "NTS0302"將從SOC出來的SDA/SCL 3.3v轉換成SDA/SCL 1.8V, 而SDA/SCL 3.3v和SDA/SCL 1.8v端各有上拉4.7k ohm電阻
image.png

image.png

上拉電阻的討論


硬體設計可能造成的速度限制

1. NTS0302:

image.png

2. P3T1035

I2C模式下:
image.png
image.png

I3C模式下:(SDR mode)
image.png


P3T1035
(temperature)
NTS0302
(level shifter)
I2C 400k/3.4M Hz Open-drain: 2M bps
Push-pull:
20 Mbps
I3C 12.9M Hz Open-drain操作會有問題
嘗試:
I3C

實務選值與檢核建議

  1. SCL(I3C):優先不外掛上拉,讓控制器用 push‑pull 驅動。
  2. SDA
    • 若匯流排純 I3C且控制器有動態上拉/高保持,不必外掛[ti.com.cn|ti.com.cn], [edn.com|edn.com]
    • 若有 I2C 裝置或較大總線電容,可在 3.3 V 與 1.8 V 兩側各自加上拉(常見 2.2–4.7 kΩ),並評估與 NTS0302 內建 10 kΩ 並聯後的等效值是否符合你的 RC 與耗流預算。 [ti.com|ti.com]
  3. 檢核 RC 與波形:估算總線電容(含走線、連接器與器件輸入電容),以等效上拉 ReqR_{eq}Req​ 計算 τ=Req⋅Cτ=R_{eq}\cdot Cτ=Req​⋅C,確認在 open‑drain 階段(常 ≤1 MHz)有足夠的上升時間;NTS0302 的 one‑shot 會幫忙邊緣加速,但 DC 的「高」仍由上拉決定。