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 连接 LDC1614

Guru**** 2524500 points
Other Parts Discussed in Thread: TM4C1294NCPDT, LDC1614

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/866493/tm4c1294ncpdt-interfacing-with-ldc1614-using-i2c

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: LDC1614

大家好、我正在使用 Tiva C Tm4c1294NCPDT 中的 I2C 模块与 LDC1614连接、在 I2C 模块中我无法理解的问题是、当我在 I2CMCS 寄存器的 BUSY 位中进行轮询时、该位在调试时甚至不会改变、 我用软件延迟解决了这个问题、但我想使用寄存器中正确位的轮询是错误的、因为没有这个延迟、模块会太快以至于传感器无法写入或读取  

简而言之:我使用突发模式命令作为16位数据两次(每条命令8位)、在第78行中、I2CMCS 中的 BUSY 位不会改变、因此没有轮询、我遵循了数据表中的流程图、但它不起作用

P.S:这是我的 LDC_WRITE 函数的一段代码  

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

    您好、Abdullah、

     您能在每个 I2CMasterBusy()中尝试一下

    替换:

    while (I2CMasterBusy (I2C0_BASE)=true);  

    使用  

    while (!I2CMasterBusy (I2C0_BASE)== true); //添加此行。   

    while (I2CMasterBusy (I2C0_BASE)== true);  //将此行保留在上述行之后。

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

    这条线路的用途是什么、BUSY 位为0、 当 I2CMCS 寄存器的值为0x00000003时不会改变;

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

    您好!

     I2C 硬件中存在竞态条件。 例如、请使用以下代码。 第三行应等待 I2C 主设备不忙、然后再继续执行后续代码。 但是,在比赛条件下,第三条线将立即消失。 添加第二行的目的是首先等待 BUSY 标志被置位、然后进一步等待 BUSY 标志被清零。   

    I2CMasterControl (I2C4_base、I2C_MASTER_CMD_BURST_Receive_start);//开始 突发模式读取

    while (!I2CMasterBusy (I2C4_base))//等待忙标志置1

    while (I2CMasterBusy (I2C7 _BASE)//等待直到 BUSY 标志清零

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

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

    我昨天已经排了你的队,它不起作用,代码卡在轮询中? 我的问题是时间问题,不知道需要检查的位?  

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

    我已经录制了调试会话、您可以通过以下 Drive 链接查看它: drive.google.com/open

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

    抱歉、我在工作时被阻止使用文件共享系统。 我将在这个周末检查是否可以从家里访问它。

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

    没问题、我试图证明 Charles 的代码行不起作用、我想知道在投票前是否像在图片中那样使用小延迟没有问题、 在我使用此延迟后、传感器正确连接并接收和发送我写入的数据  

    是正确还是有更好的方法?

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

    在轮询 BUSY 位清零前、使用简单延迟没有问题。 根本原因是 TM4C1294器件可以在 I2C 可以设置 BUSY 位之前执行轮询的第一次读取。 延迟可以防止这种情况。 有些客户不喜欢延迟、因为他们担心如果延迟太大、他们会浪费时间。 我唯一担心的是,查尔斯提出的解决方案为什么不起作用? 如果有一些间歇性延迟、可能是由中断引起的、Charles 建议的方法可能会失败。 我们在 TI 这里讨论了这个问题。 我觉得完美的解决方案仍然难以实现。 底线是,调用 I2CMasterBusy()之前的短暂延迟应该可以正常工作。

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

    "我唯一的担忧是 Charles 提议的解决方案为什么不起作用? 如果有一些间歇性延迟、可能是由中断引起的、Charles 建议的方法可能会失败。"、 我不理解您的顾虑、抱歉、我不太了解、Charles 代码导致程序卡在这一行中  

    while (!I2CMasterBusy (I2C4_base))//等待忙标志置1

    因此我无法从 LDC1614读取数据、当我逐步调试它时、它会起作用、但数据错误、因此我认为这可能是因为我的代码。  

    上次查询:是否有任何 EEPROM 的 I2C 示例、原因是我在1294XL 的驱动程序中看不到它

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

    不要担心使用"while (!I2CMasterBusy ())"循环的问题。 使用短延迟应该可以正常工作。 优化级别、时钟比率甚至代码对齐都会影响 CPU 和 I2C 之间的时间关键型关系。 只需确保您的延迟足够长、以便使用您使用的最高级别的优化、您应该可以正常工作。

    我没有任何 I2C EEPROM 示例。 我不经常看到这种情况。 可能是因为片上仿真的 EEPROM 可用性。