团队成员
我们要将 I2C0总线中的两个 I2C 器件连接 到控制器、
两个器件的从器件地址为0x28和0x29
我们面临的问题是、当我们单独运行两个线程时、它的工作似乎没有问题
但是、当我们并行运行时、我们无法与从器件进行通信、即从器件地址甚至无法得到应答。
您能在这里帮助吗?
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.
团队成员
我们要将 I2C0总线中的两个 I2C 器件连接 到控制器、
两个器件的从器件地址为0x28和0x29
我们面临的问题是、当我们单独运行两个线程时、它的工作似乎没有问题
但是、当我们并行运行时、我们无法与从器件进行通信、即从器件地址甚至无法得到应答。
您能在这里帮助吗?
您好
I2C TI 驱动程序使用应适应多次访问的信号量。 (请注意、一次只能发生一个 I2C 事务)=>即使我们检查了您的驱动程序并发现相同的、但在我们的例子中、它是不起作用的。
我们无法共享代码、因为我们具有
您能不能就我们可能犯的错误帮助我们吗? 我分享了一些输入、供您参考、
1.我们的 i2c 手柄仍然处于打开状态,但没有关闭
2.独立线程正常运行,没有问题
3.即使我们已经在应用程序中实现了 pthread_mutex_lock 和 pthread_mutex_unlock
4.我们发现的一个问题是、当0x29从器件未得到确认时、在本例中、0x28也失败、表示没有得到确认
请帮助我们
您是否具有上拉电阻器、如该主题所示:
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 配置?
这可以通过共享 ti_drivers_config.c/h 文件或.syscfg 文件来实现。
您好
这是"是"还是"否"? 您是否有上拉电阻器? =>是、我们有
这可以通过共享 ti_drivers_config.c/h 文件或.syscfg 文件来实现。 =>请找到所附的文件
您好
我正在附加.c 文件
请检查
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 线上看到一些压降、当我们对其提出疑问时、他们建议更改驱动强度。 我将在下方分享
3.每次重置 I2C_TRANSACTION 的状态(如果 I2C 传感器之间共享相同的状态)。 例如=>将尝试此操作