社区导航

 

搜索
查看: 3102|回复: 10

[原创] TI 狂欢+CC2640R2通过HDC1080测量温度

[复制链接]

6376

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

发表于 2017-11-15 12:13 | 显示全部楼层 |阅读模式
CC2640R2LP通过HDC1080测量温度

QQ图片20171115115753.png

  1. void *mainThread(void *arg0)
  2. {
  3.     unsigned int    i;
  4.     uint16_t        temperature;
  5.     uint8_t         txBuffer[10];
  6.     uint8_t         rxBuffer[10];
  7.     I2C_Handle      i2c;
  8.     I2C_Params      i2cParams;
  9.     I2C_Transaction i2cTransaction;

  10.     /* Call driver init functions */
  11.     Display_init();
  12.     GPIO_init();
  13.     I2C_init();

  14.     /* Open the HOST display for output */
  15.     display = Display_open(Display_Type_UART, NULL);
  16.     if (display == NULL) {
  17.         while (1);
  18.     }

  19.     /* Turn on user LED */
  20.     GPIO_write(Board_GPIO_LED0, Board_GPIO_LED_ON);
  21.     Display_printf(display, 0, 0, "Starting the i2ctmp007 example\n");

  22.     /* Create I2C for usage */
  23.     I2C_Params_init(&i2cParams);
  24.     i2cParams.bitRate = I2C_100kHz;
  25.     i2c = I2C_open(Board_I2C0, &i2cParams);
  26.     if (i2c == NULL) {
  27.         Display_printf(display, 0, 0, "Error Initializing I2C\n");
  28.         while (1);
  29.     }
  30.     else {
  31.         Display_printf(display, 0, 0, "I2C Initialized!\n");
  32.     }


  33.     /* Point to the T ambient register and read its 2 bytes */
  34.     i2cTransaction.slaveAddress = HDC1080_SLAVE_ADDR;
  35.     i2cTransaction.writeBuf = txBuffer;
  36.     i2cTransaction.readBuf = rxBuffer;

  37.     //初始化HDC1080
  38.     txBuffer[0] = CONFIGURATION;
  39.     txBuffer[1] = 0x90;                 //BIT 15 ~ 8,RST = 1(Software Reset_,MODE = 1(Temperature and Humidity are acquired in sequence, Temperature first.)
  40.     txBuffer[2] = 0x00;                 //BIT 7  ~ 0;
  41.     i2cTransaction.writeCount = 3;
  42.     i2cTransaction.readCount = 0;
  43.     I2C_transfer(i2c, &i2cTransaction);

  44.     //读取DEVICE_ID
  45.     txBuffer[0] = DEVICE_ID;
  46.     i2cTransaction.writeCount = 1;
  47.     i2cTransaction.readCount = 2;
  48.     I2C_transfer(i2c, &i2cTransaction);
  49.     Display_printf(display, 0, 0, "DeviceId is:0x%x%x\r\n",rxBuffer[0],rxBuffer[1]);

  50.     while (1) {
  51.         //发送地址
  52.         txBuffer[0] =  TEMPERATURE;
  53.         i2cTransaction.writeCount = 1;
  54.         i2cTransaction.readCount = 0;
  55.         I2C_transfer(i2c, &i2cTransaction);

  56.         sleep(3);
  57.         //读温湿度
  58.         i2cTransaction.writeCount = 0;
  59.         i2cTransaction.readCount = 4;
  60.         if (I2C_transfer(i2c, &i2cTransaction)) {

  61.             //Combine the two bytes to make one 16 bit int
  62.             uint16_t temp = (((unsigned int)rxBuffer[0] <<8 | rxBuffer[1]));

  63.             //Temp(C) = reading/(2^16)*165(C) - 40(C)
  64.             float temperature = (double)(temp)/(65536.00)*165.00-40;

  65.            //Combine the two bytes to make one 16 bit int
  66.             float humidity = (((unsigned int)rxBuffer[2] <<8 | rxBuffer[3]));

  67.             //Humidity(%) = reading/(2^16)*100%
  68.             humidity =  (double)(humidity)/(65536.00)*100;
  69.             Display_printf(display, 0, 0, "temperature:%.2f\thumidity:%.2f\r\n", temperature,humidity);
  70.         }
  71.         else {
  72.             Display_printf(display, 0, 0, "I2C Bus fault\n");
  73.         }

  74.         sleep(1);
  75.     }

  76.     /* Deinitialized I2C */
  77.     I2C_close(i2c);
  78.     Display_printf(display, 0, 0, "I2C closed!\n");

  79.     return (NULL);
  80. }
