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.

[参考译文] CC3220SF-LAUNCHXL:在 Simple Link WiFi CC3220SF 中从 TMP006接收负温度

Guru**** 1135610 points
Other Parts Discussed in Thread: TMP006, TMP116, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1223009/cc3220sf-launchxl-receiving-negative-temperature-from-the-tmp006-in-simple-link-wifi-cc3220sf

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:TMP116SysConfig

尊敬的社区:

 我使用 TI 资源代码 点击此处 测量具有以下配置的室温  

/*
 * SCL: P01.
 * SDA:P02
 * LaunchPad I2C
 */

表示 NoRTOS

我使用控制台来查看 CCS i、e 中的温度。DisplayPrint 被 printf 取代、

温度*= 0.0078125;替换为-> temperature_c =(温度 / 4)* 0.03125;

其中 temperature_c 为浮点数据类型。  

不超过这些更改。  

输出如下:

  1. 为什么我无法正确获得室温?  
  2. 未打印"I2C closed!" 但它没有添加注释?

谢谢。此致、

Ajaykumar V.

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

    嘿  Ajaykumar、

    为了 重新生成 您的问题、您可以向 我提供您的 SDK 版本吗?

    此致、

    AVI E

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

    尊敬的 Avi Epstein:

    我将使用的 SDK 如下 simplelink_cc32xx_sdk_6_10_00_05

    谢谢。此致、

    Ajaykumar V.

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

    好的、我们将尝试重现并返回给您。

    此致、

    AVI E

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

    您好、Avi E:

    下面是我根据要求修改的代码

    请在下方找到:

    /*
     *  ======== i2ctmp.c ========
     */
    #include <stdint.h>
    #include <stddef.h>
    #include <unistd.h>
    #include <stdio.h>
    
    /* Driver Header files */
    #include <ti/drivers/GPIO.h>
    #include <ti/drivers/I2C.h>
    #include <ti/display/Display.h>
    
    /* Driver configuration */
    #include "ti_drivers_config.h"
    
    #define TASKSTACKSIZE       640
    
    /* Temperature result registers */
    #define TMP006_RESULT_REG          0x0001
    #define TMP11X_RESULT_REG          0x0000
    
    /* I2C slave addresses */
    #define TMP006_LAUNCHPAD_ADDR      0x41
    #define TMP11X_BASSENSORS_ADDR     0x48
    #define TMP116_LAUNCHPAD_ADDR      0x49
    
    /* Number of supported sensor iterations */
    #define TMP_COUNT           3
    
    /*
     * Data structure containing currently supported I2C TMP sensors.
     * Sensors are ordered by descending preference.
     */
    static const struct {
        uint8_t address;
        uint8_t resultReg;
        char *id;
    } sensors[TMP_COUNT] = {
        { TMP11X_BASSENSORS_ADDR, TMP11X_RESULT_REG, "11X" },
        { TMP116_LAUNCHPAD_ADDR,  TMP11X_RESULT_REG, "116" },
        { TMP006_LAUNCHPAD_ADDR,  TMP006_RESULT_REG, "006" }
    };
    
    static uint8_t slaveAddress;
    static Display_Handle display;
    
    static void i2cErrorHandler(I2C_Transaction *transaction,
        Display_Handle display);
    
    /*
     *  ======== mainThread ========
     */
    void *mainThread(void *arg0)
    {
        uint16_t        sample;
        int16_t         temperature_raw;
        float           temperature_c;
        uint8_t         txBuffer[1];
        uint8_t         rxBuffer[2];
        int8_t          i;
        I2C_Handle      i2c;
        I2C_Params      i2cParams;
        I2C_Transaction i2cTransaction;
    
        /* Call driver init functions */
        //Display_init();
        GPIO_init();
        I2C_init();
    
        /* Configure the LED and if applicable, the TMP_EN pin */
        GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    #ifdef CONFIG_GPIO_TMP_EN
        GPIO_setConfig(CONFIG_GPIO_TMP_EN, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
        /* Allow the sensor to power on */
        sleep(1);
    #endif
    
        /* Open the UART display for output */
    /*    display = Display_open(Display_Type_UART, NULL);
        if (display == NULL) {
            while (1);
        }
    */
        /* Turn on user LED */
        GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);
        printf("Starting the i2ctmp example\n");
    
        /* Create I2C for usage */
        I2C_Params_init(&i2cParams);
        i2cParams.bitRate = I2C_400kHz;
        i2c = I2C_open(CONFIG_I2C_TMP, &i2cParams);
        if (i2c == NULL) {
            printf("Error Initializing I2C\n");
            while (1);
        }
        else {
            printf("I2C Initialized!\n");
        }
    
        /* Common I2C transaction setup */
        i2cTransaction.writeBuf   = txBuffer;
        i2cTransaction.writeCount = 1;
        i2cTransaction.readBuf    = rxBuffer;
        i2cTransaction.readCount  = 0;
    
        /*
         * Determine which I2C sensors are present by querying known I2C
         * slave addresses.
         */
        for (i = TMP_COUNT - 1; i >= 0; i--) {
            i2cTransaction.slaveAddress = sensors[i].address;
            txBuffer[0] = sensors[i].resultReg;
    
            if (I2C_transfer(i2c, &i2cTransaction)) {
                slaveAddress = sensors[i].address;
                printf("Detected TMP%s sensor with slave"
                " address 0x%x\n", sensors[i].id, sensors[i].address);
            }
            else {
                i2cErrorHandler(&i2cTransaction, display);
            }
        }
    
        /* If we never assigned a slave address */
        if (slaveAddress == 0) {
            printf("Failed to detect a sensor!");
            I2C_close(i2c);
            while (1);
        }
    
        printf("\nUsing last known sensor for samples.\n");
        i2cTransaction.slaveAddress = slaveAddress;
    
        /* Take 20 samples and print them out onto the console */
        i2cTransaction.readCount  = 2;
        for (sample = 0; sample < 20; sample++) {
            if (I2C_transfer(i2c, &i2cTransaction)) {
                /*
                 * Extract degrees C from the received data;
                 * see TMP sensor datasheet
                 */
                //printf("rxBuffer[0]: %#x, rxBuff[1] : %#x, ", rxBuffer[0], rxBuffer[1]);
                temperature_raw = (rxBuffer[0] << 8) | (rxBuffer[1]);
                //printf("Raw_temperature after zipping : %#X, ", temperature_raw);
    
                /*
                 * If the MSB is set '1', then we have a 2's complement
                 * negative value which needs to be sign extended
                 */
                if (rxBuffer[0] & 0x80) {
                    temperature_raw |= 0xF000;
                }
                /* converting raw temperature (integer) to physical temperature (float) 
                 * as per data sheet of TMP006 (SBOS518E –MAY 2011–REVISED APRIL 2015)
                 */
                temperature_c = temperature_raw * 0.0078125; 
    
                printf("Sample %u: %.2f (C)\n",
                    sample, temperature_c);
            }
            else {
                i2cErrorHandler(&i2cTransaction, display);
            }
    
            /* Sleep for 1 second */
            sleep(1);
        }
    
        I2C_close(i2c);
        printf("I2C closed!");
    
        return (NULL);
    }
    
    /*
     *  ======== i2cErrorHandler ========
     */
    static void i2cErrorHandler(I2C_Transaction *transaction,
        Display_Handle display)
    {
        switch (transaction->status) {
        case I2C_STATUS_TIMEOUT:
            printf("I2C transaction timed out!\n");
            break;
        case I2C_STATUS_CLOCK_TIMEOUT:
            printf("I2C serial clock line timed out!\n");
            break;
        case I2C_STATUS_ADDR_NACK:
            printf("I2C slave address 0x%x not"
                " acknowledged!\n", transaction->slaveAddress);
            break;
        case I2C_STATUS_DATA_NACK:
            printf("I2C data byte not acknowledged!\n");
            break;
        case I2C_STATUS_ARB_LOST:
            printf("I2C arbitration to another master!\n");
            break;
        case I2C_STATUS_INCOMPLETE:
            printf("I2C transaction returned before completion!\n");
            break;
        case I2C_STATUS_BUS_BUSY:
            printf("I2C bus is already in use!\n");
            break;
        case I2C_STATUS_CANCEL:
            printf("I2C transaction cancelled!\n");
            break;
        case I2C_STATUS_INVALID_TRANS:
            printf("I2C transaction invalid!\n");
            break;
        case I2C_STATUS_ERROR:
            printf("I2C generic error!\n");
            break;
        default:
            printf("I2C undefined error case!\n");
            break;
        }
    }
    

    谢谢。此致、

    Ajaykumar V.

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

    尊敬的  Ajaykumar:

    我想问题是你在使用 printf()

    如果您的程序使用 display_printf(),则代码工作正常

    相同的代码转换为使用显示模块:

    */
    /*
    *=========== i2ctmp.c =========
    */
    #include
    #include
    #include
    #include

    /*驱动程序头文件*/
    #include
    #include
    #include

    /*驱动程序配置*/
    #include "ti_drivers_config.h"

    第640章我是谁

    /*温度结果寄存器*/
    #define TMP006_Result_REG 0x0001
    #define TMP11X_RESULT_REG 0x0000

    /* I2C 从器件地址*/
    #define TMP006_LaunchPAD_ADDR 0x41
    #define TMP11X_BASSENSORS_ADDR 0x48
    #define TMP116_LaunchPAD_ADDR 0x49

    /*支持的传感器迭代次数*/
    #define TMP_COUNT 3.

    /*
    *包含当前支持的 I2C TMP 传感器的数据结构。
    *传感器按降序排列。
    */
    静态常量结构{
    uint8_t 地址;
    uint8_t resultReg;
    char *id;
    }传感器[TMP_COUNT]={
    { TMP11X_BASSENSORS_ADDR、TMP11X_RESULT_REG、"11X"}、
    { TMP116_LaunchPAD_ADDR、TMP11X_RESULT_REG、"116"}、
    {TMP006_LaunchPAD_ADDR、TMP006_RESULT_REG、"006"}
    };

    静态 uint8_t slaveAddress;
    静态 Display_Handle 显示;

    Static void i2cErrorHandler (I2C_Transaction * transaction、
    DISPLAY_Handle DISPLAY);

    /*
    *=========== 主线程=========
    */
    void *mainThread (void *arg0)

    uint16_t 采样;
    int16_t temperature_raw;
    浮动 temperature_c;
    uint8_t txBuffer[1];
    uint8_t rxBuffer[2];
    int8_t i;
    I2C_Handle i2c;
    I2C_Params i2cParams;
    I2C_Transaction i2cTransaction;

    /*调用驱动程序初始化函数*/
    display_init();
    GPIO_init ();
    I2C_init ();

    /*配置 LED 和 TMP_EN 引脚(如果适用)*/
    GPIO_setConfig (CONFIG_GPIO_LED_0、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);
    #ifdef CONFIG_GPIO_TMP_EN
    GPIO_setConfig (CONFIG_GPIO_TMP_EN、GPIO_CFG_OUT_STD | GPIO_CFG_OUT_HIGH);
    /*允许传感器开启*/
    睡眠(1);
    #endif

    /*打开 UART 显示屏以进行输出*/
    Display = Display_open (Display_Type_UART、NULL);
    如果(DISPLAY == NULL){
    while (1);
    }

    /*打开用户 LED */
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);
    display_printf (display、0、0、"starting the i2ctmp example\n");

    /*创建 I2C 以供使用*/
    I2C_Params_init (&i2cParams);
    i2cParams.bitrate = I2C_400kHz;
    I2C = I2C_OPEN (CONFIG_I2C_TMP、&i2cParams);
    if (i2c == NULL){
    Display_printf (DISPLAY、0、0、"Error Initializing I2C\n");
    while (1);
    }
    否则{
    display_printf (display、0、0、"I2C initialized!\n");
    }

    /*通用 I2C 事务设置*/
    i2cTransaction.writeBuf = txBuffer;
    i2cTransaction.writeCount = 1;
    i2cTransaction.readBuf = rxBuffer;
    i2cTransaction.ReadCount = 0;

    /*
    *通过查询已知 I2C 来确定存在哪些 I2C 传感器
    *从机地址。
    */
    对于(i = TMP_COUNT - 1;i >= 0;i --){
    i2cTransaction.slaveAddress = sensors[i].address;
    txBuffer[0]= sensors[i].resultReg;

    if (I2C_transfer (i2c、&i2cTransaction)){
    slaveAddress = sensors[i].address;
    display_printf (display、0、0、"Detected TMP%s sensor with slave (与受控器一起检测到的 TMP%s 传感器)"
    "地址0x%x\n"、sensors[i].id、sensors[i].address);
    }
    否则{
    i2cErrorHandler (&i2cTransaction、display);
    }
    }

    /*如果我们从未为我们分配过从器件地址*/
    如果(slaveAddress ==0){
    display_printf (display、0、0、"Failed to detect a sensor!");
    I2C_Close (i2c);
    while (1);
    }

    display_printf (display、0、0、"\n 使用最后一个已知传感器的样本。\n");
    i2cTransaction.slaveAddress = slaveAddress;

    /*获取20个样本并将其打印到控制台上*/
    i2cTransaction.ReadCount = 2;
    for (sample = 0;sample < 20;sample ++){
    if (I2C_transfer (i2c、&i2cTransaction)){
    /*
    *从收到的数据中提取 C 级;
    *参见 TMP 传感器数据表
    */
    //printf ("rxBuffer[0]:%#x,rxBuff[1]:%#x,",rxBuffer[0],rxBuffer[1]);
    temperature_raw =(rxBuffer[0]<< 8)|(rxBuffer[1]);
    // printf ("raw_temperature after zipping:%#X、"、temperature_raw);

    /*
    *如果 MSB 设置为"1"、则会得到二进制补码
    *需要带符号扩展的负值
    */
    if (rxBuffer[0]& 0x80){
    temperature_raw |= 0xF000;
    }
    /*将原始温度(整数)转换为物理温度(浮点)
    *根据 TMP006的数据表(SBOS518E–2011年5月–2015年4月修订)
    */
    temperature_c = temperature_raw * 0.0078125;

    Display_printf (DISPLAY、0、0、"样本%u:%.2f (C)\n"、
    样片、temperature_c);
    }
    否则{
    i2cErrorHandler (&i2cTransaction、display);
    }

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

    I2C_Close (i2c);
    display_printf (display、0、0、"I2C closed!");

    返回(NULL);
    }

    /*
    *=========== i2cErrorHandler =========
    */
    Static void i2cErrorHandler (I2C_Transaction * transaction、
    Display_Handle 显示)

    交换机(事务->状态){
    情形 I2C_STATUS_TIMEOUT:
    display_printf (display、0、0、"I2C 事务超时!\n");
    中断;
    情形 I2C_STATUS_Cock_TIMEOUT:
    Display_printf (DISPLAY、0、0、"I2C 串行时钟线路超时!\n");
    中断;
    案例 I2C_STATUS_ADDR_NACK:
    Display_printf (显示、0、0、"I2C 从器件地址0x%x 不"
    "已确认!\n"、事务-> slaveAddress);
    中断;
    案例 I2C_STATUS_DATA_NACK:
    Display_printf (DISPLAY、0、0、"I2C 数据字节未被确认!\n");
    中断;
    案例 I2C_STATUS_ARB_LOST:
    display_printf (display、0、0、"I2C arbitration to another master!\n");
    中断;
    案例 I2C_STATUS_INCOMPLETE:
    display_printf (display、0、0、"I2C transaction retured before completion!\n");
    中断;
    情形 I2C_STATUS_BUS_BUS_BUSY:
    display_printf (display、0、0、"I2C 总线已在使用中!\n");
    中断;
    案例 I2C_STATUS_CANCEL:
    Display_printf (DISPLAY、0、0、"I2C 事务已取消!\n");
    中断;
    案例 I2C_STATUS_INVALID_TRANS:
    display_printf (display、0、0、"I2C transaction invalid!\n");
    中断;
    案例 I2C_STATUS_ERROR:
    display_printf (display、0、0、"I2C generic error!\n");
    中断;
    默认值:
    display_printf (display、0、0、"I2C undefined error case!\n");
    中断;
    }
    }

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

    您好、Avi E:

    1. 您能解释一下您是如何检查的吗? 例如将高温物体放置在传感器附近或不将任何物体放置在传感器附近
    2. 您是否在 CCS 项目中进行了除 mainThread ()之外的任何更改?对.sysconf 文件进行更改是否可以为 NoRTOS 共享.sysconf 文件
    3. 是否有可能在控制台中以正确的值查看温度、而不是查看任何显示? 因为我没有使用任何具有显示屏的子板。  

    谢谢。此致、

    Ajaykumar V.

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

    1.是的,在传感器附近放置一个高温物体后,我得到一个温度的变化。( 26之前放置物体28之后)

    2.新的7.10 SDK 具有一个 noRTOS i2ctmp 示例,其中 SysConfig 中的所有内容都已进行设置

    3. display_print 方法设置为输出到终端。 (不是专门针对任何具有显示屏的子板)  

     i2ctmp nortos 项目您将看到.sysconf 中的显示方法有一个"use hardware"部分,其中该部分将设置为"XDS110 uart"。

    在这里、您可以连接一个终端(通过 tera Term 或 使用内置的 CCS 终端)

    此致、

    AVI

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

    您好、Avi E:

    新的7.10 SDK 具有 noRTOS i2ctmp 示例,其中 SysConfig 中的所有内容均已设置

    "CCS"的名称中没有用于复制仅.SysConfig GCC 编译器、IAR 编译器和 TI Clang 编译器的文件夹  

    在.sysconf 中显示方法有一个"使用硬件"部分,其中将设置为"XDS110 UART"。

    在这里、您可以连接终端

    [/报价]

    我在下面添加了缺失的部分。

    在构建和运行之后、我没有在 Putty 上得到任何打印语句

    谢谢。此致、

    Ajaykumar V.

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

    请尝试 COM7

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

    我不在办公室

    您能否提供使用 COM 7的指南以便我明天可以尝试一下。

    谢谢。此致、

    Ajaykumar V.

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

    嗨、

    我使用 tera-term、但 也应该使用 Putty。

    在中可以看到、器件管理器 XDS110应用程序设置为 com 7  

    确保:

    您可以选择串行终端、

    波特率  = 115200

    数据宽度= 8

    奇偶校验=无

    停止位= 1

    编码默认 ISO-8859-1

    此致、

    AVI

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

    您好、Avi E:

    供您参考:在全新的 7.10 SDK 中

    在名称"CCS"下没有用于复制仅.SysConfig GCC 编译器、IAR 编译器、TI Clang 编译器的文件夹 

    我尝试使用 COM 端口7、它不起作用。  

    我在 传感器附近没有高温物体时得到的输出(即、不是预期值的室温)  

    我仍然获得了如下所示的相同结果:

      

    我缺少任何东西吗?

    我使用的是 Code Composer Studio 版本:12.1.0.00007  

    谢谢。此致、

    Ajaykumar V.

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

    好的、现在打印到终端的操作正常、您可以在连接到 COM7的 Putty 输出中看到它。 您为我提供的代码在我的电路板上可以正常工作、开箱即用示例也可以正常工作。

    您是否进行了任何其他软件或硬件更改?

    此致、

    AVI E

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

    您好、Avi E:

    我尚未对硬件进行任何更改,因为在软件方面运行了开箱即用的示例代码温度输出如上所示(i.e,-2 (c)),

    之后、我尝试了修改后的代码、也输出了我得到的代码、范围是-2.** (c)至-3.**(c)(如果在 ESD 之后轻轻摇动实验板)、由于我的目的是测量室温、没有任何高温物体留在传感器附近。  

    谢谢。此致、

    Ajaykumar V.

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

    尊敬的  Ajaykumar:

    我已经 使用了您提供的代码 、并测试了开箱即用的示例、它们都能正常工作。 如果您有另一个板 ID 尝试、则可能是您遇到的传感器出现故障。  

    或者尝试其他  使用温度计 传感器的应用、如果可行、则会脸颊痛。

    希望这对您有所帮助。

    此致、

    AVI

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

    您好、Avi E:

    请尝试另一个  使用 tempter 传感器的应用程序,如果该应用程序有效,则搜索该应用程序。

    我曾尝试使用 BMA222E 传感器、得到了室温。 我还通过将高温物体放置在其工作的传感器附近进行了测试。

    感谢您的耐心。

    感谢您的快速响应和支持。

    谢谢。此致、

    Ajaykumar V.