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/LAUNCHXL-CC2650:I2C 读取/写入- I2C_Transfer 返回的值始终为 false

Guru**** 2562120 points
Other Parts Discussed in Thread: CC2650

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/586288/rtos-launchxl-cc2650-i2c-read-write---i2c_transfer-returns-always-false

器件型号:LAUNCHXL-CC2650
Thread 中讨论的其他器件:CC2650

工具/软件:TI-RTOS

您好!

目前、我正在尝试通过 I2C 与多路复用器传感器(MAX44009)进行通信。 我将传感器 SCL 连接到 GPIO4、将 SDA 连接到 GPIO5 (在 CC2650_LAUNCHXL.h 文件中进行了类似定义)。 此外、我还将 A0引脚从 MAX44009连接到 GND、以确定从器件地址。 现在、根据传感器的规格、从器件地址应为  

0b10010100用于写入

0b10010101用于读取。

此外、它还为我提供了一个有关如何读取特定寄存器的示例:

我的代码现在如下所示:

uint16_t 温度;
uint8_t txBuffer[1];
uint8_t rxBuffer[1];
I2C_Handle I2C;
I2C_Params i2cParams;
I2C_Transaction i2cTransaction;
uint8_t 一;

/*创建 I2C 以供使用*/
I2C_Params_init (&i2cParams);
i2cParams.bitrate = I2C_400kHz;
I2C = I2C_open (0、&i2cParams);
if (i2c == NULL){
UartDebug_Print (中、"Error Initializing I2C\n");
}
否则{
UartDebug_Print (中、"I2C initialized!\n");
}

TxBuffer[0]= 0x04;
i2cTransaction.slaveAddress = 0b10010100;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 0;

if (I2C_transfer (i2c、&i2cTransaction)){
UartDebug_Print (介质、"I2C 写入成功\n");
}
否则{
UartDebug_Print (中、"I2C 总线故障写入"\n);
}

TxBuffer[0]= 0x04;
rxBuffer[0]= 0x00;
i2cTransaction.slaveAddress = 0b10010101;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 0;
i2cTransaction.readBuf = rxBuffer;
i2cTransaction.ReadCount = 1;

/*采集20个样本并将其打印到控制台*/
对于(i = 0;i < 1;i++){
if (I2C_transfer (i2c、&i2cTransaction)){
温度= rxBuffer[0];

UartDebug_Print (medium、"Sample %u:%d (C)\n"、i、temperature);
}
否则{
UartDebug_Print (中、"I2C 总线故障读取"\n);
}
}

/*已取消初始化 I2C */
I2C_Close (i2c);
UartDebug_Print (中、"I2C Closed!\n"\}); 

我的输出现在为:

UART_Log [level:medium] I2C 已初始化!
UART_Log [级别:中等] I2C 总线故障写入
UART_Log [级别:中等] I2C 总线故障读取
UART_Log [级别:中等] I2C 闭合! 

我不确定我在这里做什么错了。 我首先将寄存器地址写入传感器、然后尝试读回一个字节。 我处理 I2C_Transfer 函数是否错误? 当我想只读/写时、我可以将 ReadCount/writeCount 设置为零、还是应该使用专用的读/写命令?

感谢您的任何帮助!

谢谢

Chris

PS:我在 CC2650 SensorTag I2C 示例中采用了这种方法!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这通常是由于 CC2650和 I2C 从器件之间的 I2C 连接不良造成的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我在 Arduino 上测试了分线板、它的工作方式很有魅力。 因此、分线板和 Launchpad 之间的连接应该良好。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您将示波器连接到 I2C SCL 和 SDA 引脚、您在引脚上看到的是 I2C 信号吗?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将示波器连接到了它、它看起来像这样:

    概述:

    第一个模式:

    第二种模式:

    看起来传感器根本没有应答。 地址是否正确写入? 那么、我是否必须将地址向左移动一位并向其添加读取/写入位?

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、看起来我已经取得了一些进展、我不必将地址向左移动一位、而是只需将其保留为这样、I2C 驱动程序负责设置读取或写入位。 这有点不是很明智。 无论如何都很感谢!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我们欢迎您的到来、最好知道您解决了问题。