OK6410开发板裸机DS18B20驱动

2017-02-26来源: eefocus关键字:OK6410  开发板裸机  DS18B20驱动

相信玩过51的童鞋应该都玩过DS18B20吧,虽然用在ARM11上面,但是操作还是一样,多了一点就是读写IO前需要切换IO方向,其实51在读取之前需要切换到高电平的,这个一般由编译器完成的,

  1. /************************************************************************************************************* 

  2.  * 文件名: ds18b20.c 

  3.  * 功能:      S3C6410 DS18B20驱动 

  4.  * 作者:      cp1300@139.com 

  5.  * 创建时间:    2012年9月17日22:45 

  6.  * 最后修改时间:2012年9月17日 

  7.  * 详细:      需要延时函数支持 

  8.  *          注意延时精度尽可能的高 

  9.  *          读取的时候不要长时间的被中断,因为1wire对时间要求很严格 

  10. *************************************************************************************************************/  

  11. #include "system.h"  

  12. #include "timer.h"  

  13. #include "delay.h"  

  14. #include "ds18b20.h"  

  15.   

  16.   

  17. //DS18B20使用的是GPIOE0  

  18. #define Set18b20IOout()     (rGPECON |= 1)                          //设置DS18B20 IO为输出,  

  19. #define Set18b20IOin()      (rGPECON &= (~0xf)) //设置DS18B20 IO为浮空输入,  

  20. #define Read18b20IO()       ((rGPEDAT & BIT0) ? 1 : 0)              //读取DS18B20 IO  

  21. #define Write18b20IO(x)     (x ? (rGPEDAT |= BIT0) : (rGPEDAT &= ~BIT0))    //写DS18B20 IO  

  22.   

  23. /************************************************************************************************************************* 

  24. *函数        :    u8 DS18B20_Reset(void) 

  25. *功能        :    复位DS18B20 

  26. *参数        :    无 

  27. *返回        :    0:成功;1:失败 

  28. *依赖 :   底层宏定义 

  29. *作者        :    cp1300@139.com 

  30. *时间     :   20120917 

  31. *最后修改时间:    20120917 

  32. *说明        :无 

  33. *************************************************************************************************************************/  

  34. u8 DS18B20_Reset(void)  

  35. {  

  36.     u8 i = 0;  

  37.       

  38.     Set18b20IOout();    //主机端口推挽输出模式  

  39.     Write18b20IO(1);  

  40.     Delay_US(1);  

  41.     Write18b20IO(0);    //拉低总线480us~240us  

  42.     Delay_US(500);      //>480US延时  

  43.     Write18b20IO(1);  

  44.     Delay_US(2);        //复位完成  

  45.     Set18b20IOin();     //主机端口浮空输入模式  

  46.     while(Read18b20IO())    //等待低电平应答信号  

  47.     {  

  48.         i ++;  

  49.         Delay_US(1);  

  50.         if(i > 100)  

  51.             return 1;       //等待超时,初始化失败,返回1;  

  52.     }  

  53.     Delay_US(250);          //跳过回复信号  

  54.     return 0x00;            //检测到DS18B20,并且初始化成功  

  55. }  

  56.   

  57.   

  58. /************************************************************************************************************************* 

  59. *函数        :    u8 DS18B20_ReadData(void) 

  60. *功能        :    读取DS18B20数据 

  61. *参数        :    无 

  62. *返回        :    数据 

  63. *依赖 :   底层宏定义 

  64. *作者        :    cp1300@139.com 

  65. *时间     :   20120917 

  66. *最后修改时间:    20120917 

  67. *说明        :无 

  68. *************************************************************************************************************************/  

  69. u8 DS18B20_ReadData(void)  

  70. {  

  71.     u8 i,data = 0;  

  72.       

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

  74.     {  

  75.         Set18b20IOout();    //主机端口推挽输出模式  

  76.         Write18b20IO(0);    //拉低总线10-15us  

  77.         data >>= 1;  

  78.         Delay_US(12);  

  79.         Write18b20IO(1);    //释放总线  

  80.         Set18b20IOin();     //主机端口浮空输入模式  

  81.         Delay_US(1);  

  82.         if(Read18b20IO())   //读取数据,读取后大约延时40-45us  

  83.             data |= 0x80;  

  84.         Delay_US(42);  

  85.     }  

  86.     return data;  

  87. }  

  88.   

  89.   

  90. /************************************************************************************************************************* 

  91. *函数        :    void DS18B20_WriteData(u8 data) 

  92. *功能        :    向DS18B20写数据 

  93. *参数        :    数据 

  94. *返回        :    无 

  95. *依赖 :   底层宏定义 

  96. *作者        :    cp1300@139.com 

  97. *时间     :   20120917 

  98. *最后修改时间:    20120917 

  99. *说明        :无 

  100. *************************************************************************************************************************/  

  101. void DS18B20_WriteData(u8 data)  

  102. {  

  103.     u8 i;  

  104.       

  105.     Set18b20IOout();    //主机端口推挽输出模式  

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

  107.     {  

  108.         Write18b20IO(0);        //拉低总线10-15us  

  109.         Delay_US(12);  

  110.         Write18b20IO(data & 0x01);  //写入数据位,保持20-45us  

  111.         Delay_US(30);  

  112.         Write18b20IO(1);        //释放总线  

  113.         data >>= 1;  

  114.         Delay_US(2);  

  115.     }  

  116. }  

  117.   

  118.   

  119.   

  120. /************************************************************************************************************************* 

  121. *函数        :    s16 DS18B20_ReadTemper(void) 

  122. *功能        :    读取DS18B20温度 

  123. *参数        :    无 

  124. *返回        :    温度值 

  125. *依赖 :   底层宏定义 

  126. *作者        :    cp1300@139.com 

  127. *时间     :   20120917 

  128. *最后修改时间:    20120917 

  129. *说明        :温度值扩大了100倍,温度值是个有符号数. 

  130. *************************************************************************************************************************/  

  131. s16 DS18B20_ReadTemper(void)  

  132. {  

  133.     u8 th, tl;  

  134.     s16 data;  

  135.       

  136.     if(DS18B20_Reset())   

  137.     {  

  138.         return 0xffff;  //返回错误  

  139.     }  

  140.     DS18B20_WriteData(0xcc);    //跳过读序列号  

  141.     DS18B20_WriteData(0x44);    //启动温度转换  

  142.     DS18B20_Reset();  

  143.     DS18B20_WriteData(0xcc);    //跳过读序列号  

  144.     DS18B20_WriteData(0xbe);    //读取温度  

  145.     tl = DS18B20_ReadData();    //读取低八位  

  146.     th = DS18B20_ReadData();    //读取高八位  

  147.     data = th;  

  148.     data <<= 8;  

  149.     data |= tl;  

  150.     data *= 6.25;               //温度值扩大100倍,精确到2位小数  

  151.       

  152.     return data;  

  153. }  


  1. #ifndef DS18B20_H_  

  2. #define DS18B20_H_  

  3.   

  4.   

  5. s16 DS18B20_ReadTemper(void);   //读取DS18B20温度  

  6.   

  7. #endif /*DS18B20_H_*/  



