DS18B20读写时序分析.doc_第1页
DS18B20读写时序分析.doc_第2页
DS18B20读写时序分析.doc_第3页
DS18B20读写时序分析.doc_第4页
DS18B20读写时序分析.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

新手在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时序Author:exploer初始化序列复位和存在脉冲DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presence pulse)。下图(插图13,即如下截图)阐述了这一点。当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。在初始化步骤中,总线上的主机通过拉低单总线至少480s来产生复位脉冲。然后总线主机释放总线并进入接收模式。当总线释放后,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;t0;t-)_nop_();_nop_();_nop_();_nop_();_nop_(); _nop_();延时函数反汇编代码(方便分析延时公式)C:0x0031 7F01 MOV R7,#0x01C:0x0033 7E00 MOV R6,#0x00C:0x0035 1206A6 LCALL delayxus(C:06A6)38: void Delayxus_DS18B20(unsigned int t)39: 40: for(t;t0;t-)C:0x06A6 D3 SETB CC:0x06A7 EF MOV A,R7C:0x06A8 9400 SUBB A,#0x00C:0x06AA EE MOV A,R6C:0x06AB 9400 SUBB A,#0x00C:0x06AD 400B JC C:06BA41: 42: _nop_();_nop_();_nop_();_nop_();C:0x06AF 00 NOPC:0x06B0 00 NOPC:0x06B1 00 NOPC:0x06B2 00 NOP43: C:0x06B3 EF MOV A,R7C:0x06B4 1F DEC R7C:0x06B5 70EF JNZ Delayxus_DS18B20 (C:06A6)C:0x06B7 1E DEC R6C:0x06B8 80EC SJMP Delayxus_DS18B20 (C:06A6)44: _nop_(); _nop_();C:0x06BA 00 NOPC:0x06BB 00 NOP45: 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);/*需要等待1560us,这里延时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时隙,在拉低总线后主机必须在15s内释放总线。在总线被释放后,由于5k上拉电阻的作用,总线恢复为高电平。为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60s)。在主机产生写时隙后,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_();/总线拉低持续时间要大于1usDQ=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+=1; /注意不要写成dat1读时序:DS18B20只有在主机发出读时隙后才会向主机发送数据。因此,在发出读暂存器命令 BEh或读电源命令B4h后,主机必须立即产生读时隙以便DS18B20提供所需数据。另外,主机可在发出温度转换命令T 44h或Recall命令E 2B8h后产生读时隙,以便了解操作的状态(在 DS18B20操作指令这一节会详细解释)。所有的读时隙必须至少有60us的持续时间。相邻两个读时隙必须要有最少1us的恢复时间。所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。在主机产生读时隙后,DS18B20开始发送0或1到总线上。DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。因此,主机释放总线和采样总线等动作要在15s内完成。插图15表明了对于读时隙,TINIT(下降沿后低电平持续时间), TRC(上升沿)和TSAMPLE(主机采样总线)的时间和要在15s以内。插图16显示了最大化系统时间宽限的方法:让TINIT 和TRC尽可能的短,把主机采样总线放到15s这一时间段的尾部。由文档可知,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=1;/先读最低位if(Read_Bit()dat|=0x80;return(dat);/*函数:Start_DS18B20功能:启动温度转换参数:无返回:无说明: 复位后写44H命令*/void Start_DS18B20()DQ=1;RST_DS18B20();WR_Byte(0xcc);/ skipWR_Byte(0x44);/启动温度转换/*函数:Read_Tem功能:读取温度参数:无返回:int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据说明: 复位后写BE命令*/int Read_Tem()int tem=0;RST_DS18B20();WR_Byte(0xcc);/ skipWR_Byte(0xbe);/发出读取命令tem

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论