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.

[参考译文] CCS/LAUNCHXL-CC2650:具有 BQ27441 Fuel Tank BoostekPack 的 I2C 问题

Guru**** 2557670 points
Other Parts Discussed in Thread: CC2650, BOOSTXL-BATPAKMKII

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/573093/ccs-launchxl-cc2650-issue-on-i2c-with-bq27441-fueltank-boostekpack

器件型号:LAUNCHXL-CC2650
主题中讨论的其他器件:CC2650MSP432P401RBOOSTXL-BATPAKMKII

工具/软件:Code Composer Studio

您好!

我在 Launchpad CC2650上插上了 Fuel Tank BoosterPack、并尝试使用 Sensortag 项目中的 SensorI2C.c/SensorI2C.h 驱动程序与 BQ27441进行通信。

我查看了 BOOSTXL-BATPAKMKII_FuelGauge_MSP432P401R 项目示例、并为 CC2650项目上的 BQ27441创建了文件驱动程序。

现在我已经设置好了所有内容、但 I2C 在读取16位值时无法正常工作。

我的 sensortag I2C 驱动器可与其他传感器配合使用、例如 MPU9250、因此这不是问题。

在 MSP432的 TI 示例项目上、读取函数超时。 找到的所有其他功能。

下面是我的示波器屏幕截图:

BQ27441数据表上的内容应如下所示:

以下是我使用 sensortag 驱动程序的代码:

if (!SensorI2C_readReg (stdcommand、result、2)))// stdcommand:0x06、result: buffer to read、2:two bytes to read
返回0;

在 MSP432示例项目上、代码行如下:

如果(!I2C_read16 (stdcommand、result、timeout))// stdcommand:0x06、result: buffer to read、timeout:1000

返回0;

从机似乎由于某种原因正在拉伸时钟。 我是否必须使用超时、以便主器件发送下一个时钟来读取16位值?

这就是数据表中写入的内容:

"9.5.4.4 I 2C 时钟拉伸在所有电量监测计工作模式下都可能发生时钟拉伸。 在 µs 和休眠模式下、由于器件必须唤醒以处理数据包、因此在所有 I 2C 流量上都会发生≤100 μ s 的短时钟拉伸。 在其他模式(初始化、正常)下、由于 I 2C 接口执行正常的数据流控制、在为电量监测计寻址的数据包内可能会出现≤4ms 的时钟拉伸周期。"

如何在 SensorI2C.c 驱动程序上实现"超时"?

那么、以下是该函数在 MSP432上的外观:

bool I2C_read16 (unsigned char 指针、short * result、unsigned int 超时)

uint8_t val = 0;
uint8_t valScratch = 0;
短接 r = 0;

/*将主设备设置为发送模式 PL */
I2C_setMode (EUSCI_B1_BASE、
EUSCI_B_I2C_Transmit 模式);

/*清除任何现有的中断标志 PL */
I2C_clearInterruptFlag (EUSCI_B1_base、
EUSCI_B_I2C_Transmit INTERRUPT0);

/*启动开始并发送第一个字符*/
如果(!I2C_masterSendSingleByteWithTimeout (EUSCI_B1_base、指针、超时)) <---------------- 该超时是否由于时钟拉伸而出现?
返回0;

/*
*生成开始条件并将其设置为接收模式。
*这会发出从器件地址并继续读取
*直到您发出停止
*
I2C_masterReceiveStart (EUSCI_B1_BASE);

/*等待 RX 缓冲区填充*/
while (!(I2C_getInterruptStatus (EUSCI_B1_BASE、
EUSCI_B_I2C_Receive_INTERRUPT0)));

/*从 I2C RX 寄存器读取*/
valScratch = I2C_masterReceiveMultiByteNext (EUSCI_B1_BASE);

/*接收第二个字节、然后发送停止条件*/
if (!I2C_ReceivmasterMultiByteFinishWithTimeout (EUSCI_B1_BASE、&V、超时))
返回0;

/*将 val 移动到顶部 MSB */
R =(val << 8);

/*从 I2C RX 寄存器读取并写入 r 的 LSB */
R |= valScratch;

/*返回温度值*/
*结果= r;

返回1;

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

    您能否尝试直接使用 TI-RTOS 驱动程序而不是使用 sensortag I2C API?