基于Tiny6410的ds18b20驱动

发布者:心有所属最新更新时间:2024-09-27 来源: cnblogs关键字:Tiny6410  ds18b20驱动 手机看文章 扫描二维码
随时随地手机看文章

从网站上下载了lixin的mini2410的ds18b20代码,并做了修改,成功实现了Tiny6410的ds18b20驱动。


【程序清单】


ds18b20.c


/******************************************Copyright(c)************************************************

** 文件名称: ds18b20_drv.c

** 作    者: lixin

** 版    本: v1.0

** 说    明: ds18b20驱动程序.工作过程及时序见ds18b20 datasheet

** 修改记录: 2009-8-27创建

** 最后修改时间: 2009-09-01

******************************************************************************************************/

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include


#include 's3c6410_gpio.h'


//#define DEBUG

/* 相关引脚定义,方便以后移植 */

#define DEVICE_NAME 'ds18b20'

#define DQ         8

#define CFG_IN     0

#define CFG_OUT    1


// ds18b20主次设备号(动态分配)

int ds18b20_major = 0;

int ds18b20_minor = 0;

int ds18b20_nr_devs = 1;


// 定义设备类型

static struct ds18b20_device {

    struct cdev cdev;

};

struct ds18b20_device ds18b20_dev;


static struct class *ds18b20_class;


/* 函数声明 */

static int ds18b20_open(struct inode *inode, struct file *filp);

static int ds18b20_init(void);

static void write_byte(unsigned char data);

static unsigned char read_byte(void);

static ssize_t ds18b20_read(struct file *filp, char __user *buf,

                            size_t count, loff_t *f_pos);

void ds18b20_setup_cdev(struct ds18b20_device *dev, int index);


/******************************************************************************************************

** 函数名称: ds18b20_open()

** 函数功能: 打开设备,初始化ds18b20

** 入口参数: inode:设备文件信息; filp: 被打开的文件的信息

** 出口参数: 成功时返回0,失败返回-1

** 备    注:

******************************************************************************************************/

static int ds18b20_open(struct inode *inode, struct file *filp)

{

    int flag = 0;

    /*struct ds18b20_device *dev;

    dev = container_of(inode->i_cdev, struct ds18b20_device, cdev);

    filp->private_data = dev;*/


    flag = ds18b20_init();

    if(flag & 0x01)

    {

#ifdef DEBUG

        printk(KERN_WARNING 'open ds18b20 failedn');

#endif

return -1;

    }

#ifdef DEBUG

    printk(KERN_NOTICE 'open ds18b20 successfuln');

#endif

    return 0;

}


/******************************************************************************************************

** 函数名称: ds18b20_init()

** 函数功能: 复位ds18b20

** 入口参数: 无

** 出口参数: retval:成功返回0,失败返回1

** 备    注: 操作时序见ds18b20 datasheet

******************************************************************************************************/

static int ds18b20_init(void)

{

    int retval = 0;


    s3c6410_gpio_cfgpin(DQ, CFG_OUT);

    s3c6410_gpio_pullup(DQ, 0);


    s3c6410_gpio_setpin(DQ, 1);

    udelay(2);

    s3c6410_gpio_setpin(DQ, 0);        // 拉低ds18b20总线,复位ds18b20

    udelay(500);                       // 保持复位电平500us


    s3c6410_gpio_setpin(DQ, 1);        // 释放ds18b20总线

    udelay(60);


    // 若复位成功,ds18b20发出存在脉冲(低电平,持续60~240us)

    s3c6410_gpio_cfgpin(DQ, CFG_IN);

    retval = s3c6410_gpio_getpin(DQ);


    udelay(500);

    s3c6410_gpio_cfgpin(DQ, CFG_OUT);

    s3c6410_gpio_pullup(DQ, 0);

    s3c6410_gpio_setpin(DQ, 1);        // 释放总线

    

    return retval;

}


/******************************************************************************************************

** 函数名称: write_byte()

** 函数功能: 向18b20写入一个字节数据

** 入口参数: data

** 出口参数: 无

** 备    注:

******************************************************************************************************/

