针对您在使用CMSIS I2C驱动程序时遇到的速率超过400kHz的问题,以下是逐步排查和解决方案:
输入时钟源选择
根据RT1160参考手册,LPI2C模块的时钟源需通过SCG或CGC配置。确保:
LPI2C_CLOCK_SOURCE_SELECT的配置一致。分频系数计算
I2C的SCL频率由以下公式决定:
SCL Frequency = Input Clock / (PRESCALE × (CLKLO + 1 + CLKHI + 1))检查ARM_I2C_BUS_SPEED_FAST_PLUS模式下分频参数(PRESCALE、CLKLO、CLKHI)是否正确。例如:
PRESCALE = 2, CLKLO = 29, CLKHI = 29 → SCL = 60MHz / (2 × 60) = 500kHz实际可能需要调整CLKLO/CLKHI以匹配时序要求。
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) // 高速模式
);示波器检测
使用示波器检查SCL/SDA信号:
上拉电阻调整
Fast Mode Plus推荐上拉电阻范围:1.7kΩ~5.6kΩ(3.3V系统)。若电阻过大,会导致上升时间过长。
确认时钟门控
检查CCM_CCGRn寄存器,确保LPI2C模块时钟已使能:
CCM->CCGR2 |= CCM_CCGR2_LPI2C1(CCM_CCGR_ON); // 例:LPI2C1勘误表检查
查阅RT1160芯片勘误表(如NXP官网文档ER1160),确认是否存在已知的I2C时钟分频问题。
// 在SDK中启用FlexIO_I2C示例,调整时序参数
FLEXIO_I2C_MasterSetBaudRate(BASEADDR, 1000000, srcClock_Hz);NXP社区
在NXP Community搜索类似问题,例如关键词“RT1160 I2C Fast Mode Plus issue”。
联系NXP支持
提供以下信息以获取帮助:
总结:问题可能源于分频参数与时钟源不匹配,或硬件信号完整性不足。建议优先通过示波器验证波形,并手动调整分频寄存器。若仍无法解决,可考虑硬件调整或联系NXP支持。
举报
更多回帖