1 /*
2  * Copyright (C) 2015-2021 Alibaba Group Holding Limited
3  */
4 
5 /**********************************CHT8305编程说明***************************************/
6 // CHT8305兼容I2C/SMBus通讯协议,操作简单,读取温湿度数据分三步操作:
7 // 1)主机向从机地址(有4种可选)发送读0x00寄存器指令,此操作将启动温湿度转换;
8 //    [指令结构:start+address(ack)+Reg(ack/unack)+stop]
9 // 2)等待转换完成(15ms);
10 // 3)主机读取从机数据————00:16bit温度数据;01:16bit湿度数据。两个寄存器数据可以一次性读取。
11 //    [指令结构:start+address(ack)+T高8位(ack)+T低8位(ack)+H高8位(ack)+H低8位(ack)+stop]
12 // 特别提醒:1)VCC上电时序要先于或等于I2C上电时序
13 //         2)从波形上看,每个bit的SDA上升沿和下降沿应充分包裹SCL的上升沿和下降沿
14 //         3) 建议CHT8305独享一个I2C总线,否则需要保证总线上每个star都对应一个stop;
15 //         4) 采用外部电阻上拉时,MCU的IO口应配置成开漏模式;
16 /****************************************************************************************/
17 
18 #include "drv_temp_humi_sensylink_cht8305.h"
19 #include "aos/kernel.h"
20 #include "ulog/ulog.h"
21 #include <math.h>
22 #include <stdlib.h>
23 
24 #define CHT8305_I2C_PORT 1
25 #define CHT8305_ADDRESS 0x40
26 
cht8305_init(void)27 void cht8305_init(void)
28 {
29     int32_t ret = sensor_i2c_open(CHT8305_I2C_PORT, CHT8305_ADDRESS, I2C_BUS_BIT_RATES_400K, 0);
30     if (ret) {
31         printf("sensor i2c open failed, ret:%d\n", ret);
32         return;
33     }
34 
35 }
36 // get temp and humidity
cht8305_getTempHumidity(float * humidity,float * temperature)37 void cht8305_getTempHumidity(float *humidity, float *temperature)
38 {
39     char reg = 0;
40     uint8_t buf[4] = {0};
41     unsigned int cht8305_temp = 0;
42     unsigned int cht8305_humi = 0;
43 
44     sensor_i2c_master_send(CHT8305_I2C_PORT, CHT8305_ADDRESS, &reg, 1, 1000);
45     aos_msleep(30);
46     sensor_i2c_master_recv(CHT8305_I2C_PORT, CHT8305_ADDRESS, buf, 4, 1000);
47     // printf("%d-%d-%d-%d\n",buf[0],buf[1],buf[2],buf[3]);
48 
49     cht8305_temp = (buf[0] << 8) + buf[1];
50     if (cht8305_temp & 0xFFFC) {
51         // *temperature = (175.72f * (float)value) / 65536.0f - 46.85f;
52         *temperature = (165.0f * (float)cht8305_temp) / 65536.0f - 40.0f;
53         LOGD("SENDOR", "temperature: %2f\n", *temperature);
54     } else {
55         LOGE("SENDOR", "Error on temp\n");
56         return 1;
57     }
58 
59     cht8305_humi = (buf[2] << 8) + buf[3];
60     if (cht8305_humi & 0xFFFE) {
61         // *humidity = (((float)cht8305_humi) / 65535.0f);
62         *humidity = ((125.0f * (float)cht8305_humi) / 65535.0f) - 6.0f;
63         LOGD("SENDOR", "humidity: %f\n", *humidity);
64     } else {
65         LOGE("SENDOR", "Error on humidity\n");
66         return 1;
67     }
68 }
69 
cht8305_deinit(void)70 void cht8305_deinit(void)
71 {
72     int32_t ret = sensor_i2c_close(CHT8305_I2C_PORT);
73     if (ret) {
74         LOGE("SENSOR", "sensor i2c close failed, ret:%d\n", ret);
75     }
76 
77     return;
78 }
79