mini2440 驱动ds18b20

发布时间:2024-06-24  

想着有个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   

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>