复制代码


HDC1080_CC2640R2_LAUNCHXL_tirtos_ccs.rar (639.19 KB, 下载次数: 33)
虾扯蛋


回复

使用道具 举报

22

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2017-12-1 14:20 | 显示全部楼层
我司专注蓝牙,WIFI,zigbee无线射频技术,TI,博通等欧美品牌射频芯片价格优势,模组性能稳定,也可以提供完善技术支持服务,详情可联系 13828711210.QQ 2638434590


回复

使用道具 举报

1

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2019-1-30 16:48 | 显示全部楼层
版主,看你测得的数据挺好的,为什么我测试HDC1080温度和湿度寄存器值是一样的?主函数:
void main(void)
{
  CLK_Config();   
  GPIO_Init(GPIOD, GPIO_Pin_0, GPIO_Mode_Out_PP_High_Slow);

  HDC1080_Init();

  enableInterrupts();

  while (1)
  {
    Delay_ms(1000);
    GPIO_ToggleBits(GPIOD,GPIO_Pin_0);
    testdata[0] = HDC1080_Read_DeviceID();
    testdata[1] = HDC1080_Read_ManufacturerID();   
    testdata[3] = HDC1080_Read_Temper();
    testdata[2] = HDC1080_Read_Humidi();
    //testdata[4] = HDC1080_Read_Conf();
  }
}


下面是我的HDC1080驱动程序:

