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.

[参考译文] MSP430FR5994:I2C 主器件接收模式

Guru**** 2945530 points

Other Parts Discussed in Thread: HDC2010, MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/779192/msp430fr5994-i2c-master-receive-mode

器件型号:MSP430FR5994
主题中讨论的其他器件:HDC2010、

对于我们的硬件,我们在 I2C 主模式下使用 MSP430FR5994的端口 B2与电池供电设备上的 HDC2010湿度传感器进行通信。  我们在电路板上遇到了一些罕见的情况,在这些电路板上 MSP430会锁定,电池会耗尽。  我们终于发现了 I2C 主机接收模式的问题。  在 MSP430 TI 驱动程序(版本2.20.00.08)的 I2CEUSCI.c 文件中、在函数 I2CEUSCI_hwiIntFxn ()中、第315至325行如下:

 

               /*

                *通过发送来在主机接收模式下启动 I2C 传输

                *起始位和停止位、因为它是最后一个字节

                *

                   eUSCI_B_I2C_masterReceiveStart (hwAttrs->baseAddr);

                   while (eUSCI_B_I2C_masterIsStartSent (hwAttrs->baseAddr));

                   EUSCI_B_I2C_masterReceiveMultiByteStop (hwAttrs->baseAddr);

 

                   Log_Print1 (Diags_User2、"I2C:(%p) I2CEUSCI_WRITE_MODE:-> I2CEUSCI_READ_MODE;"

                                   "读取时重新启动并停止"、

                                    hwAttrs->baseAddr);

 

MSP430偶尔会无限期停留在上面代码中的 while 循环上。  它启动 I2C 启动、但它从未看到启动被发送的确认。  在一些电路板上、这种情况比其他电路板更经常发生;在某些高/低环境温度情况下、某些电路板的情况也更频繁发生。  我认为、正确的解决方案是对 while 环路设置计数限制、然后在发生故障时中止传输。  但是,我们不确定该位置是否有合理的环路限制计数。  我假设有一个基于 I2C 时钟速度的合理限制,但我不确定它是什么。  您是否有基于 I2C 总线设置的建议限值、或其他可能适用的方法?

 

我还在 I2CEUSCI_primeTransfer()中看到类似的循环。  ISR 中有意义的任何解决方案也应应用于 I2CEUSCI_primeTransfer 中。

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

    Dan、您好!

    我同意环路中有一个计数器可能会解决问题、但出于好奇、您是否能够使用逻辑分析仪捕捉故障? 我想知道故障是在湿度传感器侧还是在 MSP 侧。

    下面是来自 I2C 规范文档的数据传输图(链接如下)

     

    看起来应该在发送最后一个数据位后的下一个时钟周期中看到 ACK。 为了安全起见、在发送最后一个数据位后、我将使 while 环路中的计数值至少补偿2个 I2C 时钟周期。  

    如有任何其他问题、请告知我。

    谢谢、

    Mitch

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

    Mitch、

    我最初是在离线时向 Dan 提出这个问题、他为我将这个问题发布到论坛。

    我尚未尝试在逻辑分析仪上捕获错误。  我将查看我是否可以这样做并分享结果。

    如果有用、我将按如下方式设置 I2C 总线:

    I2C_Params i2cParams;
    
    /*如果接口不为 NULL,请先关闭接口*/
    if (hI2C)
    {
    I2C_Close (hI2C);
    hI2C =空;
    }
    
    /*打开 I2C 总线接口*/
    Board_initI2C();
    I2C_Params_init (&i2cParams);
    i2cParams.transferMode = I2C_MODE_CALLACK;
    i2cParams.transferCallbackFxn = humidityTxfrDone;
    i2cParams.bitrate = I2C_400kHz;
    hI2C = I2C_open (Board_I2C0、&i2cParams);
    

    回调函数跟踪 I2C 传输是否成功完成并发布到信号量、如下所示:

    静态空 humidityTxfrDone (I2C_Handle i2c、I2C_Transaction *txn、bool 结果)
    {
    /*存储交易是否成功*/
    i2cTxfrSuccessess =结果;
    
    /*发布到信号量以指示事务已完成*/
    Semaphore_post (semHumidityTxfrDone);
    } 

    然后、一旦我构建一条 I2C 消息(读取或写入命令)、我将按照如下方式完成传输:

    I2C_Transaction    i2cTransaction; 

    /*根据消息填充 i2cTransaction */
    (笑声)

    /*开始传输*/ I2C_transfer (hI2C、&i2cTransaction); /*等待传输完成并返回结果*/ if (semaphore_pend (semHumidityTxfrDone、1000)=false) { /*事务耗时很长。 终止事务。 * I2C_CANCEL (hI2C); } 其他 { /*事务已完成,但可能尚未成功完成。 *返回 I2C_transfer 结果。 * RetVal = i2cTxfrSuccessess ;}

    我使用 TI-RTOS 执行多项任务、但只有一项任务与湿度传感器相连。  如果我在 I2C 读取/写入过程中执行的任何操作可能会导致问题、请告知我。

    谢谢、

    Bryan

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

    我已经尝试了很多次、但无法在逻辑分析仪上捕获错误。  我将继续尝试、但我希望发布更新、以便让您知道我仍在处理此问题。  我还致力于可靠地触发问题、以便轻松地显示代码更改可以解决问题。  我将在以后发布我的进度更新。

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

    我有更多有关此问题的信息。  对于 I2C 接口、我切换到使用阻塞模式而不是回调模式。  我可以很容易地将其置于 I2CEUSCI.c 中的第663行上的模式中:

    Semaphore_pend (Semaphore_handle (&(object->transferComplete)))、
    BIOS_wait_forever);
    

    第一个 I2C 事务是主机读取。  我假设有一个错误中断、如果从器件没有响应、该中断应该被触发。  我在 ISR 中有错误中断条件的断点、它永远不会出现。

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

    感谢您的更新。 由于您能够使其卡在此行中、您现在是否能够在逻辑分析仪上看到错误? 我想知道从器件是否未响应、或者 MSP 是否未识别从器件响应。

    此外、我注意到您提到您使用的是版本2.20.00.08驱动程序。 您是说版本2.20.00.06吗?

    谢谢、

    Mitch
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我仍然无法捕获逻辑分析仪上的故障。 我认为我的逻辑分析仪正在重新触发一次毛刺脉冲、因为每当它发生故障时、我都会获取一个没有数据的逻辑分析仪捕获(SDA 和 SCL 在整个捕获过程中都处于高电平)。

    我使用的是 TI-RTOS 版本2.20.00.06。 在 TI-RTOS 下、用于 MSP430的 TI 驱动程序版本为2.20.00.08 (完整路径为 tirtos_msp43x_2_20_00_06/products/tidrivers_msp43x_2_20_00_08)。

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

    很难判断误差是在 MSP 侧还是传感器侧。 我将与我们的团队核实您使用的软件驱动程序是否存在任何已知问题。 您是否更改了软件? 如果是、您进行了哪些更改?

    谢谢、

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

    Mitch、

    很抱歉、由于本主题的响应时间很长、我在几个不同的任务之间进行了抖动。  我仍然没有在逻辑分析仪上捕获到故障、但我已确定一个硬件问题。  我的电路板在 I2C 线路上放置了100K 的上拉电阻器、而不是10K 电阻器。  令人惊讶的是、通信通常只是正常工作(并且在某些电路板上始终如一地工作)、但这可能是某些电路板在某些环境条件下发生通信失败的原因。

    在我在前面的帖子中的示例代码中,我还更改了代码,以便我不调用 I2C_CANCEL()。  在 I2C_transfer ()之后、我等待信号量发布、然后根据结果返回通过/失败。  如果我失败了、那么我就停止尝试与湿度传感器通信、稍后再试。  我至少看到了一个 I2C_CANCEL()卡在清除事务队列中的实例;我认为队列已经清除,它不能识别没有任何需要清除的内容。  然后、它只是坐在 while 循环中、尝试清除不会清空的队列。

    如果它不会产生影响、湿度传感器会有单独的电源部分、因此湿度传感器会在间隔几分钟的通信会话之间断电。  我已确认湿度传感器在重新加电之前完全断电、并且湿度传感器关闭时 I2C 外设已禁用。  上拉电阻位于湿度传感器电源部分、这意味着在我为湿度传感器加电之前、上拉电阻不会处于活动状态。

    到目前为止、我仅使用逻辑分析仪来查看 I2C 线路。  我将使用示波器查看事务、看看我是否能够分辨上拉电阻较弱的 I2C 上发生了什么情况。  如果您对弱上拉电阻(MSP430侧或 HDC2010侧)的预期情况有任何见解、请告诉我。

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

    很棒的收获! 您肯定需要减小上拉电阻器值。 如果上拉电阻值过高、则 I2C 线路在拉低之前可能不会上升到逻辑高电平。 这可能是您问题的原因。

    我不确定您的 I2C 通信的运行速度、但您通常希望将上拉电阻保持在10K 或以下。 以下是一些资源、可让您根据总线电容和 I2C 速度微调电阻器值:

    I2C 总线上拉电阻计算应用手册:
    www.ti.com/.../slva689.pdf

    官方 I2C 总线规范:
    www.nxp.com/.../UM10204.pdf

    我建议使用这些文档中描述的建议值交换您的电阻器。 请告诉我您找到的内容!

    谢谢、

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

    Mitch、

    感谢您参考上拉电阻计算器。  如果我在阅读数据表的正确位置、我认为 MSP430FR5994的输入引脚上的最大容性负载为3pF 或5pF、HDC2010的 I2C 引脚上的容性负载为0.5pF。  我们一直在快速模式下运行、因此根据容性负载的不同、最大上拉值介于64KOhm 和100Kohm 之间。  这对我来说很有意义、那么我们为什么会看到某些电路板和某些电路板在某些环境条件下运行正常。

    但是、障板 ME 的作用是、在本例中、我没有看到错误中断。  我已启用所有中断、并且从未触发错误中断。  为了从错误中恢复、我必须在回调模式下运行、然后在第一次出现故障时关闭湿度传感器并禁用 MSP430上的 I2C 外设。  如果我这样做、我至少可以从错误中持续恢复。  在我用10K 电阻器替换100K 电阻器的电路板上、我可以始终如一地与湿度传感器进行通信、而不会出现错误。

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

    确切地说、您希望看到什么错误中断? 您是否说器件与100K 电阻器"锁定"?

    谢谢、

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

    我有一段时间没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。

    谢谢!

    Mitch