DELAY.C


  1. /************************************************************************************************************* 

  2.  * 文件名: delay.c 

  3.  * 功能:      延时函数,调用定时器1进行延时的 

  4.  * 作者:      cp1300@139.com 

  5.  * 创建时间:    2012年9月17日22:32 

  6.  * 最后修改时间:2012年9月17日 

  7.  * 详细:      延时误差1-2us,使用定时器1 

  8.  *          不能在中断服务程序中使用 

  9. *************************************************************************************************************/  

  10. #include "system.h"  

  11. #include "timer.h"  

  12. #include "delay.h"  

  13.   

  14.   

  15. /************************************************************************************************************************* 

  16. *函数        :    void Delay_US(u32 Delay) 

  17. *功能        :    US延时 

  18. *参数        :    Delay:延时时间,单位US 

  19. *返回        :    无 

  20. *依赖 :   底层宏定义 

  21. *作者        :    cp1300@139.com 

  22. *时间     :   20120917 

  23. *最后修改时间:    20120917 

  24. *说明        :调用定时器0进行延时的,那么定时器0就不能使用了,延时误差1US 

  25. *************************************************************************************************************************/  

  26. void Delay_US(u32 Delay)  

  27. {  

  28.     rTCFG0 |= 65;           //定时器0预分频65+1,由PCLK=66提供时钟,66分频产生1MHz的定时器时钟  

  29.     rTCON &= (~0xff);       //清除设置  

  30.     rTCON |= BIT3;          //定时器0自动更新使能  

  31.     rTCNTB0 = Delay;        //重装值  

  32.     rTINT_CSTAT |= BIT5;    //清除中断标志  

  33.     rTINT_CSTAT &= ~BIT0;   //关闭定时器0中断  

  34.     //以下操作启动定时器0  

  35.     rTCON |= BIT1;          //手动更新  

  36.     rTCON &= ~BIT1;         //结束手动更新  

  37.     rTCON |= BIT0;          //启动定时器0      

  38.     while(!(rTINT_CSTAT & BIT5));   //等待延时到达  

  39.     rTINT_CSTAT |= BIT5;    //清除中断标志  

  40. }  

  41.   

  42.   

  43.   

  44. /************************************************************************************************************************* 

  45. *函数        :    void Delay_MS(u32 Delay) 

  46. *功能        :    MS延时 

  47. *参数        :    Delay:延时时间,单位US 

  48. *返回        :    无 

  49. *依赖 :   底层宏定义 

  50. *作者        :    cp1300@139.com 

  51. *时间     :   20120918 

  52. *最后修改时间:    20120918 

  53. *说明        :调用定时器0进行延时的,那么定时器0就不能使用了,延时误差<1ms 

  54. *************************************************************************************************************************/  

  55. void Delay_MS(u32 Delay)  

  56. {  

  57.     while(Delay --)  

  58.     {  

  59.         Delay_US(1000);  

  60.     }  

  61. }  


