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.

[参考译文] RTOS/MSP430F5529:重复的I2C传输到具有相同地址的多个从属设备

Guru**** 2609895 points
Other Parts Discussed in Thread: MSP430F5529

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/656404/rtos-msp430f5529-repeated-i2c-transfers-to-multiple-slaves-with-identical-address

部件号:MSP430F5529

工具/软件:TI-RTOS

您好!

设置

CCS版本:7.3 .0.0.0019万
用于MSP43x的TI-RTOS:2.20 .0.06
编译器:TI v 16.9 .4.LTS

背景

客户正在尝试将MSP430F5529与多个I2C从属设备(4)配合使用 ,这些从属设备具有相同的从属 地址 ,无法修改。 外部1到4 MUX用于隔离每个器件,以便与相同的I2C引脚进行通信。 一个完整的I2C事务,包括I2C_Open(),I2C_Transfer()和I2C_Close(),每2秒对不同的从属设备进行一次。 I2C_CLOSE ()在将MUX更改为新的从属设备之前完成。

问题

通常在~10-15分钟后,TI-RTOS驱动程序的I2C_Open调用将返回NULL结果。

问题

I2C_Open的调用频率或次数是否有任何限制?

除了指示错误的NULL值之外,我也找不到I2C_Open调用返回的任何其他状态或类似状态。 是否有任何关于I2C驱动程序的进一步调试信息可帮助确定问题?

代码

下面是与给定I2C从属设备进行'完整' I2C事务的代码。 将外部MUX设置为所需的从属设备后,将调用此代码。

此致,

标记-

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

    Mark,您好!

    没有限制。 我的直觉认为I2C_OPEN在I2C_CLOSE被调用之前被调用。 看着代码,我发现没有线程安全机制来阻止多个线程调用上述函数。 是否有不同的任务调用此功能?

    托德

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

    Todd,您好!

    只有一个任务调用此函数。 它确实多次调用此函数,但它是一个抽象函数。

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

    如何管理"初始化"? 谁将其设置为"错误"? 我假设i2cparams和i2cTransaction是全局变量。 您能否确认在传输至所有4台设备的前N分钟内所有设备都正常工作?

    I2C_OPEN仅在三种情况下返回NULL
    1.传入的索引无效。 此处不是这样(假设它提前N分钟运行)。
    2. HwAttrs.clockSource无效。 同样,这里的情况并非如此(假设它提前N分钟运行,并且HwAttrs没有损坏...可能需要谨慎检查,确保它没有损坏...)。
    3.对I2C_OPEN的两次调用之间没有I2C_CLOSE。 我会在上述函数中添加一些调试信息,以显示是否发生了这种情况。

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

    Todd,您好!

    正在全局处理“已初始化”,最初设置为“false”。 然后,它设置为true,并在首次调用该函数后保持为true。


    是的,在传输的前N分钟内,所有4台设备都正常工作。

    如何检查HwAttrs.clockSource并查看它是否已损坏?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需在CCS的内存浏览器中查看它(i2cUSCIBHWAttrs或它的名称)。 然后运行并停止,问题已解决。 在内存浏览器中执行与更改的结构相关的任何操作。 我怀疑这种情况是否会发生,因为它可能是在瞬间发生的,但很容易排除。

    然后,我将重点添加debug以确定是否连续调用了两个I2C_open。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我将运行这些测试并将结果反馈给您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    听起来不错。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,Johnathan,

    是否有任何更新?

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

    嗨Todd,

    我们检查了HWAttri值,它没有损坏。 我们还试图重复这一问题,它似乎莫名其妙地消失了。 我们将继续监控I2C事务总线,并在问题再次出现时通知您。

    感谢您对故障排除的所有帮助!

    Johnathan