NXP MCU 技术论坛
直播中

王树林

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

求助,关于CMSIS I2C驱动程序问题求解?

在尝试修改 ENET PHY/MAC 驱动程序以使用 I2C 时,我在尝试让接口运行速度超过400kHz 时遇到了问题。
我在 RT1160 evk 板上测试了 cmsis_lpi2c_int_b2b_transfer_master.c 示例(来自 SDK16),发现了同样的问题。当选择 ARM_I2C_BUS_SPEED_FAST_PLUS 作为接口速度时,我只能看到对启动条件的尝试。
我可以通过将输入时钟从 24MHz (48MHzdiv2) 更改为 60MHz,使其在 1MHz 下工作。根据处理器参考手册,应该可以从8MHz 输入时钟以 1MHz 的速度运行 I2C 接口,因此我只能假设设置代码中的某个地方存在错误?
最新的 SDK 似乎没有实质性的变化,因此我只能假设问题仍然存在。

回帖(1)

王刚

2025-3-25 17:49:53

针对您在使用CMSIS I2C驱动程序时遇到的速率超过400kHz的问题,以下是逐步排查和解决方案:




1. 确认时钟配置




  • 输入时钟源选择

    根据RT1160参考手册,LPI2C模块的时钟源需通过SCG或CGC配置。确保:



    • 输入时钟源已正确使能(如IPG_CLK、PLL3等)。

    • 输入时钟频率与代码中LPI2C_CLOCK_SOURCE_SELECT的配置一致。




  • 分频系数计算

    I2C的SCL频率由以下公式决定:


    SCL Frequency = Input Clock / (PRESCALE × (CLKLO + 1 + CLKHI + 1))

    检查ARM_I2C_BUS_SPEED_FAST_PLUS模式下分频参数(PRESCALECLKLOCLKHI)是否正确。例如:



    • 输入时钟为60MHz时,若目标为1MHz,可尝试:
      PRESCALE = 2, CLKLO = 29, CLKHI = 29 → SCL = 60MHz / (2 × 60) = 500kHz

      实际可能需要调整CLKLO/CLKHI以匹配时序要求。







2. 检查SDK驱动配置




  • CMSIS驱动参数表

    fsl_lpi2c_cmsis.c中,ARM_I2C_BUS_SPEED_FAST_PLUS可能未适配所有时钟源。手动覆盖分频参数:


    static void LPI2C_SetBusSpeed(uint32_t speed)
    {
      // 示例:强制设置分频参数为60MHz输入下的1MHz配置
      if (speed == ARM_I2C_BUS_SPEED_FAST_PLUS) {
          base->MCR &= ~LPI2C_MCR_PRESCALE_MASK;
          base->MCR |= LPI2C_MCR_PRESCALE(2); // PRESCALE=2
          base->MCCR0 = LPI2C_MCCR0_CLKHI(29) | LPI2C_MCCR0_CLKLO(29);
      }
    }



  • 引脚复用与电气特性

    确保I2C引脚已正确配置为高速模式:


    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL, 1); // SCL复用
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL,
      IOMUXC_PAD_DSE(6) | // 驱动强度增强(如0x6为150Ω)
      IOMUXC_PAD_SPEED(2) // 高速模式
    );





3. 硬件信号完整性验证




  • 示波器检测

    使用示波器检查SCL/SDA信号:



    • 上升时间(Rise Time):应满足Fast Mode Plus(≤120ns)。

    • 过冲/下冲:若存在振铃,需减小走线长度或增加上拉电阻。




  • 上拉电阻调整

    Fast Mode Plus推荐上拉电阻范围:1.7kΩ~5.6kΩ(3.3V系统)。若电阻过大,会导致上升时间过长。






4. 参考手册与SDK勘误




  • 确认时钟门控

    检查CCM_CCGRn寄存器,确保LPI2C模块时钟已使能:


    CCM->CCGR2 |= CCM_CCGR2_LPI2C1(CCM_CCGR_ON); // 例:LPI2C1



  • 勘误表检查

    查阅RT1160芯片勘误表(如NXP官网文档ER1160),确认是否存在已知的I2C时钟分频问题。






5. 替代方案测试



  • 使用FlexIO模拟I2C

    若硬件I2C存在限制,可尝试FlexIO模拟高速I2C:
    // 在SDK中启用FlexIO_I2C示例,调整时序参数
    FLEXIO_I2C_MasterSetBaudRate(BASEADDR, 1000000, srcClock_Hz);




6. 社区与技术支持




  • NXP社区

    NXP Community搜索类似问题,例如关键词“RT1160 I2C Fast Mode Plus issue”。




  • 联系NXP支持

    提供以下信息以获取帮助:



    • 测试代码片段(时钟配置、I2C初始化)。

    • 示波器波形截图(SCL/SDA)。

    • SDK版本号(如SDK_2.12.0_EVK-MIMXRT1160)。






总结:问题可能源于分频参数与时钟源不匹配,或硬件信号完整性不足。建议优先通过示波器验证波形,并手动调整分频寄存器。若仍无法解决,可考虑硬件调整或联系NXP支持。

举报

更多回帖

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