目录
dht11模块是一个能检测温湿度的传感器,采用单总线的通信方式传输数据。
1. 开发准备
1.1 硬件资源
- 野火iMX.6ULL PRO开发板
- dht11模块
2. 相关代码
2.1 驱动代码(dht11_drv.c)
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <linux/major.h>
#include <linux/mutex.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/stat.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/tty.h>
#include <linux/kmod.h>
#include <linux/gfp.h>
#include <asm/mach/map.h>
#include <linux/platform_device.h>
#include <asm/io.h>
#include <linux/mod_devicetable.h>
#include <linux/gpio.h>
#include <linux/delay.h>
#include <linux/timekeeping.h>
static struct cdev dht11_cdev;
static struct class *dht11_class;
struct gpio_desc * dht11_gpio_desc;
static int major;
static unsigned char g_us[40];
static void dht11_reset(void)
{
gpiod_direction_output(dht11_gpio_desc, 1);
}
// 注意!!!!!!
static void dht11_start(void)
{
// 不能使用GPIOD_OUT_HIGH,有问题,字节用0,1
mdelay(30);
gpiod_set_value(dht11_gpio_desc, 0);
mdelay(20);
gpiod_set_value(dht11_gpio_desc, 1);
udelay(40);
gpiod_direction_input(dht11_gpio_desc);
udelay(2);
}
static int dht11_wait_ready(void)
{
int timeout_us = 20000;
/* 等待低电平 */
timeout_us = 200;
while(gpiod_get_value(dht11_gpio_desc) && --timeout_us) {
udelay(1);
}
// 超时
if (!timeout_us) {
printk("----debug1-----\n");
return -1;
}
/* 等待高电平 */
timeout_us = 200;
while(!gpiod_get_value(dht11_gpio_desc) && --timeout_us) {
udelay(1