This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294NCPDT:I2CMBMON isn#39;t 显示 I2C 总线的正确状态

Guru**** 2481465 points
Other Parts Discussed in Thread: EK-TM4C1294XL

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/701657/tm4c1294ncpdt-i2cmbmon-isn-t-show-correct-status-of-i2c-bus

器件型号:TM4C1294NCPDT
Thread 中讨论的其他器件:EK-TM4C1294XL

我正在处理一个使用 I2C 总线的项目、我发现 I2C 主总线监视器(I2CMBMON)寄存器存在一些奇怪的行为。

如数据表中所述、它应该显示 SDA 和 SCL 信号状态、但是它只在上电或复位 CPU 之后才正确显示。 如果我对 I2C 控制器或禁用/使能周期执行外设复位、它始终显示3、这意味着即使实际电平为低电平、SDA 和 SCL 仍处于高电平。 我正在尝试在 I2C 总线恢复函数中使用该寄存器。

我创建了一个简单的 CCS 项目、在 EK-TM4C1294XL 电路板上对其进行演示(请参阅随附文件中的)。 在 I2C 的外设复位之后和禁用-使能周期之后、项目只在 UART0上打印 I2CMBMON 状态。 我已将 PG0和 PG1连接到 GND、因此 SDA 和 SCL 变为0、但 I2CMBMON 仅在第一次显示正确的状态。 我还在外设复位和 DIS/EN 周期后添加了发送停止、但没有成功。 我还使用了 I2C 函数的 MAP_方差、但也没有成功。

要运行该项目、您需要在'Project properties->CCS Build->Variables'选项卡中将 TIVAWARE_DIR 更新到您的路径。

那么、有人能告诉我如何获得正确的 I2C 总线状态吗?e2e.ti.com/.../i2c_2D00_reset_2D00_test.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Dmitry、
    首先、当您谈论将 PG0和 PG1引脚接地时、代码选择 I2C0、这些引脚用于 I2C1。 我还建议您在将总线连接到外部器件的情况下检查 I2CMBMON 的实际 I2C 操作、并确保 SCL 和 SDA 总线上存在适当的上拉电阻器。 请注意、SDA 和 SCL 引脚上有内部上拉电阻器。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    #define I2C_base I2C0_BASE 

    I2C1是我项目中的主 I2C 控制器、我还检查了其他接口上的问题。 在 I2C0上、我连接到具有相同结果的接地 PB2和/或 PB3。

    我在实际的 I2C 操作中发现了这个问题。 我将处于 BOM 引导加载程序模式(闪存被擦除)下的第二个 EK-TM4C1294 Stellaris 板用作 I2C 从器件。 此外、在我的测试项目中、我会在外设复位后执行 I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP、但这没有帮助。

    我正在尝试读取 I2C_ErrorRecovery 函数中的 I2CMBMON、该函数在每个 I2C 事务之前运行。

    uint32_t I2C_ErrorRecovery (i2c_dev* p_i2c)
    {
    uint32_t ret = RET_OK;
    uint8_t count = 0;
    if (map_I2CMasterBusy (p_i2c->base)||(3!= map_I2CMasterLineStateGet (p_i2c->base)))
    {
    RET = RET_ERR;
    while (count++< 9)
    {
    #ifdef use_GPIO_recovery
    MAP_GPIOPinTypeGPIOOutput (p_i2c->GPIO_base、p_i2c->SCL_GPIO_pin);
    MAP_GPIOPinWrite (p_i2c->GPIO_base、p_i2c->SCL_GPIO_Pin、0);
    MAP_SysCtlDelay (400);
    MAP_GPIOPinTypeGPIOInput (p_i2c->GPIO_base、p_i2c->SCL_GPIO_pin);
    
    MAP_GPIOPinConfigure (p_i2c->SCL_GPIO_MODE);
    MAP_GPIOPinTypeI2CSCL (p_i2c->GPIO_base、p_i2c->SCL_GPIO_pin);
    #else
    MAP_I2CMasterControl (p_i2c->base、I2C_MASTER_CMD_FIFO_BURST_SEND_ERROR_STOP);
    MAP_SysCtlDelay (400);
    #endif
    if (!map_I2CMasterBusy (p_i2c->base)&&(3== map_I2CMasterLineStateGet (p_i2c->base)))
    {
    RET = RET_OK;
    中断;
    }
    }
    
    返回 ret;
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我想所发生的情况是、您按照以下代码复位外设、并导致 I2C 控制寄存器和配置丢失。  

      UARTprintf ("\033[2J\033[H");

      UARTprintf (I2C_STR"复位测试\n");

      UARTprintf (I2C_STR) Mon %X\n"、I2CMasterLineStateGet (I2C_base);

      SysCtlPeripheralReset (SYSCTL_Periph_I2C);

      while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C));

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我"喜欢"供应商的 Charles 分析。

    在开发此类诊断辅助器件期间-不会阻止您将"DA & SCL"路由到2 (其他) MCU GPIO 引脚(设置为输入)-这将进一步确认这2个关键信号电平。   始终有这样的值:"数字的长度"。

    希望您不要依赖 SDA/SCL 的嵌入式(过高的值) MCU 上拉电阻、而是采用(更合适) 4K7-10K (外部 Rs)、从而提供更快的信号响应和更少的舍入信号边沿...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我已经在外设复位后添加了 I2CMasterInitExpClk 函数、这可以解决测试项目中的问题。

    SysCtlPeripheralReset (SYSCTL_Periph_I2C);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C));
    I2CMasterInitExpClk (I2C_base、g_ui32SysClock、false);

    禁用-启用之后、这也会起作用

    MAP_SysCtlPeripheralDisable (SYSCTL_Periph_I2C);
    SysCtlDelay (1000);
    SysCtlPeripheralEnable (SYSCTL_Periph_I2C);
    while (!SysCtlPeripheralReady (SYSCTL_Periph_I2C));
    I2CMasterInitExpClk (I2C_base、g_ui32SysClock、false);