mini2440 驱动ds18b20

发布者:superstar11最新更新时间:2024-06-24 来源: elecfans关键字:mini2440  驱动ds18b20 手机看文章 扫描二维码
随时随地手机看文章

想着有个ds18b20,于是就写了一个18b20的驱动。是在mini2440上面实现的。

ldd3的大师说得好,linux驱动应该尽可能多的提供机制,而不是提供策略。我觉得说得太有道理了。驱动本身就不应该涉及到太多策略问题,策略问题应该尽可能多的由应用程序去提供。作为驱动,应该尽可能多得去实现提供硬件的功能,然后留出接口给上面的应用程序调用。

其实ds18b20驱动比较简单,无非就是在单片机驱动18b20的基础上,家里一个字符驱动设备的外套。下面直接上代码吧。

驱动代码:

  1. #include    

  2. #include    

  3. #include    

  4. #include    

  5. #include    

  6. #include    

  7. #include    

  8. #include    

  9. #include    

  10. #include    

  11. #include    

  12. #include    

  13. #include    

  14. #include    

  15. #include  //自动创建设备需要此头文件   

  16.   

  17. #define DQ     S3C2410_GPF(3)      //mini2440里面是这样定义GPIO的   

  18. #define DQ_IN  S3C2410_GPIO_INPUT  //设置DQ为输入   

  19. #define DQ_OUT S3C2410_GPIO_OUTPUT //设置DQ为输入   

  20.   

  21. #define D_MAJOR 0                  //定义主设备号   

  22. #define D_MINOR 0                  //定义从设备号   

  23. #define DEV_NAME 'ds18b20'         //定义设备名   

  24.   

  25. static int ds18b20_major = D_MAJOR;//ds18b20主设备号   

  26. static int ds18b20_minor = D_MINOR;//ds18b20从设备号   

  27. static struct class *my_class;     //定义class,用于自动挂载设备   

  28. static struct class_device *my_device; //自动挂载设备   

  29.   

  30. static struct ds18b20_dev{           //放在一个结构体中            

  31.     struct cdev cdev;                //这个结构体比较简单,但是建议以后将用户的东西都放在一个结构体中   

  32. };  

  33.   

  34. struct ds18b20_dev *ds18b20_devp;  

  35.   

  36. void ds18b20_reset(void)             //重启ds18b20   

  37. {  

  38.     s3c2410_gpio_cfgpin(DQ, DQ_OUT); //设置为输出   

  39.     s3c2410_gpio_pullup(DQ, 0);      //设置下拉   

  40.     s3c2410_gpio_setpin(DQ, 0);      //拉低总线   

  41.     udelay(500);                     //需要将总线拉低480~950us   

  42.     s3c2410_gpio_setpin(DQ, 1);      //释放总线   

  43.     udelay(60);                      //DS18B20拉低信号,60~240us表示应答   

  44.     s3c2410_gpio_cfgpin(DQ, DQ_IN);  //读入DS18B20拉低信号   

  45.     while(s3c2410_gpio_getpin(DQ));  //等待DS18B20应答   

  46.     while(!s3c2410_gpio_getpin(DQ)); //等待DS18B20释放总线       

  47. }  

  48.   

  49. void write_ds18b20(unsigned char Data)           //写命令到ds18b20   

  50. {     

  51.     unsigned char i;  

  52.     s3c2410_gpio_cfgpin(DQ, DQ_OUT);              //设置为输出   

  53.     s3c2410_gpio_pullup(DQ, 1);                   //���拉       

  54.     for(i=0;i<8;i++){  

  55.         s3c2410_gpio_setpin(DQ, 0);              //拉低总线   

  56.         udelay(10);                              //需要拉低10~15us   

  57.    

  58.         if(Data&0x01)  

  59.             s3c2410_gpio_setpin(DQ, 1);  

  60.         else  

  61.             s3c2410_gpio_setpin(DQ, 0);  

  62.         udelay(40);                             //需要拉低20~40us来写0   

  63.         s3c2410_gpio_setpin(DQ, 1);            //释放总线   

  64.         udelay(1);                            //稍微延时   

  65.         Data >>= 1;          

  66.     }  

  67. }  

  68.   

  69. static unsigned char read_ds18b20(void)    //读ds18b20   

  70. {  

  71.     unsigned char Temp=0,i;  

  72.     for(i=0;i<8;i++){  

  73.         Temp >>= 1;  

  74.         s3c2410_gpio_cfgpin(DQ, DQ_OUT);  //DQ为输出状态   

  75.         s3c2410_gpio_setpin(DQ, 0);       //拉低总线,启动输入   

  76.         udelay(1);                        //拉低总线约1us   

  77.         s3c2410_gpio_setpin(DQ, 1);       //释放总线   

  78.         s3c2410_gpio_cfgpin(DQ, DQ_IN);   //DQ为输入状态   

  79.         if(s3c2410_gpio_getpin(DQ))  

  80.           Temp |= 0x80;  

  81.         udelay(45);      //延时45us   

  82.     }  

  83.     return Temp;  

  84. }  

  85.   

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

  87. {  

  88.     filp->private_data = ds18b20_devp;  

  89.     ds18b20_reset();  

  90.     printk(KERN_NOTICE 'open ds18b20 successfuln');  

  91.     return 0;  

  92. }  

  93.   

  94. static ssize_t ds18b20_read(struct file *filp,char __user *buf,size_t size,loff_t *ppos)  

  95. {  

  96.     unsigned long err;  

  97.     struct ds18b20_dev *dev = filp->private_data;  

  98.     unsigned char result[2] = {0x00, 0x00};       //这个是用来存放从ds18b20读到的值   

  99.     ds18b20_reset();                              //reset ds18b20   

  100.     write_ds18b20(0xCC);                          //跳过ROM   

  101.     write_ds18b20(0x44);                          //温度转换   

  102.     ds18b20_reset();                              //reset ds18b20   

  103.     write_ds18b20(0xCC);                          //跳过ROM   

[1] [2]
关键字:mini2440  驱动ds18b20 引用地址:mini2440 驱动ds18b20

上一篇:mini2440 编译U-Boot-1.1.6遇到的一些问题
下一篇:U-Boot-2011.03移植nandflash到mini2440

推荐阅读最新更新时间:2026-03-22 18:49

mini2440DS18B20驱动程序(含简单测试)
ds18b20_drv.c #include linux/init.h #include linux/module.h #include linux/delay.h #include linux/kernel.h #include linux/moduleparam.h #include linux/init.h #include linux/types.h #include linux/fs.h #include mach/regs-gpio.h #include mach/hardware.h #include linux/cdev.h #include
[单片机]
STM32入门开发: 编写DS18B20温度传感器驱动(读取环境温度、支持级联)
一、环境介绍 编程软件: keil5 操作系统: win10 MCU型号: STM32F103C8T6 STM32编程方式: 寄存器开发 (方便程序移植到其他单片机) 温度传感器: DS1820 DS18B20是一个数字温度传感器,采用的是单总线时序与主机通信,只需要一根线就可以完成温度数据读取; DS18B20内置了64位产品序列号,方便识别身份,在一根线上可以挂接多个DS18B20传感器,通过64位身份验证,可以分别读取来至不同传感器采集的温度信息。 二、DS18B20介绍 2.1 DS18B20 的主要特征 1. 全数字温度转换及输出。 2. 先进的单总线数据通信。 3. 最高 12 位
[单片机]
STM32入门开发: 编写<font color='red'>DS18B20</font>温度传感器<font color='red'>驱动</font>(读取环境温度、支持级联)
STM32f103 ds18b20 驱动程序移植
span style= font-family:Arial;background-color: transparent; /span 头文件 *******************************************/ #ifndef __BSP_DS18B20_H #define __BSP_DS18B20_H #include stm32f10x.h #include SysTick.h /******************************DS18B20 函数声明**************************************/ void DS18B20_GP
[单片机]
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)
PIC单片机(PIC16F877A)DS18B20温度传感器驱动程序
#include pic.h #define uchar unsigned char #define uint unsigned int #define rs_h (PORTC|=0x01) #define rs_l (PORTC&=0xfe) #define rs_o (TRISC&=0xfe) #define rw_h (PORTC|=0x02) #define rw_l (PORTC&=0xfd) #define rw_o (TRISC&=0xfd) #define en_h (PORTC|=0x04) #define en_l (PORTC&=0xfb) #define en_o (TRISC&=
[单片机]
PIC单片机(PIC16F877A)<font color='red'>DS18B20</font>温度传感器<font color='red'>驱动</font>程序
DS18B20智能温度传感器驱动程序
/*********端口定义,可以修改*****************/ sbit ledrs=P2^3; //读写控制字 sbit leden=P2^5; //使能端控制字 sbit ledrw=P2^4; void write_com(uchar com) { ledrw=0; ledrs=0; P0=com; delayl(1); leden=1; delayl(1); leden=0; } void write_data(uchar date) { ledrw=0; ledrs=1; P0=date; delayl(1); leden=1; delayl(1); leden=0; } voi
[单片机]
[C51代码]DS18B20驱动
/*******************ds18b20.c**************************/ #include Atmel/AT89X51.h #include link.h #include ds18b20.h #include delay.h /**************定量定义***************/ union { uchar c ; uint x; }temp; uchar idata flag=0; uint idata cc=0; uchar idata disp ; /********************************************
[单片机]
基于S3C2440嵌入式Linux系统下的一个DS18B20驱动
用Linux驱动编程的方法写一个DS18B20的温度传感器驱动,从底层采集温度信息。以下乃本人所写的驱动和测试的源码,嵌入式Linux内核版本为2.6.29,硬件平台是友善之臂的QQ2440,DS18B20引脚连接S3C2440的GPIOB1,程序难免存在一定的漏洞,希望大家指出。 #include linux/config.h #include linux/module.h #include linux/kernel.h #include linux/fs.h #include linux/init.h #include linux/devfs_fs_kernel.h #include linux/miscdevic
[单片机]
基于S3C2440嵌入式Linux系统下的一个<font color='red'>DS18B20</font><font color='red'>驱动</font>
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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