ds18b20的时序图如下:

复位时序:

读写时序:

以下是程序代码:

#include <linux/module.h>

#include <linux/init.h>

#include <linux/miscdevice.h>

#include <linux/interrupt.h>

#include <linux/io.h>

#include <linux/fs.h>

#include <linux/slab.h>

#include <asm/irq.h>

#include <linux/random.h>

#include <linux/uaccess.h>

#include <linux/device.h>

#include <linux/delay.h>

#include <mach/gpio.h>

#include <linux/mutex.h>

#define GPH3_0CON 0xE0200C60

#define GPH3_0DAT 0xE0200C64

#define GPH3_0PUD 0xE0200C68

unsigned int *gpio_config;

unsigned char *gpio_data;

unsigned int *gpio_pud;

static struct class *fog_class;     //´´½¨Àà

static struct class_device *fog_class_devs;   //´´½¨Àà¶ÔÓ¦µÄÉ豸

int major;

struct mutex res_mutex;

void Ds18b20_Pin_Init(void)

{

    unsigned int pin_val;

    gpio_request(S5PV210_GPH3(0),"my_ds1802");

    gpio_config = ioremap(GPH3_0CON,4);

    gpio_data = ioremap(GPH3_0DAT,1);

    gpio_pud = ioremap(GPH3_0PUD,2);

    pin_val = readl(gpio_pud);

    pin_val &=~(0x0003);

    pin_val |= 0x2;

    writel(pin_val,gpio_pud);

    pin_val = readl(gpio_data);

    writel(pin_val|0x1,gpio_data);

}

void DS18B20_OUT( unsigned char value)

{

    if( value == 1)

    {

        gpio_direction_output( S5PV210_GPH3(0), 1);

    }

    else

    {

        gpio_direction_output( S5PV210_GPH3(0), 0);

    }

}

unsigned char DS18B20_IN( void )

{

    unsigned int pin_val;

    gpio_direction_input( S5PV210_GPH3(0));

    pin_val = readl(gpio_data);

    return pin_val&0x1;

}

static void Init_DS18B20(void)

{

   gpio_direction_output( S5PV210_GPH3(0), 1);

    udelay(200);

    gpio_direction_output( S5PV210_GPH3(0), 0);

    udelay(600);

    gpio_direction_output( S5PV210_GPH3(0), 1);

    udelay(480);

}

static void WriteCode(unsigned char dat)

{

    unsigned char temp,i;

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

    {

        temp = dat&0x01;

        gpio_direction_output( S5PV210_GPH3(0), 1);

        udelay(2);

        gpio_direction_output( S5PV210_GPH3(0), 0);

        if(temp == 0x01)

        {

            udelay(2);

            gpio_direction_output( S5PV210_GPH3(0), 1);

            udelay(100);

        }else{

            udelay(100);

            gpio_direction_output( S5PV210_GPH3(0), 1);

            udelay(3);

        }

        dat = dat>>1;

    }

}

static void Reset_DS18B20( void )

{

    gpio_direction_output( S5PV210_GPH3(0), 0);

    udelay(500);

    gpio_direction_output( S5PV210_GPH3(0), 1);

    udelay(480);

}

static unsigned int ReadData(void)

{

    unsigned int rec,data,i;

    data = 0;

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

    {

        gpio_direction_output( S5PV210_GPH3(0), 0);

        udelay(5);

        udelay(3);

        rec = DS18B20_IN();

            udelay(20);

        if(rec){

        data |= 0x8000;

        }else{

        data &= 0x7fff;

        }

        if(i<15)

        data >>=1;

        udelay(20);

        gpio_direction_output( S5PV210_GPH3(0), 1);

        udelay(5);

    }

    return (data);

}

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

{

    return 0;

}

static int ds18b20_read(struct file * file, char * buffer, size_t count, loff_t *ppos)

{

    int tem;

    int ds_value;

    mutex_lock_interruptible(&res_mutex);

    Ds18b20_Pin_Init();

    Init_DS18B20();

    WriteCode(0xcc);

    WriteCode(0x44);

    gpio_direction_input( S5PV210_GPH3(0));

    udelay(100);

    tem = DS18B20_IN();

    if(tem)

    {

        gpio_direction_output( S5PV210_GPH3(0), 1);

        Reset_DS18B20();

        WriteCode(0xcc);

        WriteCode(0xbe);

        ds_value = ReadData();

    }else{

        udelay(50);

        ds_value = 0xaaaa;

    }

    mutex_unlock(&res_mutex);

    copy_to_user(buffer, &ds_value, 4);

    return sizeof ds_value;

}

static struct file_operations ds18b20_fops =

{

    .open = ds18b20_open,

    .read = ds18b20_read,

};

static int Ds18b20_init(void)

{

    major = register_chrdev( 0,"ds18b20_drv", &ds18b20_fops );

    fog_class = class_create(THIS_MODULE,"ds18b20_class");

    fog_class_devs = device_create(fog_class,NULL,MKDEV(major,0),NULL,"my_ds1802");

    mutex_init(&res_mutex);

    printk("install module successed\n");

    return 0;

}

void Ds18b20_exit(void)

{

    unregister_chrdev( major, "ds18b20_drv" );

    device_unregister(fog_class_devs);

    class_destroy(fog_class);

}

