加载中…
个人资料
一个电气工程师
一个电气工程师
  • 博客等级:
  • 博客积分:0
  • 博客访问:29,955
  • 关注人气:19
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

DS18B20的驱动移植到STM32上

(2014-05-10 11:47:46)
分类: ARMCotex-M3_STM32

DS18B20的驱动移植到STM32上

下面说下几个关键点吧:

首先是延时的问题

STM32上若用软件延时的话不太好算时间,所以要么用定时器要么用SysTick这个定时器来完成延时的计算。相比之下用SysTick来的简单方便点。

接着是STM32 IO脚的配置问题

因为51是双向的IO,所以作为输入输出都比较方便。STM32的IO是准双向的IO,网上查了下资料,说将STM32的IO配置成开漏输出,然后外接上拉即可实现双向IO。

下面引用一段DS18B20的时序描述,写的很详细:

DS18B20的控制流程

  • 根据DS18B20的通信协议,DS18B20只能作为从机,而单片机系统作为主机,单片机控制DS18B20完成一次温度转换必须经过3个步骤:复位、发送ROM指令、发送RAM指令。每次对DS18B20的操作都要进行以上三个步骤。
  • 复位过程为:单片机将数据线拉低至少480uS,然后释放数据线,等待15-60uS让DS18B20接收信号,DS18B20接收到信号后,会把数据线拉低60-240uS,主机检测到数据线被拉低后标识复位成功;
  • 发送ROM指令:ROM指令表示主机对系统上所接的全部DS18B20进行寻址,以确定对那一个DS18B20进行操作,或者是读取某个DS18B20的ROM序列号。
  • 发送RAM指令:RAM指令用于单片机对DS18B20内部RAM进行操作,如读取寄存器的值,或者设置寄存器的值。 具体的RAM和RAM指令请查阅DS18B20的数据手册。

ROM和RAM指令简单介绍

具体的ROM和RAM指令请查阅DS18B20的数据手册。

1. ROM操作命令:

DS18B20采用一线通信接口。因为一线通信接口,必须在先完成ROM设定,否则记忆和控制功能将无法使用。一旦总线检测到从属器件的存在,它便可以发出器件ROM操作指令,所有ROM操作指令均为8位长度,主要提供以下功能命令:

  1. 读ROM(指令码0X33H):当总线上只有一个节点(器件)时,读此节点的64位序列号。如果总线上存在多于一个的节点,则此指令不能使用。
  2. ROM匹配(指令码0X55H):此命令后跟64位的ROM序列号,总线上只有与此序列号相同的DS18B20才会做出反应;该指令用于选中某个DS18B20,然后对该DS18B20进行读写操作。
  3. 搜索ROM(指令码0XF0H): 用于确定接在总线上DS18B20的个数和识别所有的64位ROM序列号。当系统开始工作,总线主机可能不知道总线上的器件个数或者不知道其64位ROM序列号,搜索命令用于识别所有连接于总线上的64位ROM序列号。
  4. 跳过ROM(指令码0XCCH): 此指令只适合于总线上只有一个节点;该命令通过允许总线主机不提供64位ROM序列号而直接访问RAM,以节省操作时间。
  5. 报警检查(指令码0XECH):此指令与搜索ROM指令基本相同,差别在于只有温度超过设定的上限或者下限值的DS18B20才会作出响应。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值,或者改变TH或TL的设置使得测量值再一次位于允许的范围之内。储存在EEPROM内的触发器用于告警。

2. RAM指令

DS18B20有六条RAM命令:

  1. 温度转换(指令码0X44H):启动DS18B20进行温度转换,结果存入内部RAM。
  2. 读暂存器(指令码0XBEH):读暂存器9个字节内容,此指令从RAM的第1个字节(字节0)开始读取,直到九个字节(字节8,CRC值)被读出为止。如果不需要读出所有字节的内容,那么主机可以在任何时候发出复位信号以中止读操作。
  3. 写暂存器(指令码0X4EH): 将上下限温度报警值和配置数据写入到RAM的2、3、4字节,此命令后跟需要些入到这三个字节的数据。
  4. 复制暂存器(指令码0X48H):把暂存器的2、3、4字节复制到EEPROM中,用以掉电保存。
  5. 重新调E2RAM(指令码0XB8H):把EEROM中的温度上下限及配置字节恢复到RAM的2、3、4字节,用以上电后恢复以前保存的报警值及配置字节。
  6. 读电源供电方式(指令码0XB4H):启动DS18B20发送电源供电方式的信号给主CPU。对于在此命令送至DS18B20后所发出的第一次读出数据的时间片,器件都会给出其电源方式的信号。“0”表示寄生电源供电。“1”表示外部电源供电。

下面是结合实际测试总结出来的DS18B20的操作流程:

1. DS18B20的初始化
  1. 先将数据线置高电平“1”。
  2. 延时(该时间要求的不是很严格,但是尽可能的短一点)。
  3. 数据线拉到低电平“0”。
  4. 延时490微秒(该时间的时间范围可以从480到960微秒)。
  5. 数据线拉到高电平“1”。
  6. 延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平“0”。据该状态可以来确定它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
  7. 若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起(第(5)步的时间算起)最少要480微秒。
  8. 将数据线再次拉高到高电平“1”后结束。  
2. DS18B20的写操作
  1. 数据线先置低电平“0”。
  2. 延时确定的时间为2(小于15)微秒。
  3. 按从低位到高位的顺序发送字节(一次只发送一位)。
  4. 延时时间为62(大于60)微秒。
  5. 将数据线拉到高电平,延时2(小于15)微秒。
  6. 重复上(1)到(6)的操作直到所有的字节全部发送完为止。
  7. 最后将数据线拉高。  
3. DS18B20的读操作
  1. 将数据线拉高“1”。
  2. 延时2微秒。
  3. 将数据线拉低“0”。
  4. 延时2(小于15)微秒。
  5. 将数据线拉高“1”,同时端口应为输入状态。
  6. 延时4(小于15)微秒。
  7. 读数据线的状态得到1个状态位,并进行数据处理。
  8. 延时62(大于60)微秒。

  
例程可参考DS18B20 Application Note 162.
参考资料来源于网友博客STM32下DS18B20的驱动,为尊重网友劳动,给出链接。

图例说明遍询ROM原理:

DS18B20的驱动移植到STM32上

DS18B20的驱动移植到STM32上

DS18B20的驱动移植到STM32上

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有