DS18B20时序分析详细步骤

  

  作者:华清远见讲师

  1、过程1、2是初始化过程,每次读取都要初始化,否则18b20处于待机状态,无法成功读取。过程1:拉低信号线480-700us,使它复位,然后释放总线15-60us,18b20会拉低总线60-240us,然后它释放总线。所以初始化成功的一个标志就是能否读到18b20这个先低后高的操作时序。

  (注意:黑色部分表示主机操作,蓝色部分表示18b20操作,每次主机操作完成之后等待18b20状态时,必须要释放总线,比如将IO设置为高阻态什么的。否则18B20没法把状态写到线上)

  2、过程3、4是写1bit数据过程。过程3是写0
,过程4是写1。过程3:拉低总线60us,然后抬高总线5us,完成。过程4:拉低总线5us,然后抬高总线60us,完成

  3、过程5、6是读1bit过程。过程5是读0,过程6是读1。过程5、6:拉低总线5us,然后释放总线,读取总线,如果为0,则读入0,如果为1,则读入1。

  DS18B20时序

  初始化序列——复位和存在脉冲

  DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence
pulse)。下图(插图13,即如下截图)阐述了这一点。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。

  

  在初始化步骤中,总线上的主机通过拉低单总线至少480μs来产生复位脉冲。然后总线主机释放总线并进入接收模式。

  当总线释放后,5kΩ的上拉电阻把单总线上的电平拉回高电平。当DS18B20检测到上升沿后等待15到60us,然后以拉低总线60-240us的方式发出存在脉冲。

  如文档所述,主机将总线拉低最短480us,之后释放总线。由于5kΩ上拉电阻的作用,总线恢复到高电平。DS18B20检测到上升沿后等待15到60us,发出存在脉冲:拉低总线60-240us。至此,初始化和存在时序完毕。

  根据上述要求编写的复位函数为:

  首先是延时函数:(由于DS18B20延时均以15us为单位,故编写了延时单位为15us的延时函数,注意:以下延时函数晶振为12MHz)

  /*

  ************************************

  函数:Delayxus_DS18B20

  功能:DS18B20延时函数

  参数:t为定时时间长度

  返回:无

  说明: 延时公式:15n+15(近似),晶振12Mhz

  ******************************************

  */

  void Delayxus_DS18B20(unsigned int t)

  {

  for(t;t>0;t--)

  {

  _nop_();_nop_();_nop_();_nop_();

  }

  _nop_(); _nop_();

  }

  延时函数反汇编代码(方便分析延时公式)

  C:0x0031 7F01 MOV R7,#0x01

  C:0x0033 7E00 MOV R6,#0x00

  C:0x0035 1206A6 LCALL delayxus(C:06A6)

  38: void Delayxus_DS18B20(unsigned int t)

  39: {

  40: for(t;t>0;t--)

  C:0x06A6 D3 SETB C

  C:0x06A7 EF MOV A,R7

  C:0x06A8 9400 SUBB A,#0x00

  C:0x06AA EE MOV A,R6

  C:0x06AB 9400 SUBB A,#0x00

  C:0x06AD 400B JC C:06BA

  41: {

  42: _nop_();_nop_();_nop_();_nop_();

  C:0x06AF 00 NOP

  C:0x06B0 00 NOP

  C:0x06B1 00 NOP

  C:0x06B2 00 NOP

  43: }

  C:0x06B3 EF MOV A,R7

  C:0x06B4 1F DEC R7

  C:0x06B5 70EF JNZ Delayxus_DS18B20 (C:06A6)

  C:0x06B7 1E DEC R6

  C:0x06B8 80EC SJMP Delayxus_DS18B20 (C:06A6)

  44: _nop_(); _nop_();

  C:0x06BA 00 NOP

  C:0x06BB 00 NOP

  45: }

  C:0x06BC 22 RET

  分析上述反汇编代码,可知延时公式为15*(t+1)

  /*

  ************************************

  函数:RST_DS18B20

  功能:复位DS18B20,读取存在脉冲并返回

  参数:无

  返回:1:复位成功 ;0:复位失败

  说明: 拉低总线至少480us ;可用于检测DS18B20工作是否正常

  ******************************************

  */

  bit RST_DS18B20()

  {

  bit ret="1";

  DQ=0;/*拉低总线 */

  Delayxus_DS18B20(32);/*为保险起见,延时495us */

  DQ=1;/*释放总线 ,DS18B20检测到上升沿后会发送存在脉冲*/

  Delayxus_DS18B20(4);/*需要等待15~60us,这里延时75us后可以保证接受到的是存在脉冲(如果通信正常的话) */

  ret=DQ;

  Delayxus_DS18B20(14);/*延时495us,让ds18b20释放总线,避免影响到下一步的操作 */

  DQ=1;/*释放总线 */

  return(~ret);

  }

  写时序:

  主机在写时隙向DS18B20写入数据,并在读时隙从DS18B20读入数据。在单总线上每个时隙只传送一位数据。

  写时间隙

  有两种写时隙:写“0”时间隙和写“1”时间隙。总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。两种写时隙都通过主机拉低总线产生(见插图14)。

  

  为产生写1时隙,在拉低总线后主机必须在15μs内释放总线。在总线被释放后,由于5kΩ上拉电阻的作用,总线恢复为高电平。为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。

  在主机产生写时隙后,DS18B20会在其后的15到60us的一个时间窗口内采样单总线。在采样的时间窗口内,如果总线为高电平,主机会向DS18B20写入1;如果总线为低电平,主机会向DS18B20写入0。

  如文档所述,所有的写时隙必须至少有60us的持续时间。相邻两个写时隙必须要有最少1us的恢复时间。所有的写时隙(写0和写1)都由拉低总线产生。

  为产生写1时隙,在拉低总线后主机必须在15us内释放总线(拉低的电平要持续至少1us)。由于上拉电阻的作用,总线电平恢复为高电平,直到完成写时隙。

  为产生写0时隙,在拉低总线后主机持续拉低总线即可,直到写时隙完成后释放总线(持续时间60-120us)。

  写时隙产生后,DS18B20会在产生后的15到60us的时间内采样总线,以此来确定写0还是写1。

  满足上述要求的写函数为:

  /*

  ************************************

  函数:WR_Bit

  功能:向DS18B20写一位数据

  参数:i为待写的位

  返回:无

  说明: 总线从高拉到低产生写时序

  ******************************************

  */

  void WR_Bit(bit i)

  {

  DQ=0;//产生写时序

  _nop_();

  _nop_();//总线拉低持续时间要大于1us

  DQ=i;//写数据 ,0和1均可

  Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取

  DQ=1;//释放总线

  }

  /*

  ***********************************

  函数:WR_Byte

  功能:DS18B20写字节函数,先写最低位

  参数:dat为待写的字节数据

  返回:无

  说明:无

  ******************************************

  */

  void WR_Byte(unsigned char dat)

  {

  unsigned char i="0";

  while(i++<8)

  {

  WR_Bit(dat&0x01);//从最低位写起

  dat>>=1; //注意不要写成dat>>1

  }

  }

  读时序:

  DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令
[BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T [44h]或Recall命令E
2[B8h]后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。

  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15μs内完成。

  插图15表明了对于读时隙,TINIT(下降沿后低电平持续时间), TRC(上升沿)和TSAMPLE(主机采样总线)的时间和要在15μs以内。

  插图16显示了最大化系统时间宽限的方法:让TINIT 和TRC尽可能的短,把主机采样总线放到15μs这一时间段的尾部。

  

  由文档可知,DS18B20只有在主机发出读时隙时才能发送数据到主机。因此,主机必须在BE命令,B4命令后立即产生读时隙以使DS18B20提供相应的数据。另外,在44命令,B8命令后也要产生读时隙。

  所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。DS18B20输出的数据在下降沿产生后15us后有效。因此,释放总线和主机采样总线等动作要在15us内完成。

  满足以上要求的函数为:

  /*

  ***********************************

  函数:Read_Bit

  功能:向DS18B20读一位数据

  参数:无

  返回:bit i

  说明: 总线从高拉到低,持续至1us以上,再释放总线为高电平空闲状态产生读时序

  ******************************************

  */

  unsigned char Read_Bit()

  {

  unsigned char ret;

  DQ=0;//拉低总线

  _nop_(); _nop_();

  DQ=1;//释放总线

  _nop_(); _nop_();

  _nop_(); _nop_();

  ret=DQ;//读时隙产生7 us后读取总线数据。把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性

  Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求

  DQ=1;//释放总线

  return ret; //返回读取到的数据

  }

  /*

  ************************************

  函数:Read_Byte

  功能:DS18B20读一个字节函数,先读最低位

  参数:无

  返回:读取的一字节数据

  说明: 无

  ******************************************

  */

  unsigned char Read_Byte()

  {

  unsigned char i;

  unsigned char dat="0";

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

  {

  dat>>=1;//先读最低位

  if(Read_Bit())

  dat|=0x80;

  }

  return(dat);

  }

  /*

  ************************************

  函数:Start_DS18B20

  功能:启动温度转换

  参数:无

  返回:无

  说明: 复位后写44H命令

  ******************************************

  */

  void Start_DS18B20()

  {

  DQ=1;

  RST_DS18B20();

  WR_Byte(0xcc);// skip

  WR_Byte(0x44);//启动温度转换

  }

  /*

  ************************************

  函数:Read_Tem

  功能:读取温度

  参数:无

  返回:int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据

  说明: 复位后写BE命令

  ******************************************

  */

  int Read_Tem()

  {

  int tem="0";

  RST_DS18B20();

  WR_Byte(0xcc);// skip

  WR_Byte(0xbe);//发出读取命令

  tem=Read_Byte();//读出温度低八位

  tem|=(((int)Read_Byte())<<8);//读出温度高八位

  return tem;

  }

  注: DS18B20官方文档中没有说明读写数据位的顺序,查了下资料,DS18B20读写数据都是从最低位读写的。

  >>>更多优秀技术博文在华清远见嵌入式学院

时间: 2024-12-29 07:07:19

DS18B20时序分析详细步骤的相关文章

Oracle11g安装详细步骤

Oracle11g安装详细步骤,详见附件↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

VS2012/13本地发布网站详细步骤(可带数据库)

VS发布网站详细步骤 要在本地(自己的额电脑上)发布网站,首先你必须要搭建一个IIS服务器(具体搭建方法可参考我的上一篇博客).下面是具体步骤: 1.打开你的VS2012网站项目,右键点击项目>菜单中 重新生成一下网站项目:再次点击右键>发布 2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件(配置文件可以随便写自己命名): 3.点击下一步:在发布方法中选"文件系统",这样我们可以发布到自己指定的本机文件上. 4.选择网站要发布的物理地址(可以使C

在CentOS6.4中安装配置LAMP环境的详细步骤

原文:在CentOS6.4中安装配置LAMP环境的详细步骤 本文详细介绍了CentOS6.4系统中安装LAMP服务并对其进行配置的过程,即安装Apache+PHP+Mysql,参照了网上大神的设置,其他Linux发行系统可以参考~ 在本文中部分命令操作需要root权限,输入‘su -’命令后输入密码即可切换root身份. 一.修改设置对安装做准备 1. 防火墙设置 设置/etc/sysconfig/iptables文件允许80端口和3306端口.因为80端口是http协议所使用的端口,如果防火墙

oracle 11g R2 64位 安装详细步骤

(oracle 11g R2 64位 + PLSQLDeveloper安装说明以及PLSQL Developer+ ORCALE11-instantclient-basic-win32-11.2.0.1.0连接oracle 11g R2 64位详细步骤) 第一步: 准备工具 1.oracle 11g R2 64位安装包 2.PLSQL Developer v11.0.2.1766 官方中文版(内含PLSQL Developer安装程序.汉化程序.PLSQL Developer注册程序.PLSQL

iOS 真机调试(史上最详细步骤解析,hmt精心打造)

/*************************************************************1********************************************************************/ /*************************************************************2******************************************************

FAILOVER详细步骤

FAILOVER详细步骤 1.Flush主库任何未传输的redo到目标备库 如果primary可以mount,则可以flush任何主库的未传输redo到备库,如果操作成功返回,则可以保证failover的零数据丢失. 1)确保standby数据库启用日志应用 2)mount primary数据库,执行以下SQL语句,命令等待standby应用redo完成后返回. SQL> alter system flush redo to target_db_unique_name; 如果成功返回,则转第5步

请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果。

============问题描述============ 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 ============解决方案1============ 引用 楼主 zpq19870824 的回复: 请问android使用友盟分享,分享到微信好友和朋友圈详细步骤是什么,我现在分享之后没结果.弹出来图片大小超过32kb,然后分享中 就没反应了 我也不知道,帮你顶一下吧...

TortoiseSVN使用详细步骤

1 安装及下载client 端 2 什么是SVN(Subversion)? 3 为甚么要用SVN? 4 怎么样在Windows下面建立SVN Repository? 5 建立一个Working目录 6 新增档案及目录到Repository中 7 更新档案及目录 8 更新至特定版本 9 复制档案及目录 10 制作Tag或是Release 11 快速参考 11.1 取得(Checkout)Repository 11.2 更新(Update)档案或目录 11.3 新增(Add)档案或目录 11.4 提

Nginx+php-fpm环境配置详细步骤

   Nginx+php-fpm环境配置详细步骤 最全的Nginx各种版本下载地址:http://nginx.org/download/ 一.编译安装php-fpm 什么是PHP-FPM PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到. PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中.必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用. 新版PH