использова IIC Считывая данные с сенсоров температуры влажности, Это аномалия данных, Не совсем верное значение тепловлажности.
В соответствии с инструкцией по сенсорам, предоставленной вашей компанией:
Считывание данных, Логический анализатор показал это, IIC Передача в порядке.
в 0x00:
задержк 20ms:
чтен 0x00 Данные в регистре:
Код следующий:
Данные из регистра неверны. . . . . После трансформации вот такие данные, неправильн:
У меня новый водитель, У доски тоже есть проблемы с отоплением, Возможно, сама по себе точность оборудования не очень хорошая.
/*****************************************************************************
*
* 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
//Собственный пользователь task
}