static void write_byte(unsigned char data)

{

    int i = 0;


    s3c6410_gpio_cfgpin(DQ, CFG_OUT);

    s3c6410_gpio_pullup(DQ, 1);


    for (i = 0; i < 8; i ++)

    {

        // 总线从高拉至低电平时,就产生写时隙

        s3c6410_gpio_setpin(DQ, 1);

        udelay(2);

        s3c6410_gpio_setpin(DQ, 0);

        s3c6410_gpio_setpin(DQ, data & 0x01);

        udelay(60);

data >>= 1;

    }

    s3c6410_gpio_setpin(DQ, 1);        // 重新释放ds18b20总线

}


/******************************************************************************************************

** 函数名称: read_byte()

** 函数功能: 从ds18b20读出一个字节数据

** 入口参数: 无

** 出口参数: 读出的数据

** 备    注:

******************************************************************************************************/

static unsigned char read_byte(void)

{

    int i;

    unsigned char data = 0;


    for (i = 0; i < 8; i++)

    {

        // 总线从高拉至低,只需维持低电平17ts,再把总线拉高,就产生读时隙

        s3c6410_gpio_cfgpin(DQ, CFG_OUT);

        s3c6410_gpio_pullup(DQ, 0);

        s3c6410_gpio_setpin(DQ, 1);

        udelay(2);

        s3c6410_gpio_setpin(DQ, 0);

        udelay(2);

s3c6410_gpio_setpin(DQ, 1);

        udelay(8);

        data >>= 1;

s3c6410_gpio_cfgpin(DQ, CFG_IN);

if (s3c6410_gpio_getpin(DQ))

    data |= 0x80;

udelay(50);

    }

    s3c6410_gpio_cfgpin(DQ, CFG_OUT);

    s3c6410_gpio_pullup(DQ, 0);

    s3c6410_gpio_setpin(DQ, 1);        // 释放ds18b20总线

    return data;

}

/******************************************************************************************************

** 函数名称: ds18b20_read()

** 函数功能: 读出18b20的温度

** 入口参数: 

** 出口参数: 

** 备    注:

******************************************************************************************************/

static ssize_t ds18b20_read(struct file *filp, char __user *buf,

                            size_t count, loff_t *f_pos)

{

    int flag;

    unsigned long err;

    unsigned char result[2] = {0x00, 0x00};

    //struct ds18b20_device *dev = filp->private_data;


    flag = ds18b20_init();

    if (flag)

    {

#ifdef DEBUG

        printk(KERN_WARNING 'ds18b20 init failedn');

#endif

        return -1;

    }

    

    write_byte(0xcc);

    write_byte(0x44);


    flag = ds18b20_init();

    if (flag)

        return -1;


    write_byte(0xcc);

    write_byte(0xbe);


    result[0] = read_byte();    // 温度低八位

    result[1] = read_byte();    // 温度高八位

    

    err = copy_to_user(buf, &result, sizeof(result));

    return err ? -EFAULT : min(sizeof(result),count);

}


/**************************************************************

 * 字符驱动程序的核心,应用程序所调用的open,read等函数最终会

 * 调用这个结构中的对应函数

 *************************************************************/

static struct file_operations ds18b20_dev_fops = {

    .owner = THIS_MODULE,

    .open = ds18b20_open,

    .read = ds18b20_read,

};


/******************************************************************************************************

** 函数名称: ds18b20_setup_cdev()

** 函数功能: 初始化cdev

** 入口参数: dev:设备结构体; index:

** 出口参数: 无

** 备    注:

******************************************************************************************************/

void ds18b20_setup_cdev(struct ds18b20_device *dev, int index)

{

    int err, devno = MKDEV(ds18b20_major, ds18b20_minor + index);


    cdev_init(&dev->cdev, &ds18b20_dev_fops);

    dev->cdev.owner = THIS_MODULE;

    err = cdev_add(&(dev->cdev), devno, 1);

    if (err)

    {

#ifdef DEBUG

        printk(KERN_NOTICE 'ERROR %d add ds18b20n', err);

#endif

    }

}