后面将这个程序移植到LINUX上面当做DS18B20驱动


关键字:OK6410  开发板裸机  DS18B20驱动 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/article_2017022633945.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:S3C6410 裸机硬件JPEG解码
下一篇:S3C6410裸机电阻屏驱动

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

OK6410开发板uboot烧写
uboot的移植完成以后,满以为很快能烧写到板子上并安装linux,结果uboot烧写了三天才终于成功,这其中碰到了不少的问题,在此做个总结。首先,飞凌的OK6410开发板并不支持JLink烧写uboot,只能通过SD卡来烧写,这一点我事先并不知道,他们网店介绍里并未说明,而且销售人员也没有做出任何提示,结果我花了整整一天时间尝试所有通过JLink烧写uboot的可能方法,结合网上个别人反映,最终意识到通过JLink完成uboot烧写是不可能成功的了,后来在销售人员那里确认了这一点,对飞凌表示不满。当时买板的时候没有买SD卡,因为感觉没什么用,就想给老板省点钱,现在没SD卡不行了,但在寻找JLink烧写uboot方法的过程中我发现
发表于 2018-10-12
OK6410裸机汇编:1th_led
;   rm *.o led.elf led.bin led.dis=====================================================================下载测试,下载方法可以参考“烧写OK6410裸板方法汇总”章节介绍:    用SecureCRT下载led.bin:    tftp 0x50008000 led.bin    go 0x50008000即可看到程序运行效果。
发表于 2018-10-12
OK6410裸机学习第二天:2th_leds
start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU 0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间       ldr r0, =0x70000000    orr r0, r0, #0x13    mcr p15,0,r0,c15,c2,4       @ 256M(0x70000000-
发表于 2018-10-12
OK6410裸机学习第三天:3th_leds_c
start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU 0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间    //Peri port setup     ldr r0, =0x70000000    orr r0, r0, #0x13    mcr p15,0,r0,c15,c2,4     &
发表于 2018-10-12
OK6410裸机学习第四天:4th_leds_params
start.S文件:.globl _start_start:1、硬件相关的设置:把外设的基地址告诉CPU  0 ~ 0x6fff ffff为内存的地址空间,0x7000 0000 ~ 0x7fff ffff为外设寄存器的地址空间       ldr r0, =0x70000000    orr r0, r0, #0x13    mcr p15,0,r0,c15,c2,4       @ 256M(0x700
发表于 2018-10-12
OK6410光盘里的uboot不能用TFTP下载文件?
无论用ping命令还是tftp命令,都显示CS8900 Ethernet chip not found?!看了uboot1.1.6/include/configs/smdk6410.h,里面确实是配置为网卡使用CS8900,什么时候发布个配置为DM9000的uboot源码啊?或者发个补丁也行此问题已解决 方法很简单,给用飞凌S3C6410的朋友一个参考。  a.用\u-boot-1.1.6-TQ6410\drivers\目录下的dm9000x.c和dm9000x.h替换OK6410的u-boot里的同名文件  b.用\u-boot-1.1.6-TQ6410\include\configs\tq6410.h里配置网卡的几行代码替换
发表于 2018-10-12
小广播
何立民专栏 单片机及嵌入式宝典

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

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