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.

[参考译文] TM4C123FH6PM:TIRTOS、I2C 驱动器在批量传输时在字节之间留下间隙。

Guru**** 2826855 points

Other Parts Discussed in Thread: EK-TM4C123GXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/987167/tm4c123fh6pm-tirtos-i2c-driver-leaving-gaps-between-bytes-on-bulk-transfer

器件型号:TM4C123FH6PM
Thread 中讨论的其他器件:EK-TM4C123GXL

大家好、

在回调和阻塞模式下、i2c 传输的字节之间存在间隙、这是我遇到的问题。  

当使用阻塞调用时、传输的各个部分之间存在8ms 的间隔。  

我认为内部驱动程序会使用中断、因此即使任务切换了字节、也会正确发送。  

我在使用 SPI 或 UART 驱动程序时没有遇到问题。

如果我使用仅具有单个任务的 Devkit 示例进行尝试、我没有任何问题。 传输不会分解成多个部分。  

CCS 版本: 10.1.1.00004  

Tirtos 版本: tirtos_tivac_2_16_00_08 (安装在 CCS 中,出于某种原因不是最新版本)

Tirtos 随 TivaWare_C_Series-2.1.71b 提供、但我使用 的是 TivaWare_C_Series-2.2.0.295。  

下面是 i2c 线的一些捕获:  

定制电路板阻断 i2c:

在同一传输中存在7.4ms 的较大间隙。

如果我使用回调模式、情况更糟、中间有50ms 的延迟:

如果有多个传输、则中间有多个裁切。 这些切割不是在转移之间、而是在转移中间。

有些交易不会被削减、但大多数交易会被削减。

下面是我初始化 i2c 驱动程序的方法。

//Init code
I2C_Params      i2cParams;
I2C_Params_init(&i2cParams);
i2cParams.bitRate = I2C_100kHz;
I2C_Handle i2c = I2C_open(I2C0, &i2cParams);
if (i2c == NULL) 
{ 
    System_abort("Error Initializing I2C\n");
}

以下是我的转接呼叫:

//Transaction call
uint8_t buffer[] = {0x06,0x00,0x04,0xFF,0x07,0x00,0x05,0xFF};
I2C_Transaction transaction = { buffer, sizeof(buffer), NULL, NULL, 0x20 };
if(!I2C_transfer(i2c, &cfg_transaction))
{
    System_printf("Problems sending i2c value.\n");
}

有人能帮我解决这个问题吗?

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

    你好,金枪鱼

    您是否尝试使用 ROV/RTOS 分析器来查看您的应用程序在给定时间运行的任务? 我觉得最可能的问题是 您的 I2C 正被一个更高优先级的任务取代。 这些工具显然会导致这种情况、以查看您的任务是如何进行的以及是否有任何延迟 I2C 执行的情况。

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

    您好 Ralph、

    感谢您的回复。 我将检查 ROV 以查看它是否被抢先。 我尚未设置我创建的任务的优先级。 他们都有1个作为优先级。 我将提出该特定任务的优先级、看看这是否有助于解决我的问题。  

    我只是感到惊讶的是、交易启动后需要如此多的手工操作。  

    我还在本次交易之前提交了一份任务良率、我没有看到任何差距、因此也让我有信心安排另一项任务。  

    所有任务都是事件驱动型的、因此考虑优先级可能是一个很好的解决方案。 如果在尝试此解决方案后遇到更多问题、我将发布。  

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

    您好 Ralph、

    我尝试将使用 i2c 的任务的优先级更改为高于其他任务(5 vs 1)、并尝试再次运行代码。

    它没有改变行为。 我想知道当 i2c 设置为阻塞模式时、它会在传输启动时改变上下文。  

    在代码的设置部分和从邮箱收到消息后线程运行时、也会看到相同的行为。  

    它还始终在前2个字节(地址和第一个数据字节)之后进行剪切。 因此该部件也是确定性的。  

    我尝试使用实时会话来跟踪更改、但它始终未命中代码切换到该任务的部分。 (指出数据丢失造成的差距。)

    我不确定如何解决该问题。 可以帮我解决这个问题吗?

    我可以提供您需要的任何数据/图像、只需通知我即可。  

    谢谢、

    金枪鱼

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

    你好,金枪鱼

    您能否为我提供在 EK-TM4C123GXL LaunchPad 上运行的项目? 如果是这样、我可以在我自己的硬件上运行它、看看我可以观察到什么、如果我可以解决数据丢失问题、从而使您无法看到更多调试数据。

    我注意到的另一件事是、您升级了与 TI RTOS 配合使用的 TivaWare 版本。 我们尚未验证其他 TivaWare 版本。 如果问题也出现、您是否有办法使用2.1.1快速测试?

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

    您好 Ralph、

    我将从 i2c 的示例之一开始、但我没有任何传感器板、只有123GXL、因此我无法运行它。

    我可以将电缆跳转至我拥有的传感器、但您将没有该传感器。

    此外、如果您尝试寻址不存在的器件、时钟线会一直处于低电平状态(这似乎是一个未解决的旧错误。)。

    我将尝试使用我使用的常规 Tivaware 与 RTOS 和新 Tivaware 搭配使用的传感器执行此操作。 将与这两者共享一个 zip 文件。  

    在切换之前、我使用常规 Tivaware 运行、顺便说一下、我遇到了同样的问题。

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

    你好,金枪鱼

    您只需向我发送您用于传感器的内容即可。 我将使用我拥有的 SensorHub BP 代码对其进行更新。 应非常快地更改几行以进行快速测试。 如果我有问题、我可以告诉您、我们将了解如何最好地复制它。

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

    在尝试创建项目时、我意识到了一些非常有趣的事情。

    当调试器未连接时、似乎不会出现此问题。

    我一直在运行调试器、系统刷新调用已用于帮助测试代码。  

    删除某些系统清空呼叫可以解决此问题。  

    感谢 Ralph 的帮助。  

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

    你好,金枪鱼

    很高兴听到这个问题如此简单。 很抱歉、我自己没有提出这个想法、我最近才开始为我们的器件提供 RTOS 支持。 我将来也要记住这一点、感谢大家的分享!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="411489" URL"~/support/microcontrollers/other/f/other-microcontrollers-forum/987167/tm4c123fh6pm-tirtos-i2c-driver-leaving-gaps-between-bytes-on-bulk-transfer/3657302 #3657302]I 一直在调试器中运行、系统刷新调用已用于帮助测试代码。  [/报价]

    如果使用系统刷新将消息写入 CCS 调试器控制台、则会使用 CIO 协议、其中涉及器件在断点停止、主机在目标恢复之前读取输出。 这可能会暂停执行几毫秒。

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

    切斯特、您好!

    是的、我认为这是问题所在。 奇怪的是、系统刷新调用位于另一个线程上、运行 i2c 传输的轮距优先级高于该线程。 也许、当进行系统刷新调用时、调试器被安排读取信息、但不会立即读取信息? 不知道它是如何工作的。 我在发送 UART 缓冲区时没有注意到相同的行为、因此也让我相信在阻塞模式下使用 i2c 时、不是处理缓冲的硬件、而是 CPU。  

    我认为这就是我以前在 UART 或 SPI 流上没有注意到它的原因。  

    感谢您的回答。