/******************************************************************************************************

** 函数名称: ds18b20_dev_init()

** 函数功能: 为温度传感器分配注册设备号,初始化cdev

** 入口参数: 无

** 出口参数: 若成功执行,返回0

** 备    注:

******************************************************************************************************/

static int __init ds18b20_dev_init(void)

{

    ds18b20_major = register_chrdev(ds18b20_major, DEVICE_NAME, &ds18b20_dev_fops);

    if (ds18b20_major<0)

    {

printk(DEVICE_NAME ' Can't register major number!n');

return -EIO;

    }


    ds18b20_class = class_create(THIS_MODULE, DEVICE_NAME);

    device_create(ds18b20_class, NULL, MKDEV(ds18b20_major, ds18b20_minor), NULL, DEVICE_NAME);

#ifdef DEBUG

printk(KERN_WARNING 'register ds18b20 driver successful!n');

#endif

    return 0;

}


/******************************************************************************************************

** 函数名称: ds18b20_dev_exit()

** 函数功能: 注销设备

** 入口参数: 无

** 出口参数: 无

** 备    注:

******************************************************************************************************/

static void __exit ds18b20_dev_exit(void)

{

    device_destroy(ds18b20_class, MKDEV(ds18b20_major,ds18b20_minor));

    class_unregister(ds18b20_class);

    class_destroy(ds18b20_class);

    unregister_chrdev(ds18b20_major, DEVICE_NAME);

#ifdef DEBUG

printk(KERN_WARNING 'Exit ds18b20 driver!n');

[1] [2]
关键字:Tiny6410  ds18b20驱动 引用地址:基于Tiny6410的ds18b20驱动

上一篇:charishi thttpd 在S3C6410的移植-web服务程序的应用
下一篇:Linux 内核驱动自动创建设备节点并挂载设备

推荐阅读最新更新时间:2024-11-12 11:07

DS18B20温度模块驱动(STM32)
一、前期准备 单片机:STM32F103C8T6 开发环境:MDK5.14 库函数:标准库V3.5 DS18B20模块:淘宝有售 二、实验效果 三、驱动原理 看数据手册。 需要完整工程或者有问题的请加QQ:1002521871,验证:呵呵。 四、驱动代码 ds18b20.h #ifndef __DS18B20_H__ #define __DS18B20_H__ #include stm32f10x.h #include gpio.h #include delay.h #define DS18B20_Direction_I {GPIOA- CRL &= 0XFFFFFFF0; GPIOA- CRL |=
[单片机]
<font color='red'>DS18B20</font>温度模块<font color='red'>驱动</font>(STM32)
Tiny6410--SHT10温湿度传感器
先看下6410和SHT10的连接图: 首先是核心板引出的管脚图: 用到的就是CON1的1,2,3,4根线。 在看具体的连接图: 上图中说明了CON1的具体管脚名称是干嘛的。 此次用到的就是上图中的4根线,2根电源线和2根数据线。 传感器介绍: 传感器采集信号包括空气温湿度传感SHT10采集空气温湿度、土壤湿度传感器SHT10采集土壤湿度。 SHT10是世界领先的传感器制造商Sensirion公司开发的一款含有已校准数字信号输出的温湿度复合传感器。该传感器采用CMOS过程微加工专利技术(CMOSense techbologe),确保产品具有极高的可靠性和出色的长期稳定性。该传感器由1个电容式聚合体测湿元件和个能
[单片机]
Tiny6410--SHT10温湿度传感器
STM32下DS18B20驱动
折腾了一晚上,才把DS18B20的驱动移植到STM32上来。以前在51上使用过单个和多个连接的DS18B20,有现成的程序了,以为很快就能弄好,结果还是被卡住了,下面说下几个关键点吧: 首先是延时的问题,STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。相比之下用SysTick来的简单方便点。 接着是STM32 IO脚的配置问题,因为51是双向的IO,所以作为输入输出都比较方便。STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。于是我也按规定做了,但调了老半天都不成功,是因为DS18B20没有响应的信号。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved