1.概述
本文主要介绍了基于GD32F407和Rtthread编写的CHT8305驱动程序,读取温湿度数据。
2.ENV程序编写
menuconfig BSP_USING_CHT8305
bool "Enable CHT8305"
default n
select BSP_USING_I2C
if BSP_USING_CHT8305
config BSP_USING_CHT8305_0
bool "Using CHT8305_0"
default y
if BSP_USING_CHT8305_0
config CHT8305_BUS_NAME0
string "cht8305_0 bus name"
default "si2c2"
config CHT8305_DEVICE_NAME0
string "cht8305_0 device name"
default "c8305_0"
endif
endif
3.ENV配置
1打开ENV
2使能CHT8305
3选择要配置的CHT8305,填写通信接口和设备名称
4配置完成后rtconfig.h中就自动定义了, 如下所示。
#define BSP_USING_CHT8305
#define BSP_USING_CHT8305_0
#define CHT8305_BUS_NAME0 "si2c2"
#define CHT8305_DEVICE_NAME0 "c8305_0"
4.CHT8305驱动的头文件drv_cht8305.h
#ifndef __DRV_CHT8305_H__
#define __DRV_CHT8305_H__
#include <rtdevice.h>
#define CHT8305_ADDR_GND 0x40 //ADDR接地,芯片1地址
#define CHT8305_ADDR_VDD 0x44 //ADDR接VDD,芯片2地址
#define CHT8305_ADDR_SDA 0x48 //ADDR接SDA
#define CHT8305_ADDR_SCL 0x4C //ADDR接SCL
#define CHT8305_Tem_ADDR 0x00 //温度数据地址
#define CHT8305_Hum_ADDR 0x01 //湿度数据地址
#define CHT8305_Config_ADDR 0x02 //配置寄存器地址
/** CHT8305设备结构体 */
struct cht8305_device
{
struct rt_device parent;
struct rt_i2c_bus_device *bus;
};
/** CHT8305设备用户操作配置结构图 */
struct cht8305_config
{
rt_uint16_t addr; //设备地址 CHT8305_ADDR
rt_uint16_t flags; //I2C操作标志
const char *bus_name;
const char *dev_name;
};
#ifdef BSP_USING_CHT8305_0
#define CHT8305_0_DEVICE_CONFIG \
{ \
.addr = CHT8305_ADDR_GND, \
.flags = 0, \
.bus_name = CHT8305_BUS_NAME0, \
.dev_name = CHT8305_DEVICE_NAME0, \
}
#endif
#ifdef BSP_USING_CHT8305_1
#define CHT8305_1_DEVICE_CONFIG \
{ \
.addr = CHT8305_ADDR_VDD, \
.flags = 0, \
.bus_name = CHT8305_BUS_NAME1, \
.dev_name = CHT8305_DEVICE_NAME1, \
}
#endif
#ifdef BSP_USING_CHT8305_2
#define CHT8305_2_DEVICE_CONFIG \
{ \
.addr = CHT8305_ADDR_GND, \
.flags = 0, \
.bus_name = CHT8305_BUS_NAME2, \
.dev_name = CHT8305_DEVICE_NAME2, \
}
#endif
#ifdef BSP_USING_CHT8305_3
#define CHT8305_3_DEVICE_CONFIG \
{ \
.addr = CHT8305_ADDR_VDD, \
.flags = 0, \
.bus_name = CHT8305_BUS_NAME3, \
.dev_name = CHT8305_DEVICE_NAME3, \
}
#endif
extern rt_err_t CHT8305_register(rt_int8_t number,const char *device_name, const char *i2c_bus, void *user_data);
#endif
5.CHT8305驱动代码drv_cht8305.c
代码可以从文章绑定的资源处下载。
6.使用方法
#ifdef BSP_USING_CHT8305
rt_uint32_t CHT8305_Read (rt_device_t dev)// 读取采集值
{
rt_uint8_t buffer[4]={0};
rt_uint32_t data=0;
rt_device_write(dev,CHT8305_Tem_ADDR,RT_NULL,1);//写温度寄存器地址
rt_thread_mdelay(20);
rt_device_read(dev,RT_NULL,&buffer,4);//读数据
data = ((rt_uint32_t)buffer[0]<<24)+((rt_uint32_t)buffer[1]<<16)+((rt_uint32_t)buffer[2]<<8)+buffer[3];
return data;
}
static int init_cht8305cdnr(void)
{
#ifdef BSP_USING_SGM58031_0
/*打开cht8305_0*/
cht8305_0 = rt_device_find(CHT8305_DEVICE_NAME0);
if (cht8305_0 == RT_NULL)
{
rt_kprintf("can't find %s device!\n", CHT8305_DEVICE_NAME0);
return RT_ERROR ;
}
else
{
rt_device_open(cht8305_0, RT_DEVICE_FLAG_RDWR);
return RT_EOK;
}
#endif
}INIT_APP_EXPORT(init_cht8305cdnr);
#endif
7.问题
目前测试没有发现问题。可能还存在不完善的地方,如果遇到什么问题可以给我留言。