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:"I2C 忙& quot;与"I2C 忙& quot;?

Guru**** 2524550 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1215816/tm4c1294ncpdt-i2c-busy-vs-i2c-busy-busy

器件型号:TM4C1294NCPDT

我们在使用 TM4C1294NCPDT 的定制电路板上遇到了一个奇怪的问题。  我们使用 I2C 通道9与8个不同的从传感器进行通信。   电路板上电后、我让 TM4C 对传感器执行初始化步骤、以确保通信正常。  此后、每80毫秒读取一次来自传感器的状态。  这在开始时起作用很好、但最终(从几秒到一小时的任何地方)通信完全停止。  

我们有一个示波器连接到 SCL 和 SDA 线。  当通信停止时、尽管 固件继续调用典型的 I2C Tiva Ware 函数系列来读取以下数据、SCL 和 SDA 线路都无限期地保持高电平:  I2CMasterSlaveAddrSet 、MAP_I2CMasterDataPut、MAP_I2CMasterControl 等

即使在调用  MAP_I2CMasterControl 来启动 I2C_MASTER_CMD_BURST_SEND_START 之后、SCL 和 SDA 线路都仍然保持高电平。  我在那里设置了一个断点来查看 I2C 寄存器值、我已将它们附加到下图中。

您将注意到 I2C_mcs_busy 为 false、而 I2C_mcs_Busby 为 true。  数据表(SPMS433B)将 I2C_MCS_BUSY 解释为与"控制器"相关(例如、"控制器处于 IDLE 或 BUSY")、将 I2C_MCS_Busby 解释为与" 总线"相关(例如、"总线处于 IDE 或 BUSY")。

因此、在本例中、根据下面的寄存器值、控制器不忙、但总线忙。  但是、由于使用了示波器、我们可以确定两条线路都处于高电平、根据我的经验、这意味着总线没有忙。   有人知道会发生什么情况吗?

 

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

    您好!

     我有几个问题:

     -您可以在 LaunchPad 上重现该问题吗?

     -如果你只有一个从属传感器或8个传感器,这是否重要? 换言之、您是否能够在仅连接一个传感器的情况下重现该问题?

     -当 SDA 和 SCL 保持为高电平时,您能否判断这是在传输过程中发生还是在停止位生效后发生?

     -当 SDA 和 SCL 都保持高电平时,您可以展示示波器电容或者更好的逻辑分析仪捕获吗?

     -你能展示你的代码在哪里进行读取吗?

     - 如果您添加下面以红色突出显示的内容,它会有什么不同? 下面是读取 I2C 器件的示例序列。 基本上、它将首先轮询不忙状态和忙状态。  

    空隙
    I2CReadCommand (uint32_t * pui32DataRx)

    //
    //将数据方向修改为 true,以便查看地址
    //指示 I2C 主器件正在从从器件发起读取。
    //
    MAP_I2CMasterSlaveAddrSet (I2C7_BASE、SHT21_I2C_ADDRESS、TRUE);

    //
    //设置第一次读取。 使用 I2C_MASTER_CMD_BURST_RECEIVE_START
    //开始突发模式读取。 I2C 主设备继续拥有
    //此事务结束时总线。
    //
    MAP_I2CMasterControl (I2C7_BASE、I2C_MASTER_CMD_BURST_RECEIVE_START);

    //
    //等待主模块完成传输。
    // I2C 模块在寄存器中设置 BUSY 标志时有延迟
    //在检查 BUSY 位之前需要有一个延迟。 以下环路
    //等待,直到忙标志被设置,然后等待,直到它被清除
    //表示事务已完成。 这最多占用633个 CPU
    //周期@ 100 kbit I2C 波特率和120 MHz 系统时钟。 因此、是 A
    // while 循环被用来代替 SysCtlDelay。
    //
    while (!MAP_I2CMasterBusy (I2C7_BASE))

    }
    while (MAP_I2CMasterBusy (I2C7_BASE)

    }

    //
    //从从器件读取第一个字节的数据。
    //
    Pui32DataRx[0]= MAP_I2CMasterDataGet (I2C7_BASE);

    //
    //设置第二次读取。 使用 I2C_MASTER_CMD_BURST_RECEIVE_CONT
    //继续突发模式读取。 I2C 主设备继续拥有
    //此事务结束时总线。
    //
    MAP_I2CMasterControl (I2C7_BASE、I2C_MASTER_CMD_BURST_RECEIVE_CONT);

    //
    //等待主模块完成传输。
    //
    while (!MAP_I2CMasterBusy (I2C7_BASE))

    }
    while (MAP_I2CMasterBusy (I2C7_BASE)

    }

    //
    //从从器件中读取第二个字节的数据。
    //
    Pui32DataRx[1]= MAP_I2CMasterDataGet (I2C7_BASE);

    //
    //设置第三次读取。 使用 I2C_MASTER_CMD_BURST_RECEIVE_FINISH
    //终止 I2C 事务。 在该交易结束时、
    //将发出停止位,I2C 总线返回到
    //空闲状态。
    //
    MAP_I2CMasterControl (I2C7_BASE、I2C_MASTER_CMD_BURST_RECEIVE_FINISH);

    //
    //等待主模块完成传输。
    //
    while (!MAP_I2CMasterBusy (I2C7_BASE))

    }
    while (MAP_I2CMasterBusy (I2C7_BASE)

    }

    //
    //注意,第三个8位数据是校验和字节。 会是的
    //如果用户想要验证是否存在,则将其作为练习
    //校验和正确。
    Pui32DataRx[2]= MAP_I2CMasterDataGet (I2C7_BASE);
    }

      

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

    您好、Terence:

     我没有听到你的回应。 我想您的问题已经解决。 如果没有、请回写此帖子、该帖子会自动将状态更改为"打开"、并且我会收到通知。