/*********************************************************************************
@file       HDC1080.c
@brief      Humidity and Temperature sensor 驱动模块
@details    I2C接口
@details    Copyright 2016, Testo, Ltd., Shenzhen
@author     pli
@date       2016.02.16
@version    00.00


编译条件:

芯片型号..-   MSP430i2041

编译器版本-   IAR for ARM - Ver6.4

优化级别..-   High balanced


修改记录:



初版00.00
*******************************************************************************/
//#include
//#include "io430.h"
//#include "main.h"
#include "HDC1080.h"
#include "I2C.h"
#include "timing_delay.h"
//#include
/*******************************************************************************
  * @brief  HDC1080_Write_Buffer
  * @param  uint8_t addr is point register
  * @param  uint8_t *buffer is the need to write data point
  * @param  uint8_t len is the write data length
  * @retval void
*******************************************************************************/
void HDC1080_Write_Buffer(uint8_t addr, uint8_t *buffer, uint8_t len)
{
    I2C_Start();
    I2C_Send_Byte(HDC1080_Device_Adderss);
    I2C_Wait_Ack();
    I2C_Send_Byte(addr);
    I2C_Wait_Ack();
    while ( len-- )
    {
            I2C_Send_Byte(*buffer);
            I2C_Wait_Ack();
            buffer++;
    }
    I2C_Stop();
}
/*******************************************************************************
  * @brief  HDC1080_Read_Buffer between triger and read there is no wait.
  * @param  uint8_t addr is point register
  * @param  uint8_t *buffer is the need to read data point
  * @param  uint8_t len is the read data length
  * @retval void
*******************************************************************************/
void HDC1080_Read_Buffer(uint8_t addr, uint8_t *buffer, uint8_t len)
{
    uint8_t temp = 0;
       
    I2C_Start();
    I2C_Send_Byte(HDC1080_Device_Adderss);

    I2C_Wait_Ack();
    I2C_Send_Byte(addr);
    I2C_Wait_Ack();
    I2C_Stop();

    while( pin_SCL_READ())
    {
        Delay_us(1);
        temp++;
        if ( temp >= 100 )
        {
            break;
        }
    }
    I2C_Start();
    I2C_Send_Byte(HDC1080_Device_Adderss|0x01);    //read
    I2C_Wait_Ack();
    while ( len-- )
    {
            *buffer = I2C_Recv_Byte();
            buffer++;
            if ( len == 0 )
                I2C_Send_NoAck();
            else
            I2C_Send_Ack();          
           
    }
    I2C_Stop();
}
/*******************************************************************************
  * @brief  HDC1080_Read_MBuffer becareful between triger and read there is a wait.
  * @param  uint8_t addr is point register
  * @param  uint8_t *buffer is the need to read data point
  * @param  uint8_t len is the read data length
  * @retval void
*******************************************************************************/
void HDC1080_Read_MBuffer(uint8_t addr, uint8_t *buffer, uint8_t len)
{
    uint8_t temp = 0;
       
    I2C_Start();
    I2C_Send_Byte(HDC1080_Device_Adderss);

    I2C_Wait_Ack();
    I2C_Send_Byte(0X00);
    I2C_Wait_Ack();
    I2C_Stop();

    while( pin_SCL_READ())
    {
        Delay_us(1);
        temp++;
        if ( temp >= 100 )
        {
            break;
        }
    }
    //Delay_ms(10);      // after triger should wait at least 6.5ms
    Delay_ms(10);      // after triger should wait at least 6.5ms
    I2C_Start();
    I2C_Send_Byte(HDC1080_Device_Adderss|0x01);    //read
    I2C_Wait_Ack();
    while ( len-- )
    {
            *buffer = I2C_Recv_Byte();
            buffer++;
            if ( len == 0 )
                I2C_Send_NoAck();
            else
            I2C_Send_Ack();          
           
    }
    I2C_Stop();
}
/*******************************************************************************
  * @brief  HDC1080_Soft_Reset
  * @param  void
  * @retval void
*******************************************************************************/
void HDC1080_Soft_Reset(void)
{
    uint8_t temp[2];
    temp[0] = 0x80;
    temp[1] = 0x00;
    HDC1080_Write_Buffer(HDC1080_Read_Config, temp, 2);
    Delay_ms(20);//there should be waiting for more than 15 ms.
}
/*******************************************************************************
  * @brief  HDC1080_Setting
  * @param  void
  * @retval void
*******************************************************************************/
void HDC1080_Setting(void)
{
    uint16_t tempcom = 0;
    uint8_t temp[2];
       
    tempcom |= 1<
    // 温度与温度都为14bit
    temp[0] = (uint8_t)(tempcom >> 8);
    temp[1] = (uint8_t)tempcom;
    HDC1080_Write_Buffer(0x02, temp, 2);
}
/*******************************************************************************
  * @brief  HDC1080_Init
  * @param  void
  * @retval void
*******************************************************************************/
void HDC1080_Init(void)
{
    //uint8_t temp = 0;
    I2C_Init();
    HDC1080_Soft_Reset();
    HDC1080_Setting();
    /*
    while( pin_SCL_READ() )
    {
        Delay_us(1);;
        temp++;
        if ( temp >= 100 )
        {
            break;
        }
    }*/
}
/*******************************************************************************
  * @brief  HDC1080_Read_Temper
  * @param  void
  * @retval int16_t tempr value
*******************************************************************************/
int16_t HDC1080_Read_Temper(void)
{
    uint8_t buffer[2];

    HDC1080_Read_MBuffer(0x00, buffer, 2);
    return ((buffer[0]<<8)|buffer[1]);
    //return (int16_t)(((((buffer[0]<<8)|buffer[1])/65536.0)*165-40)*100);
}
/*******************************************************************************
  * @brief  HDC1080_Read_Humidity
  * @param  void
  * @retval int16_t Humidity value
*******************************************************************************/
uint16_t HDC1080_Read_Humidi(void)
{
    uint8_t buffer[2];
       
    HDC1080_Read_MBuffer(HDC1080_Read_Humidity, buffer, 2);

    return (buffer[0]<<8)|buffer[1];
    //return (int16_t)((((buffer[0]<<8)|buffer[1])/65536.0)*10000);
}
/*******************************************************************************
  * @brief  HDC1080_Read_Configuration
  * @param  void
  * @retval Config value
*******************************************************************************/
uint16_t HDC1080_Read_Conf(void)
{
    uint8_t buffer[2];
       
    HDC1080_Read_Buffer(HDC1080_Read_Config, buffer, 2);

    return ((buffer[0]<<8)|buffer[1]);
}
/*******************************************************************************
  * @brief  HDC1080_Read_ManufacturerID
  * @param  void
  * @retval ManufacturerID
*******************************************************************************/
uint16_t HDC1080_Read_ManufacturerID(void)
{
    uint8_t buffer[2];
       
    HDC1080_Read_Buffer(0xfe, buffer, 2);

    return ((buffer[0]<<8)|buffer[1]);
}
/*******************************************************************************
  * @brief  HDC1080_Read_DeviceID
  * @param  void
  * @retval DeviceID
*******************************************************************************/
uint16_t HDC1080_Read_DeviceID(void)
{
    uint8_t buffer[2];
       
    HDC1080_Read_Buffer(0xff, buffer, 2);

    return ((buffer[0]<<8)|buffer[1]);
}