module_init(Ds18b20_init);

module_exit(Ds18b20_exit);

MODULE_LICENSE("GPL");

Linux嵌入式学习-ds18b20驱动的更多相关文章

  1. Linux嵌入式学习-烟雾传感器驱动-字符设备驱动-按键驱动

    MQ-2烟雾气敏传感器模块在X210v3开发板上的驱动. 现在需要一个MQ-2烟雾气敏传感器模块的驱动.其检测烟雾超过一定的标准后,会返回一个不同的电平,和按键驱动差不多. 但是在编写驱动的时候,需要 ...

  2. Linux嵌入式学习-mount命令+nfs挂载失败原因【转】

    NFS 挂载失败原因[待搜集] 1.挂载时若出现mount.nfs: Input/output error 解决:在客户端也需启动portmap服务 service portmap status[查看 ...

  3. Linux嵌入式学习-USB端口号绑定

    由于ubuntu USB设备号为从零开始依次累加,所以多个设备每次开机后设备号不固定,机器人每次开机都要蛋疼的按顺序插, 在网上找到一种方法:udev的规则 udev的规则说明,可以参考博客说明:ht ...

  4. Linux嵌入式学习-交叉编译openssl

    利用arm-none-linux-gnueabi-gcc交叉编译openssl,生成静态库文件libcrypto.a ,libssl.a 1.从openssl官网下载openssl最新版本,我下载的是 ...

  5. Linux嵌入式学习-远程过程调用-Binder系统

    Binder系统的C程序使用示例IPC : Inter-Process Communication, 进程间通信RPC : Remote Procedure Call, 远程过程调用 这里我们直接只用 ...

  6. Linux嵌入式学习-网络配置-ping外网、主机和域名

    之前用的nfs挂载的文件系统,今天用yaffs2制作的文件系统并写入到nandflash中.但是网络却无法使用了. 首先,我们配置网卡. ifconfig eth0 192.168.1.230 bro ...

  7. Linux嵌入式学习-Mplayer交叉编译-undefined reference to `clock_gettime' MPlayer

    編譯Mplayera. 配置.configure# ./configure --host-cc=gcc --cc=arm-linux-gcc --target=arm --enable-static ...

  8. Linux嵌入式学习-交叉编译mplayer

    http://bbs.gkong.com/archive.aspx?ID=286721

  9. Linux内核调用I2C驱动_驱动嵌套驱动方法

    禁止转载!!!! Linux内核调用I2C驱动_以MPU6050为例 0. 导语 最近一段时间都在恶补数据结构和C++,加上导师的事情比较多,Linux内核驱动的学习进程总是被阻碍.不过,十一假期终于 ...

随机推荐

  1. 0001_20190327_使用frp搭建内网穿透

    1. 环境 a)         公网服务器为阿里云的ECS  Windows  2008 R2服务器, 有公网IP地址; 这个作为frp的服务器 b)         内网是开发服务器, Cento ...

  2. moviepy音视频剪辑:moviepy中的剪辑基类Clip的属性和方法详解

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一. ...

  3. PyQt(Python+Qt)学习随笔:快速理解Qt 中Action是什么

    一.引言 Qt中Action这个词接触很久了,一直以来没去学习,今天终于准备学习了,查了些资料,初步总结为: Action为界面操作的抽象,应用程序可以通过菜单,工具栏按钮以及键盘快捷键来调用通用的命 ...

  4. MDX非常规百分比算法-过滤数据后的百分比

    网上有很多关于占比的帖子,基本上都是按照层次结构来做的,比如某个子项占总体的百分比(\all).某个子项占父项的百分比(\parent).某个子项占其祖先的百分比(\ancestor)....等等,如 ...

  5. [原创] C# 金额大写

    突然要用到这个功能.也网上找了下. 最后还是自动动手写了一个. 估计这个还是有人要要的,所以顺便发出来吧. 引用保留 https://www.cnblogs.com/goldli/p/14105832 ...

  6. 【CSP-S 2019】树的重心(重心的性质)

    Description 给定一颗 \(n\) 个顶点的树 \(\text T\),共 \(n-1\) 次断边操作,每次将树分为两部分 \(\text T_1, \text T_2\),求: \[\su ...

  7. 题解 CF1437G Death DBMS

    这题感觉不是很难,但是既然放在 \(\texttt{EDU}\) 的 \(\texttt{G}\) 题,那么还是写写题解吧. \(\texttt{Solution}\) 首先看到 "子串&q ...

  8. 通过游戏学javascript系列第一节Canvas游戏开发基础

    本节教程通过一个简单的游戏小例子,讲解Canvas的基础知识. 最终效果: 点击移动的方块,方块上的分数会增加,方块的行进方向会改变,并且方块的速度会增加. 在线演示 源码 HTML5引入了canva ...

  9. rhel6.4搭建rac前共享存储配置(iscsi+multipath+udev)

    rhel6.4搭建rac前共享存储配置(iscsi+multipath+udev) server: IP配置: 192.168.12.30 192.168.12.40   添加一个100G磁盘/dev ...

  10. css样式规则

    在css样式规则中: 1.选择器用于指定CSS样式作用的HTML对象,花括号内是对该对象设置的具体样式. 2.属性和属性值以"键值对"的形式出现. 3.属性是对指定的对象设置的样式 ...