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.

[参考译文] CC2650STK:CAN#39;t 使用 I2C_TRANSFER ()函数从温度传感器获取值。

Guru**** 2560390 points
Other Parts Discussed in Thread: CC2650, CC2650STK, TMP102

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/570601/cc2650stk-can-t-get-value-from-temperature-sensor-using-i2c_transfer-function

器件型号:CC2650STK
Thread 中讨论的其他部件:CC2650TMP102

你(们)好  

我尝试在 cc2650 sensortag 中使用 launchpad 的源代码、并使用 I2C 库扩展代码以获取温度值。  当我构建 i2ctmp007_cc2650STK_TI_CC2650f128并将其上传到 sensortag 时、示例"i2ctmp007_cc2650STK_TI_CC2650f128"工作正常。 但是、当我使用相同的过程来获取 由 SimpleBLEPeripheral_taskFxn 触发的任务中的温度时、它不起作用。  尽管 I2C_open()返回 true,但它似乎是 I2C_TRANSF()函数导致了这里的问题。 我已将 SBP_TASK_PRIORITY 的优先级更改为3、将创建的任务更改为2。  

如果有人帮助我解决这个问题,我将不胜感激。 我只想获取温度和湿度读数。 什么可能出错?

提前感谢

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否提供有关"由 SimpleBLEPeripheral_taskFxn 触发的任务"的含义的更多详细信息?
    SensorTag 示例应用展示了如何通过 I2C 读取传感器数据。

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

    感谢您的回复。

    我要做的是使用 sensortag 获取红外温度和湿度传感器读数。 我知道 ble SDK 中的 sensortag 源代码包含该代码。 但我需要从外部传感器(Si7006-A20-IM)读取读数。 我从 cc2650 sensortag 开始(因为 tmp007与我需要使用的传感器的距离更近)、并尝试扩展 launchpad (simple_peripheral)的源代码、并从 tmp007读取温度传感器。

    我所做的主要是在应用程序中编辑 simple_peripheral.c。 有一个带有回调函数 simpleBLEPeripheral_taskFxn()的任务,此任务是在 SimpleBLEPeripheral_createTask()中创建的。 我同样从 main 创建了一个任务调用函数 create_MyTask()来创建任务,回调函数为 MyTask_fxn()。 我已经在 seSimpleBLEPeripheral_taskFxn()中发布了一个与 MyTask 相关的信号量,以便 BIOS 可以运行 MyTask。 任务运行正常。
    接下来、我将 i2ctmp007_CC2650STK_TI_CC2650f128示例中粘贴的 I2C 代码(在 sensortag 上运行正常)复制到 MyTask 函数中。

    unsigned int i;
    uint16_t 温度;
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];
    I2C_Handle I2C;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;

    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    I2C = I2C_open (0、&i2cParams);
    if (i2c == NULL){
    MSG[7]='n';
    //System_abort ("初始化 I2C\n 时出错");

    否则{
    //msg[7]= I2C_transfer (i2c、&i2cTransaction);
    //System_printf ("I2C 已初始化!\n");


    /*指向 T 环境寄存器并读取其2个字节*/
    txBuffer[0]= TMP007_obj_TEMP;
    i2cTransaction.slaveAddress = Board_TMP007_ADDR;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 2;
    MSG[9]++;
    if (I2C_transfer (i2c、&i2cTransaction)){
    温度= 16;
    /*从接收到的数据中提取°C;请参阅 TMP102数据表*/
    温度=(rxBuffer[0]<< 6)|(rxBuffer[1]>> 2);

    /*
    *如果 MSB 设置为"1"、则我们有二进制补码
    *需要符号扩展的负值
    *
    if (rxBuffer[0]& 0x80){
    温度|= 0xF000;

    /*
    *为简单起见、将温度值除以32即可摆脱
    *十进制精度;请参阅 TI 的 TMP007数据表
    *
    温度/= 32;
    MSG[5]=温度;
    温度= 12;

    //System_printf ("采样%u:%d (C)\n"、i、温度);

    否则{
    // System_printf ("I2C 总线故障\n");


    I2C_open (0、&i2cParams)不返回 false。 但是 I2C_transfer (i2c、&i2cTransaction)不起作用。 if condition 从不执行时的代码。


    可以帮我解决这个问题吗?

    提前感谢
    Zubair