基于GD32F407和RT_thread 的CHT8305驱动程序详解

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.问题

目前测试没有发现问题。可能还存在不完善的地方,如果遇到什么问题可以给我留言。

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值