Use IIC Reading data from the temperature and humidity sensor, The read data is abnormal, The temperature and humidity value is not correct.
Follow the sensor manual provided by your company:
Read data, Logic analyzer display, IIC The transmission is fine.
Write in 0x00:
delay 20ms:
read 0x00 Register data:
The code is as follows:
The data read from the register is all wrong. . . . . After the conversion, this is the data, wrong:
I got a new drive, The board itself is heating up, Perhaps the hardware accuracy itself is not very good.
/*****************************************************************************
*
* File Name : main. c
*
* Description: main
*
* Copyright (c) 2014 Winner Micro Electronic Design Co. , Ltd.
* All rights reserved.
*
* Author : dave
*
* Date : 2014-6-14
*****************************************************************************/
#include "wm_include. h"
#include "wm_i2c. h"
#include "stdio. h"
#include "wm_gpio_afsel. h"
#define I2C_FREQ (5000)
#define I2C_ADDR (0x80)
u8 buf[4];
void cht8305_iic_init (void)
{
wm_i2c_scl_config (WM_IO_PA_01) ;
wm_i2c_sda_config (WM_IO_PA_04) ;
tls_i2c_init (I2C_FREQ) ;
}
void cht8305_read_reg (u8 reg_addr, u8 len)
{
tls_i2c_write_byte (I2C_ADDR, 1) ;
tls_i2c_wait_ack () ;
tls_i2c_write_byte (reg_addr, 0) ;
tls_i2c_wait_ack () ;
if (reg_addr == 0x00 || reg_addr == 0x01)
{
tls_os_time_delay (5) ; // 10ms delay
}
tls_i2c_write_byte (I2C_ADDR|0x01, 1) ;
for (int i = 0; i " len-1; i++) {
buf[i] = tls_i2c_read_byte (1, 0) ;
}
buf[len - 1] = tls_i2c_read_byte (0, 1) ; //Give NACK
}
void cht8305_get_temp_humi (float *t, float *h)
{
cht8305_read_reg (0x00, 4) ;
unsigned int th, tl, hh, hl;
th = buf[0];
tl = buf[1];
hh = buf[2];
hl = buf[3];
(*t) = (th " " 8 | tl) * 165. 0 / 65535. 0 - 40. 0;
(*h) = (hh " " 8 | hl) * 100. 0 / 65535. 0;
}
void UserMain (void)
{
printf ("\n user task \n") ;
cht8305_iic_init () ;
float ct8305_temp ;
float ct8305_humi;
while (1)
{
cht8305_get_temp_humi (&ct8305_temp, &ct8305_humi) ;
printf ("upload_hygrotherm ct8305_temp %f, ct8305_humi %f\r\n", ct8305_temp, ct8305_humi) ;
tls_os_time_delay (100) ; // delay 200ms
}
#if DEMO_CONSOLE
CreateDemoTask () ;
#endif
//user-owned task
}