ST意法半导体
直播中

山中老虎

9年用户 1014经验值
擅长:制造/封装
私信 关注
[问答]

STM32MP135DAE7官方TF-A、OPTEE源码中使用I2C4挂载PMIC,更改为I2C5后,程序下载失败怎么解决?

大家好!
我使用的是STM32MP135DAE7,官方TF-A、OPTEE源码中使用I2C4挂载PMIC,我更改为I2C5后,程序下载失败,相关配置内容如下。请各位大神帮忙,看看哪有不妥?
1.TF-A中:
dts中与I2C4源码相比,更换了I2C5接口,指定I2C5时钟源CLK_I2C5_HSI
i2c5 {pinctrl-names = "default";pinctrl-0 = <&i2c5_pins_a>;i2c-scl-rising-time-ns = <185>;i2c-scl-falling-time-ns = <20>;clock-frequency = <400000>;status = "okay";
    pmic: stpmic@33 {            compatible = "st,stpmic1";            reg = <0x33>;            status = "okay";            regulators {                    compatible = "st,stpmic1-regulators";                    buck1-supply = <&vin>;                    buck2-supply = <&vin>;                    buck3-supply = <&vin>;                    buck4-supply = <&vin>;                    ldo1-supply = <&vin>;                    ldo2-supply = <&vin>;//llsdtest                    ldo4-supply = <&vin>;                    ldo5-supply = <&vin>;                    ldo6-supply = <&vin>;                    vref_ddr-supply = <&vin>;                    pwr_sw1-supply = <&bst_out>;                    pwr_sw2-supply = <&v3v3_ao>;                    vddcpu: buck1 {                            regulator-name = "vddcpu";                            regulator-min-microvolt = <1350000>;                            regulator-max-microvolt = <1350000>;                            regulator-always-on;                            regulator-over-current-protection;                    };                    vdd_ddr: buck2 {                            regulator-name = "vdd_ddr";                            regulator-min-microvolt = <1350000>;                            regulator-max-microvolt = <1350000>;                            regulator-always-on;                            regulator-over-current-protection;                    };                    vdd: buck3 {                            regulator-name = "vdd";                            regulator-min-microvolt = <3300000>;                            regulator-max-microvolt = <3300000>;                            regulator-always-on;                            st,mask-reset;                            regulator-over-current-protection;                    };                    vddcore: buck4 {                            regulator-name = "vddcore";                            regulator-min-microvolt = <1250000>;                            regulator-max-microvolt = <1250000>;                            regulator-always-on;                            regulator-over-current-protection;                    };                    vdd_adc: ldo1 {                            regulator-name = "vdd_adc";                            regulator-min-microvolt = <2500000>;                            regulator-max-microvolt = <2500000>;                            regulator-always-on;//llsdtest                    };                    /*llsdtest*/                    vdd_v3v3: ldo2 {                            regulator-name = "vdd_v3v3";                            regulator-min-microvolt = <3300000>;                            regulator-max-microvolt = <3300000>;                            regulator-always-on;                    };                    vdd_usb: ldo4 {                            regulator-name = "vdd_usb";                            regulator-min-microvolt = <3300000>;                            regulator-max-microvolt = <3300000>;                            regulator-always-on;                    };                    vdd_sd: ldo5 {                            regulator-name = "vdd_sd";                            regulator-min-microvolt = <3300000>;                            regulator-max-microvolt = <3300000>;                            //regulator-boot-on;                            regulator-always-on;                    };                    v1v8_periph: ldo6 {                            regulator-name = "v1v8_periph";                            regulator-min-microvolt = <1100000>;                            regulator-max-microvolt = <1100000>;                            regulator-always-on;                    };                    vref_ddr: vref_ddr {                            regulator-name = "vref_ddr";                            regulator-always-on;                    };                    bst_out: boost {                            regulator-name = "bst_out";                    };                    v3v3_sw: pwr_sw2 {                            regulator-name = "v3v3_sw";                            regulator-active-discharge = <1>;                            regulator-always-on;                    };            };    };};
rcc {//secure-status = "disable";st,clksrc = ;};
&gpiof {st,protreg = < (TZPROT(3)) >;};
&gpiod {st,protreg = < (TZPROT(7)) >;};
&gpioh {st,protreg = < (TZPROT(13)) >;};
&gpiof {st,protreg = < (TZPROT(8)) >;};
&i2c5 {pinctrl-names = "default";pinctrl-0 = <&i2c5_pins_a>;i2c-scl-rising-time-ns = <185>;i2c-scl-falling-time-ns = <20>;clock-frequency = <400000>;status = "okay";
    /*llsd2*/    pmic: stpmic@33 {    ......    };};
&rcc {compatible = "st,stm32mp13-rcc", "syscon";//pinctrl-0 = <&rcc_mco_pins_a>;pinctrl-names = "default";
    st,clksrc = <            CLK_MPU_PLL1P            CLK_AXI_PLL2P            CLK_MLAHBS_PLL3            CLK_RTC_LSE            CLK_MCO1_HSE            CLK_MCO2_DISABLED            CLK_CKPER_HSE            CLK_ETH1_PLL4P            CLK_ETH2_PLL4P            CLK_SDMMC1_PLL4P            CLK_SDMMC2_PLL4P            CLK_STGEN_HSE            CLK_USBPHY_HSE            //CLK_I2C4_HSI//llsd            CLK_I2C5_HSI//llsd      ......      >......};
比较怀疑是OPTEE配置问题,参照I2C4配置的,还未看出有什么不妥,麻烦大家了,谢

回帖(2)

人走了

2025-3-3 11:57:08

针对你在STM32MP135上修改I2C4为I2C5后导致程序下载失败的问题,以下是可能的原因和解决方案的逐步分析:




1. 时钟源配置检查



  • 问题:I2C5的时钟源(CLK_I2C5_HSI)可能未正确配置。

  • 解决

    1. 参考STM32MP13xx参考手册,确认I2C5支持的时钟源。通常I2C5的时钟源可能需选择PCLK3或其他特定PLL输出,而非HSI。

    2. 在设备树中检查I2C5的时钟配置,例如:
      clocks = <&rcc I2C5_K>;
      clock-names = "i2c";

    3. 确保时钟驱动已正确使能(如rcc节点中的I2C5EN位)。





2. 引脚复用(Pinctrl)配置



  • 问题:I2C5的引脚复用配置可能错误或与其他外设冲突。

  • 解决

    1. 检查i2c5_pins_a的pinctrl定义,确认SCL/SDA引脚是否正确:
      &pinctrl {
      i2c5_pins_a: i2c5-0 {
           pins {
               pinmux = , /* I2C5_SCL */
                        ; /* I2C5_SDA */
               bias-disable;
               drive-open-drain;
               slew-rate = <0>;
           };
      };
      };

    2. 确认硬件板上I2C5的物理引脚连接与PMIC的I2C地址(0x33)匹配。





3. PMIC节点配置验证



  • 问题:PMIC节点可能未适配I2C5的时序或寄存器配置。

  • 解决

    1. 检查PMIC的I2C地址是否为0x33(确认硬件PMIC地址与软件一致)。

    2. 调整I2C时序参数(如i2c-scl-rising-time-ns)以适应I2C5的物理特性:
      i2c5 {
      i2c-scl-rising-time-ns = <100>;  // 根据实际信号完整性调整
      i2c-scl-falling-time-ns = <10>;
      clock-frequency = <100000>;       // 尝试降低速率以测试稳定性
      };





4. TF-A启动流程依赖



  • 问题:TF-A可能在I2C5初始化前依赖PMIC,导致启动失败。

  • 解决

    1. 确保PMIC节点在设备树中的status = "okay"

    2. 在TF-A的启动阶段(如bl2_platform_setup)添加调试日志,确认I2C5控制器初始化成功。

    3. 检查TF-A的stm32mp1_clk.c中是否启用了I2C5的时钟:
      /* 确保在时钟初始化代码中启用了I2C5时钟 */
      RCC->MP_I2C5ENSETR = RCC_MP_I2C5ENSETR_I2C5EN;





5. 硬件连接与信号完整性



  • 问题:I2C5的物理线路可能存在短路、断路或信号干扰。

  • 解决

    1. 使用示波器检查I2C5的SCL/SDA信号,确认是否有波形。

    2. 检查PMIC的供电和复位引脚是否正常(如VDDCOREPWR_ON)。

    3. 尝试在I2C总线上加上拉电阻(通常4.7kΩ)。





6. 调试与日志分析



  • 问题:缺乏启动阶段的错误日志导致难以定位问题。

  • 解决

    1. 通过串口(如UART4)捕获TF-A的启动日志,检查是否有如下错误:
      ERROR: I2C5 initialization failed!
      ERROR: PMIC communication timeout!

    2. 在TF-A中启用更详细的调试选项(如DEBUG=1)并重新编译。





7. 设备树编译验证



  • 问题:修改后的设备树未正确编译或加载。

  • 解决

    1. 确认设备树修改已保存并重新编译:
      make dtbs

    2. 使用fdtdump工具检查生成的DTB文件,确认I2C5和PMIC节点是否存在:
      fdtdump your_firmware.dtb | grep i2c5





总结步骤



  1. 检查时钟配置:确保I2C5时钟源正确且使能。

  2. 验证引脚复用:确认SCL/SDA引脚与硬件一致。

  3. 降低I2C速率:排除信号完整性问题。

  4. 捕获启动日志:通过串口分析TF-A错误信息。

  5. 硬件排查:用示波器检查I2C信号和PMIC状态。


如果问题仍未解决,建议提供TF-A的启动日志和实际硬件连接示意图以进一步分析。

举报

李欢

2025-3-14 14:52:08
你已经将I2C5的时钟源设置为CLK_I2C5_HSI。确保这个时钟源已经被正确配置,并且I2C5的时钟频率符合PMIC的要求。STM32MP系列的I2C时钟频率通常设置为400kHz
举报

更多回帖

发帖
×
20
完善资料,
赚取积分