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.

[参考译文] CC2652R7:CC2652R7 -通过 I2C0总线连接两个从器件、并尝试并行访问

Guru**** 2535750 points


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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1301310/cc2652r7-cc2652r7---connecting-two-slave-devices-with-i2c0-bus-and-trying-to-access-parallely

器件型号:CC2652R7

团队成员

我们要将 I2C0总线中的两个 I2C 器件连接 到控制器、

两个器件的从器件地址为0x28和0x29

我们面临的问题是、当我们单独运行两个线程时、它的工作似乎没有问题

但是、当我们并行运行时、我们无法与从器件进行通信、即从器件地址甚至无法得到应答。  

您能在这里帮助吗?

您能告诉我们问题出在哪里吗?

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

    您好!

    您能否分享更多信息:

    1. 两种情况(工作和不工作)的逻辑分析仪快照
    2. 两种情况下的代码(首先为代码片段)

    I2C TI 驱动程序使用应适应多次访问的信号量。 (请注意、一次只能发生一个 I2C 事务)。


    谢谢。
    托比

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

    您好  

    I2C TI 驱动程序使用应适应多次访问的信号量。 (请注意、一次只能发生一个 I2C 事务)=>即使我们检查了您的驱动程序并发现相同的、但在我们的例子中、它是不起作用的。

    我们无法共享代码、因为我们具有  

    您能不能就我们可能犯的错误帮助我们吗? 我分享了一些输入、供您参考、

    1.我们的 i2c 手柄仍然处于打开状态,但没有关闭

    2.独立线程正常运行,没有问题

    3.即使我们已经在应用程序中实现了 pthread_mutex_lock 和 pthread_mutex_unlock

    4.我们发现的一个问题是、当0x29从器件未得到确认时、在本例中、0x28也失败、表示没有得到确认  

    请帮助我们

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

    它在定制电路板上吗?

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

    团队成员

    这不是定制电路板  

    我们在使用 CC2652-R7 Launchpad  

    我们将从器件连接到 DIO4和 DIO5

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

    您是否具有上拉电阻器、如该主题所示:
    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1299078/tidc-cc2650stk-sensortag-adding-additional-sensor-to-sensortag

    I2C_TRANSMIT 失败时的状态是什么?

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

    您好  

    您是否有上拉电阻器、如该主题所示:=>  

    I2C_TRANSMIT 失败时的状态是什么? =>状态为 I2C_STATUS_DATA_NACK

    " Display_printf (显示、0、0、"I2C 目标地址0x%x 不"
    "已确认!"、
    Transaction->targetAddress);"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有上拉电阻器,如该线程所示:==>
     

    这是"是"还是"否"? 您是否有上拉电阻器?

    您能否共享 I2C 配置?
    这可以通过共享 ti_drivers_config.c/h 文件或.syscfg 文件来实现。

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

    您好

    这是"是"还是"否"? 您是否有上拉电阻器? =>是、我们有

    这可以通过共享 ti_drivers_config.c/h 文件或.syscfg 文件来实现。 =>请找到所附的文件

    e2e.ti.com/.../6683.ti_5F00_drivers_5F00_config.h

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

    我只看到.h 文件

    另请共享.c 文件。

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

    您好  

    我正在附加.c 文件  

    请检查  

    e2e.ti.com/.../1423.ti_5F00_drivers_5F00_config.c

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

    团队成员

    从单个总线中的不同线程访问两个从地址时、我们收到以下错误  

    I2C 总线已在使用!

    I2C 总线已在使用!

    I2C 总线已在使用!

    I2C 总线已在使用!

    I2C 总线已在使用!

    您能否同时检查

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

    I2C 配置看起来不错、并且总线处于忙状态是预期的行为(如果当前正在使用 I2C 线路)。

    I2C 总线忙表示应用程序正在尝试执行 I2C 传输、而 I2C 主设备当前正在尝试执行 I2C 事务。

    如果您获得此状态(I2C_STATUS_BUS_BUS_BUSY == transaction.status)、则尝试让应用程序等待一个位 (例如 usSleep)、然后再次尝试 I2C_TRANSMIT。

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

    是理解

    但根据输入 I2C 驱动器甚至具有信标发布和挂起功能、除此之外、我们还为每个执行 I2C 事务的函数在应用中添加了互斥锁。

    但在这种情况下,任何一个线程都失败了,而如果我们在一个线程中逐个实现应用,我尝试与两个传感器通信. 但这无法满足我们对于碳化硅  

    我们还将如下所示设置 I2C SDA/SCL 的驱动强度

    IOCIODrvstrengthSet (IOID_4、IOC_CURRENT_8mA、IOC_Strength_MAX);
    IOCIODrvstrengthSet (IOID_5、IOC_CURRENT_8mA、IOC_Strength_MAX);

    还有我们缺少的其他东西吗?

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

    您是否尝试过之前的建议?

    如果您获得此状态(I2C_STATUS_BUS_BUS_BUS_BUS_BUSY == transaction.status),则尝试让应用程序等待一位 (例如 usleep),然后再次尝试 I2C_TRANSMIT。

    请确认。

    下面还有几个测试要尝试。

    1.在多线程应用中、让线程执行以下序列来进行任何 I2C 交互:I2C_open --> I2C_transfer --> I2C_Close。 这将最大程度地确保每个单独访问的 I2C 驱动器状态是干净的。

    2.保留相同的多线程应用程序, 但不要调用  IOCDrvstrengthSet (使用默认值)。

    3.每次重置 I2C_TRANSACTION 的状态(如果 I2C 传感器之间共享相同的状态)。 例如

    I2C_Transaction g_i2cTrans;
    
    static void do_sensor1_i2c()
    {
        memset(&g_i2cTrans, 0x00, sizeof(g_i2cTrans));
        // ... other code
    }
    
    static void do_sensor2_i2c()
    {
        memset(&g_i2cTrans, 0x00, sizeof(g_i2cTrans));
        // ... other code
    }


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

    您好  

    如果您获得此状态(I2C_STATUS_BUS_BUS_BUSY == transaction.status)、则尝试让应用程序等待一个位 (例如 usSleep)、然后再次尝试 I2C_TRANSMIT。 =>是的,我们尝试了这个,它没有帮助我们

    1.在多线程应用中、让线程执行以下序列来进行任何 I2C 交互:I2C_open --> I2C_transfer --> I2C_Close。 这将最大程度地确保每个单独访问的 I2C 驱动器状态是干净的。 =>我们在 main 中执行 i2c 打开、并在多标准应用程序中执行传输。 但我们也尝试了这种方法、

    2.保留相同的多线程应用程序, 但不要调用  IOCDrvstrengthSet (使用默认值)。 =>可以。 这样做是因为在我们的硬件设置中、我们会在 SCL 线上看到一些压降、当我们对其提出疑问时、他们建议更改驱动强度。 我将在下方分享

    https://www.google.com/url?sa=j&url=https%3A%2F%2Fe2e.ti.com%2Fsupport%2Fwireless-connectivity%2Fbluetooth-group%2Fbluetooth%2Ff%2Fbluetooth-forum%2F1303085%2Fcc2652r7-lp-cc2652r7-i2c-clock-line-voltage-lift-and-dip%2F4962618%234962618&uct=1700197693&usg=bUfbiBRZJcmJBbhKQGqtHn8205M.&opi=73833047&source=chat

    3.每次重置 I2C_TRANSACTION 的状态(如果 I2C 传感器之间共享相同的状态)。 例如=>将尝试此操作