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/LAUNCXL-CC1310:通过I2C从传感器HDC1080读取数据

Guru**** 2782445 points

Other Parts Discussed in Thread: HDC1080, CC1310, CC2650, CC2560, TMP102

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

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/600875/rtos-launchxl-cc1310-read-data-from-sensor-hdc1080-via-i2c

部件号:LAUNCHTXL-CC1310
主题中讨论的其他部件:HDC1080CC1310CC2650CC2560TMP102

工具/软件:TI-RTOS

大家好,

我想从传感器HDC1080读取数据。 我将其连接到LAUNCHLL-CC1310的I2C端口。

我在CC1310_LAUNCHXL.h中添加了以下行:

#define Board_I2C_TMP CC1310_LAUNCHXL_I2C0

我正在尝试 此处链接的代码 ,以达到我的目的。

当我运行该程序时,当他尝试打开与以下代码行的通信时,它返回一个错误:

I2C = I2C_OPEN (Board_I2C_TMP,&i2cParams);

如何解决此问题?

提前感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试参考 sunmaysky.blogspot.tw/.../basic-example-to-use-hdc1080-on-cc2650.html</s>2650.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已经在尝试这个例子了。 当代码执行以下行时收到错误:

    I2C = I2C_OPEN (Board_I2C_TMP,&i2cParams);

    函数I2C_OPEN返回空值。

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

    如果您运行 i2ctmp007示例 而不进行修改,它是否有效?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否已确保连接到正确的IOS? CC2650的链接表明使用了IOID_5和6,但CC2560和CC13xx LP都使用IOID_4和IOID_5来进行I2C (请参阅CC1310_LAUNCXL.h)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,示例有效。 它可以打开通信。 我不明白为什么会发生这种情况,因为这两个代码看起来是等同的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,我使用的是正确的IOS
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我修复了代码,现在I2C_OPEN函数开始工作。
    现在问题出在函数I2C_TRANSFER。 我正在尝试使用以下代码编写HDC1080的配置:
    txBuffer[0]= 0x02;
    txBuffer[1]= 0x10;
    txBuffer[2]= 0x00;
    i2cTransaction.slaveAddress = 0x40;//HDC1080 ADDR;
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 3;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 0;

    IF (I2C_TRANSFER (i2c,&i2cTransaction)){
    system_printf ("配置确定\n");
    }其他{
    system_printf ("Configurazione fallita\n");
    }
    但当I2C_TRANSFER被执行时,它会崩溃。
    如何解决此问题?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尝试以下代码

    /*
     *版权所有(c) 2016-2017,2017,Texas Instruments Incorporated
     *保留所有权利。
     *
     *以源代码和二进制形式重新分发和使用,无论是否使用
     *允许进行修改,前提是满足以下条件
     满足*:
     *
     ** 重新分发源代码必须保留上述版权
     *   注意,此条件列表和以下免责声明。
     *
     ** 以二进制形式重新分发必须复制上述版权
     *   注意,此条件列表和中的以下免责声明
     *   随分发提供的文档和/或其他材料。
     *
     ** 既不是德州仪器(TI)公司的名称,也不是的名称
     *   其贡献者可用于支持或推广衍生产品
     *   未经事先书面许可。
     *
     *本软件由版权所有者和贡献者"按原样"提供
     *和任何明示或暗示的担保,包括但不限于
     *对适销性和特定适用性的暗示担保
     *不承担目的。 在任何情况下,版权所有者或
     *贡献者对任何直接,间接,附带,特殊,
     *惩戒性或后果性损害(包括但不限于
     采购替代货物或服务;使用,数据或利润损失;
     (*或营业中断),但基于任何责任理论,
     *无论是合同,严格责任还是侵权行为(包括疏忽或
     *否则)因使用本软件而产生,
     *即使已被告知可能发生此类损害。
     */

    /*
     *   ========= i2ctmp007.c =========
     */
    #include <stdint.h>
    #include <stddef.h>
    #include <unistd.h>

    /*驱动程序头文件*/
    #include <ti/drivers/GPIC.h>
    #include <ti/drivers/I2C.h>
    #include <ti/display/Display.h>

    /*示例/板头文件*/
    包含"Board.h"

    #define TASKSTACKSIZE      640

    #define TMP007_die_TEMP    0x0001 /*模具温度结果寄存器*/
    #define TMP007_OBJ_TEMP    0x0003 /* Object Temp Result Register */

    静态Display_Handle显示;

    /*
     * ========= mainThread =========
     */
    void *mainThread(void *arg0)

       无符号int   I;
       UINT16_t       温度;
       UINT8_t        txBuffer[1];
       UINT8_rxBuffer[2]        ;
       I2C_HANDLE     i2c;
       I2C_Params     i2cParams;
       I2C_Transaction i2cTransaction;

       /*调用驱动程序初始化函数*/
       DISPLAY_INIT();
       GPIO初始化();
       I2C_INIT();

       /*打开主机显示屏进行输出*/
       Display = Display_open (Display_Type_UART,NULL);
       如果(DISPLAY == NULL){
           同时(1);
       }

       /*打开用户LED */
       GPIO写入(Board_GPIO _LED0,Board_GPIO _LED_ON);
       display_printf (display,0,0,"正在启动i2ctmp007示例\n");

       /*创建I2C以供使用*/
       I2C_Params_init (&i2cParams);
       i2cParams.bitrate = I2C_400kHz;
       I2C = I2C_OPEN (Board_I2C_TMP,&i2cParams);
       如果(i2c ==空){
           display_printf (display,0,0,"Error Initializing I2C\n");
           同时(1);
       }
       否则{
           display_printf (display,0,0,"I2C已初始化!\n");
       }

       /*指向T室温寄存器并读取其2字节*/

       /*采集20个样本并将其打印到控制台上*/
       对于(i = 0;i < 20;I++){
           txBuffer[0]= 0x00;
           i2cTransaction.slaveAddress = 0x40;
           i2cTransaction.writeBuf = txBuffer;
           i2cTransaction.writeCount = 1;
           i2cTransaction.readBuf = rxBuffer;
           i2cTransaction.ReadCount = 0;
           IF (I2C_TRANSFER (i2c,&i2cTransaction)){
               display_printf (display,0,0,"Temp/Humd!\n");
           其他{
               display_printf (display,0,0,"Temp/Humd failed!\n");
           }
           睡眠(1);
           txBuffer[0]= 0x00;
           i2cTransaction.slaveAddress = 0x40;
           i2cTransaction.writeBuf = txBuffer;
           i2cTransaction.writeCount =0;
           i2cTransaction.readBuf = rxBuffer;
           i2cTransaction.ReadCount = 4;
           IF (I2C_TRANSFER (i2c,&i2cTransaction)){
               /*从接收的数据中提取C度;参见TMP102数据表*/
               温度=(rxBuffer[2]<< 8)|(rxBuffer[3]);

               /*
                *如果MSB设置为'1',则我们有一个2的补码
                *需要扩展符号的负值
                */
               /*
               *为简单起见,将温度值除以32即可消除
               *十进制精度;请参阅TI的TMP007数据表
               */
               温度=((双)温度/6.5536万)*100;

               //Display_printf (显示,0,0,"样本%u:%d (C)\n ",i,温度);
               display_printf (display,0,0,"Sample H %u:%d (%)\n",i,temperature);
               //Display_printf (DISPLAY,0,0,"MID %x:%x (C)\n",i,rxBuffer[1],rxBuffer[0]);
           }
           否则{
               display_printf (display,0,0,"I2C总线故障\n");
           }

           /*睡眠1秒*/
           睡眠(1);
       }

       /*已取消初始化I2C */
       I2C_CLOSE (i2c);
       display_printf (display,0,0,"I2C closed!\n");

       返回(NULL);
    }

    /*
     *版权所有(c) 2016-2017,2017,Texas Instruments Incorporated
     *保留所有权利。
     *
     *以源代码和二进制形式重新分发和使用,无论是否使用
     *允许进行修改,前提是满足以下条件
     满足*:
     *
     ** 重新分发源代码必须保留上述版权
     *   注意,此条件列表和以下免责声明。
     *
     ** 以二进制形式重新分发必须复制上述版权
     *   注意,此条件列表和中的以下免责声明
     *   随分发提供的文档和/或其他材料。
     *
     ** 既不是德州仪器(TI)公司的名称,也不是的名称
     *   其贡献者可用于支持或推广衍生产品
     *   未经事先书面许可。
     *
     *本软件由版权所有者和贡献者"按原样"提供
     *和任何明示或暗示的担保,包括但不限于
     *对适销性和特定适用性的暗示担保
     *不承担目的。 在任何情况下,版权所有者或
     *贡献者对任何直接,间接,附带,特殊,
     *惩戒性或后果性损害(包括但不限于
     采购替代货物或服务;使用,数据或利润损失;
     (*或营业中断),但基于任何责任理论,
     *无论是合同,严格责任还是侵权行为(包括疏忽或
     *否则)因使用本软件而产生,
     *即使已被告知可能发生此类损害。
     */

    /*
     *   ========= i2ctmp007.c =========
     */
    #include <stdint.h>
    #include <stddef.h>
    #include <unistd.h>

    /*驱动程序头文件*/
    #include <ti/drivers/GPIC.h>
    #include <ti/drivers/I2C.h>
    #include <ti/display/Display.h>

    /*示例/板头文件*/
    包含"Board.h"

    #define TASKSTACKSIZE      640

    #define TMP007_die_TEMP    0x0001 /*模具温度结果寄存器*/
    #define TMP007_OBJ_TEMP    0x0003 /* Object Temp Result Register */

    静态Display_Handle显示;

    /*
     * ========= mainThread =========
     */
    void *mainThread(void *arg0)

       无符号int   I;
       UINT16_t       温度;
       UINT8_t        txBuffer[1];
       UINT8_rxBuffer[2]        ;
       I2C_HANDLE     i2c;
       I2C_Params     i2cParams;
       I2C_Transaction i2cTransaction;

       /*调用驱动程序初始化函数*/
       DISPLAY_INIT();
       GPIO初始化();
       I2C_INIT();

       /*打开主机显示屏进行输出*/
       Display = Display_open (Display_Type_UART,NULL);
       如果(DISPLAY == NULL){
           同时(1);
       }

       /*打开用户LED */
       GPIO写入(Board_GPIO _LED0,Board_GPIO _LED_ON);
       display_printf (display,0,0,"正在启动i2ctmp007示例\n");

       /*创建I2C以供使用*/
       I2C_Params_init (&i2cParams);
       i2cParams.bitrate = I2C_400kHz;
       I2C = I2C_OPEN (Board_I2C_TMP,&i2cParams);
       如果(i2c ==空){
           display_printf (display,0,0,"Error Initializing I2C\n");
           同时(1);
       }
       否则{
           display_printf (display,0,0,"I2C已初始化!\n");
       }

       /*指向T室温寄存器并读取其2字节*/

       /*采集20个样本并将其打印到控制台上*/
       对于(i = 0;i < 20;I++){
           txBuffer[0]= 0x00;
           i2cTransaction.slaveAddress = 0x40;
           i2cTransaction.writeBuf = txBuffer;
           i2cTransaction.writeCount = 1;
           i2cTransaction.readBuf = rxBuffer;
           i2cTransaction.ReadCount = 0;
           IF (I2C_TRANSFER (i2c,&i2cTransaction)){
               display_printf (display,0,0,"Temp/Humd!\n");
           其他{
               display_printf (display,0,0,"Temp/Humd failed!\n");
           }
           睡眠(1);
           txBuffer[0]= 0x00;
           i2cTransaction.slaveAddress = 0x40;
           i2cTransaction.writeBuf = txBuffer;
           i2cTransaction.writeCount =0;
           i2cTransaction.readBuf = rxBuffer;
           i2cTransaction.ReadCount = 4;
           IF (I2C_TRANSFER (i2c,&i2cTransaction)){
               /*从接收的数据中提取C度;参见TMP102数据表*/
               温度=(rxBuffer[2]<< 8)|(rxBuffer[3]);

               /*
                *如果MSB设置为'1',则我们有一个2的补码
                *需要扩展符号的负值
                */
               /*
               *为简单起见,将温度值除以32即可消除
               *十进制精度;请参阅TI的TMP007数据表
               */
               温度=((双)温度/6.5536万)*100;

               //Display_printf (显示,0,0,"样本%u:%d (C)\n ",i,温度);
               display_printf (display,0,0,"Sample H %u:%d (%)\n",i,temperature);
               //Display_printf (DISPLAY,0,0,"MID %x:%x (C)\n",i,rxBuffer[1],rxBuffer[0]);
           }
           否则{
               display_printf (display,0,0,"I2C总线故障\n");
           }

           /*睡眠1秒*/
           睡眠(1);
       }

       /*已取消初始化I2C */
       I2C_CLOSE (i2c);
       display_printf (display,0,0,"I2C closed!\n");

       返回(NULL);
    }

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