uint16_t testcntA,testcntB;
//--------------------------------------26us
void Delay_us(uint16_t xcnum)
{   
  for(testcntA=0;testcntA   {
    for(testcntB=0;testcntB<40;testcntB++)
    {
      nop();
    }
  }
}
//--------------------------------------1ms
void Delay_ms(uint16_t xcnum)
{
  for(testcntA=0;testcntA   {
    for(testcntB=0;testcntB<1580;testcntB++)
    {
      nop();
    }
  }
}



点评

用我的代码试没?  详情 回复 发表于 2019-1-30 17:12


回复

使用道具 举报

6376

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-1-30 17:12 来自手机 | 显示全部楼层
499549794 发表于 2019-1-30 16:48
版主,看你测得的数据挺好的,为什么我测试HDC1080温度和湿度寄存器值是一样的?主函数:
void main(void) ...

用我的代码试没?


回复

使用道具 举报

1434

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2019-1-31 10:45 | 显示全部楼层
楼主提供的代码真心不错,谢谢分享啊。


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-5-14 16:23 | 显示全部楼层
txBuffer[0] =  TEMPERATURE;         i2cTransaction.writeCount = 1;         i2cTransaction.readCount = 0;         I2C_transfer(i2c, &i2cTransaction);这一段是读温度吗?注释太少了,楼主有没有HAl库版本的?


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-5-14 16:34 | 显示全部楼层
楼主,直接配置0x02寄存器,然后就开始读数据,可以读出来吗?读了一天都是没有数据出来

点评

是用我上传的原码吗?  详情 回复 发表于 2019-5-14 17:39


回复

使用道具 举报

6376

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-5-14 17:39 | 显示全部楼层
希求233 发表于 2019-5-14 16:34
楼主,直接配置0x02寄存器,然后就开始读数据,可以读出来吗?读了一天都是没有数据出来

是用我上传的原码吗?
虾扯蛋


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-5-15 10:05 | 显示全部楼层
不是,我用的是HAL库STM32单片机。 无标题.png


回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-5-15 10:06 | 显示全部楼层
现在可以读出0xFE,0xFF了,但是读不出温湿度数据,一直是0

点评

HDC1080好像分为同步读取和异步读取 同步读取在发送完指令后要延时一段时间等待转换完成再读取 void hdc1018_read(float *temp,float *hum) { uint8_t data[4]; uint16_t _temp,_hum; i2c_read_n_byte  详情 回复 发表于 2019-5-15 20:37


回复

使用道具 举报

6376

TA的帖子

10

TA的资源

版主

Rank: 6Rank: 6

 楼主| 发表于 2019-5-15 20:37 | 显示全部楼层
希求233 发表于 2019-5-15 10:06
现在可以读出0xFE,0xFF了,但是读不出温湿度数据,一直是0

HDC1080好像分为同步读取和异步读取
同步读取在发送完指令后要延时一段时间等待转换完成再读取
void hdc1018_read(float *temp,float *hum)
{  
  uint8_t data[4];
  uint16_t _temp,_hum;
  i2c_read_n_byte_waitMs((0x40 << 1),0x00,data,4,1000);
  _temp   = ((((uint16_t)data[0]) << 8U) & 0xff00) + (((uint16_t)data[1]) & 0x00ff);
  _hum   = ((((uint16_t)data[2]) << 8U) & 0xff00) + (((uint16_t)data[3]) & 0x00ff);
  
  *temp = (((float)(((uint32_t)_temp) * 165))/65536) - 40;
  *hum    = ((float)_hum)*100/65536;
}
虾扯蛋


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-9-18 22:24 , Processed in 0.330089 second(s), 18 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表