USB论坛
直播中

陈霞

8年用户 1015经验值
私信 关注
[问答]

用IIC接口的IIC_SCL和IIC_SDA引脚做普通GPIO,程序启动不起来怎么解决?

想用IIC接口的IIC_SCL和IIC_SDA引脚做普通GPIO,两个引脚对应的是GPIO58和GPIO59,更改代码将设置为普通GPIO引脚模式后,程序启动不起来。问:这种情况如何解决,官方支持这种应用吗?                                                                 

回帖(1)

贾飞小

2025-5-8 18:14:03

针对将IIC_SCL和IIC_SDA(GPIO58/GPIO59)复用为普通GPIO导致系统无法启动的问题,以下是分步解决方案:




1. 确认硬件设计约束



  • 移除外部上拉电阻

    IIC总线通常需要外部上拉电阻(4.7kΩ~10kΩ),若保留这些电阻且GPIO配置为推挽输出模式,可能导致电平冲突。建议断开上拉电阻或配置GPIO为开漏输出模式。

  • 检查启动配置引脚

    某些SoC的GPIO在Boot阶段用于选择启动介质(如eMMC/SD卡)。查阅芯片手册,确认GPIO58/59是否属于Boot配置引脚,若被占用需避免初始化冲突。




2. 设备树(DTS)关键配置



  • 禁用I2C控制器节点

    在设备树中注释或删除I2C相关节点,防止内核初始化I2C驱动导致资源冲突:
    // 注释掉I2C节点
    // &i2c_x {
    //     status = "disabled";
    // };

  • 配置Pinctrl为GPIO模式

    在pinctrl配置中,将引脚复用为GPIO而非I2C功能:
    pinctrl: {
      my_gpio_pins: my_gpio_pins {
          pins = "gpio58", "gpio59";
          function = "gpio";
          bias-disable; // 关闭内部上拉/下拉
          // 若需开漏模式,添加:
          // drive-open-drain;
      };
    };




3. 分阶段初始化策略



  • Bootloader阶段保持默认配置

    在U-Boot等Bootloader中保持GPIO58/59为默认状态(不主动配置),避免影响BootROM流程。

  • 系统启动后动态切换

    在Linux用户空间或驱动中通过sysfs或libgpiod动态配置引脚:
    # 设置GPIO58为输出,高电平
    echo 58 > /sys/class/gpio/export
    echo out > /sys/class/gpio/gpio58/direction
    echo 1 > /sys/class/gpio/gpio58/value




4. 检查时钟与电源域



  • 启用GPIO控制器时钟

    确保GPIO所在时钟域已开启(部分SoC需在时钟控制器中配置):
    // 示例:在时钟初始化代码中启用GPIO模块时钟
    clk_enable(gpio_clk);

  • 确认电源域未关闭

    查阅芯片手册,确认GPIO58/59所在的电源域在启动后未进入低功耗模式。




5. 验证启动流程



  • 监测Boot阶段引脚状态

    使用示波器捕获GPIO58/59在Boot阶段的电平变化,确认无异常下拉/上拉。

  • 调整GPIO初始化时机

    若系统启动失败发生在Bootloader阶段,尝试在更晚的阶段(如内核启动后)初始化GPIO。




6. 官方支持与替代方案



  • 查阅芯片手册

    确认GPIO58/59是否支持复用为普通GPIO(通常支持,但可能有特殊约束)。

  • 联系原厂FAE

    提供具体芯片型号和启动日志,询问是否已知限制或需要特殊配置。




总结


通过禁用设备树中的I2C节点正确配置pinctrl分阶段初始化GPIO以及调整硬件电路,可解决复用IIC引脚导致启动失败的问题。官方通常支持此类复用,但需严格遵循硬件设计和软件配置规范。

举报

更多回帖

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