DS18B20时序.docx
《DS18B20时序.docx》由会员分享,可在线阅读,更多相关《DS18B20时序.docx(14页珍藏版)》请在冰豆网上搜索。
DS18B20时序
DS18B20时序
Author:
exploer
CIEE,CAU2008-9-16
本文档参照Maxim公司DS18B20的Datasheet而完成。
其中,加了灰框的部分为原文档容,其中英文部分为官方文档容,中文部分为本人的翻译。
限于本人水平,本文档可能存在错误或者让人误解的容,对于因此引起的一切问题作者(exploer,CIEE-CAU)概不负责。
INITIALIZATIONPROCEDURE—RESETANDPRESENCEPULSES
初始化序列——复位和存在脉冲
AllcommunicationwiththeDS18B20beginswithaninitializationsequencethatconsistsofaresetpulsefromthemasterfollowedbyapresencepulsefromtheDS18B20.ThisisillustratedinFigure13.WhentheDS18B20sendsthepresencepulseinresponsetothereset,itisindicatingtothemasterthatitisonthebusandreadytooperate.
DS18B20的所有通信都由由复位脉冲组成的初始化序列开始。
该初始化序列由主机发出,后跟由DS18B20发出的存在脉冲(presencepulse)。
下图(插图13,即如下截图)阐述了这一点。
当发出应答复位脉冲的存在脉冲后,DS18B20通知主机它在总线上并且准备好操作了。
Duringtheinitializationsequencethebusmastertransmits(TX)theresetpulsebypullingthe1-Wirebuslowforaminimumof480μs.Thebusmasterthenreleasesthebusandgoesintoreceivemode(RX).
在初始化步骤中,总线上的主机通过拉低单总线至少480μs来产生复位脉冲。
然后总线主机释放总线并进入接收模式。
Whenthebusisreleased,the5kΩpullupresistorpullsthe1-Wirebushigh.WhentheDS18B20detectsthisrisingedge,itwaits15μsto60μsandthentransmitsapresencepulsebypullingthe1-Wirebuslowfor60μsto240μ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
******************************************
*/
voidDelayxus_DS18B20(unsignedintt)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_();_nop_();
}
延时函数反汇编代码(方便分析延时公式)
C:
0x00317F01MOVR7,#0x01
C:
0x00337E00MOVR6,#0x00
C:
0x00351206A6LCALLdelayxus(C:
06A6)
38:
voidDelayxus_DS18B20(unsignedintt)
39:
{
40:
for(t;t>0;t--)
C:
0x06A6D3SETBC
C:
0x06A7EFMOVA,R7
C:
0x06A89400SUBBA,#0x00
C:
0x06AAEEMOVA,R6
C:
0x06AB9400SUBBA,#0x00
C:
0x06AD400BJCC:
06BA
41:
{
42:
_nop_();_nop_();_nop_();_nop_();
C:
0x06AF00NOP
C:
0x06B000NOP
C:
0x06B100NOP
C:
0x06B200NOP
43:
}
C:
0x06B3EFMOVA,R7
C:
0x06B41FDECR7
C:
0x06B570EFJNZDelayxus_DS18B20(C:
06A6)
C:
0x06B71EDECR6
C:
0x06B880ECSJMPDelayxus_DS18B20(C:
06A6)
44:
_nop_();_nop_();
C:
0x06BA00NOP
C:
0x06BB00NOP
45:
}
C:
0x06BC22RET
分析上述反汇编代码,可知延时公式为15*(t+1)
/*
************************************
函数:
RST_DS18B20
功能:
复位DS18B20,读取存在脉冲并返回
参数:
无
返回:
1:
复位成功;0:
复位失败
说明:
拉低总线至少480us;可用于检测DS18B20工作是否正常
******************************************
*/
bitRST_DS18B20()
{
bitret="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);
}
写时序:
READ/WRITETIMESLOTS
读写时隙
ThebusmasterwritesdatatotheDS18B20duringwritetimeslotsandreadsdatafromtheDS18B20duringreadtimeslots.Onebitofdataistransmittedoverthe1-Wirebuspertimeslot.
主机在写时隙向DS18B20写入数据,并在读时隙从DS18B20读入数据。
在单总线上每个时隙只传送一位数据。
WRITETIMESLOTS
写时间隙
Therearetwotypesofwritetimeslots:
“Write1”timeslotsand“Write0”timeslots.ThebusmasterusesaWrite1timeslottowritealogic1totheDS18B20andaWrite0timeslottowritealogic0totheDS18B20.Allwritetimeslotsmustbeaminimumof60μsindurationwithaminimumofa1μsrecovery
timebetweenindividualwriteslots.Bothtypesofwritetimeslotsareinitiatedbythemasterpullingthe1-Wirebuslow(seeFigure14).
有两种写时隙:
写“0”时间隙和写“1”时间隙。
总线主机使用写“1”时间隙向DS18B20写入逻辑1,使用写“0”时间隙向DS18B20写入逻辑0.所有的写时隙必须有最少60us的持续时间,相邻两个写时隙必须要有最少1us的恢复时间。
两种写时隙都通过主机拉低总线产生(见插图14)。
TogenerateaWrite1timeslot,afterpullingthe1-Wirebuslow,thebusmastermustreleasethe1-Wirebuswithin15μs.Whenthebusisreleased,the5kΩpullupresistorwillpullthebushigh.TogenerateaWrite0timeslot,afterpullingthe1-Wirebuslow,thebusmastermustcontinuetoholdthebuslowfor
thedurationofthetimeslot(atleast60μs).
为产生写1时隙,在拉低总线后主机必须在15μs释放总线。
在总线被释放后,由于5kΩ上拉电阻的作用,总线恢复为高电平。
为产生写0时隙,在拉低总线后主机必须继续拉低总线以满足时隙持续时间的要求(至少60μs)。
TheDS18B20samplesthe1-Wirebusduringawindowthatlastsfrom15μsto60μsafterthemasterinitiatesthewritetimeslot.Ifthebusishighduringthesamplingwindow,a1iswrittentotheDS18B20.Ifthelineislow,a0iswrittentotheDS18B20.
在主机产生写时隙后,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为待写的位
返回:
无
说明:
总线从高拉到低产生写时序
******************************************
*/
voidWR_Bit(biti)
{
DQ=0;//产生写时序
_nop_();
_nop_();//总线拉低持续时间要大于1us
DQ=i;//写数据,0和1均可
Delayxus_DS18B20(3);//延时60us,等待ds18b20采样读取
DQ=1;//释放总线
}
/*
***********************************
函数:
WR_Byte
功能:
DS18B20写字节函数,先写最低位
参数:
dat为待写的字节数据
返回:
无
说明:
无
******************************************
*/
voidWR_Byte(unsignedchardat)
{
unsignedchari="0";
while(i++<8)
{
WR_Bit(dat&0x01);//从最低位写起
dat>>=1;//注意不要写成dat>>1
}
}读时序:
READTIMESLOTS
读时间隙
TheDS18B20canonlytransmitdatatothemasterwhenthemasterissuesreadtimeslots.Therefore,themastermustgeneratereadtimeslotsimmediatelyafterissuingaReadScratchpad[BEh]orReadPowerSupply[B4h]command,sothattheDS18B20canprovidetherequesteddata.Inaddition,themastercangeneratereadtimeslotsafterissuingConvertT[44h]orRecall
E2[B8h]commandstofindoutthestatusoftheoperationasexplainedintheDS18B20FunctionCommandssection.
DS18B20只有在主机发出读时隙后才会向主机发送数据。
因此,在发出读暂存器命令[BEh]或读电源命令[B4h]后,主机必须立即产生读时隙以便DS18B20提供所需数据。
另外,主机可在发出温度转换命令T[44h]或Recall命令E2[B8h]后产生读时隙,以便了解操作的状态(在DS18B20操作指令这一节会详细解释)。
Allreadtimeslotsmustbeaminimumof60μsindurationwithaminimumofa1μsrecoverytimebetweenslots.Areadtimeslotisinitiatedbythemasterdevicepullingthe1-Wirebuslowforaminimumof1μsandthenreleasingthebus(seeFigure14).Afterthemasterinitiatesthereadtimeslot,theDS18B20willbegintransmittinga1or0onbus.TheDS18B20transmitsa1byleavingthebushighandtransmitsa0bypullingthebuslow.Whentransmittinga0,theDS18B20willreleasethebusbytheendofthetimeslot,andthebuswillbepulledbacktoitshighidlestatebythepullupresister.OutputdatafromtheDS18B20isvalidfor15μsafterthefallingedgethatinitiatedthereadtimeslot.Therefore,themastermustreleasethebusandthensamplethebusstatewithin15μsfromthestartoftheslot.
所有的读时隙必须至少有60us的持续时间。
相邻两个读时隙必须要有最少1us的恢复时间。
所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。
在主机产生读时隙后,DS18B20开始发送0或1到总线上。
DS18B20让总线保持高电平的方式发送1,以拉低总线的方式表示发送0.当发送0的时候,DS18B20在读时隙的末期将会释放总线,总线将会被上拉电阻拉回高电平(也是总线空闲的状态)。
DS18B20输出的数据在下降沿(下降沿产生读时隙)产生后15us后有效。
因此,主机释放总线和采样总线等动作要在15μs完成。
Figure15illustratesthatthesumofTINIT,TRC,andTSAMPLEmustbelessthan15μsforareadtimeslot.
插图15表明了对于读时隙,TINIT(下降沿后低电平持续时间),TRC(上升沿)和TSAMPLE(主机采样总线)的时间和要在15μs以。
Figure16showsthatsystemtimingmarginismaximizedbykeepingTINITandTRCasshortaspossibleandbylocatingthemastersampletimeduringreadtimeslotstowardstheendofthe15μsperiod.
插图16显示了最大化系统时间宽限的方法:
让TINIT和TRC尽可能的短,把主机采样总线放到15μs这一时间段的尾部。
由文档可知,DS18B20只有在主机发出读时隙时才能发送数据到主机。
因此,主机必须在BE命令,B4命令后立即产生读时隙以使DS18B20提供相应的数据。
另外,在44命令,B8命令后也要产生读时隙。
所有的读时隙必须至少有60us的持续时间。
相邻两个读时隙必须要有最少1us的恢复时间。
所有的读时隙都由拉低总线,持续至少1us后再释放总线(由于上拉电阻的作用,总线恢复为高电平)产生。
DS18B20输出的数据在下降沿产生后15us后有效。
因此,释放总线和主机采样总线等动作要在15us完成。
满足以上要求的函数为:
/*
***********************************
函数:
Read_Bit
功能:
向DS18B20读一位数据
参数:
无
返回:
biti
说明:
总线从高拉到低,持续至1us以上,再释放总线为高电平空闲状态产生读时序
******************************************
*/
unsignedcharRead_Bit()
{
unsignedcharret;
DQ=0;//拉低总线
_nop_();_nop_();
DQ=1;//释放总线
_nop_();_nop_();
_nop_();_nop_();
ret=DQ;//读时隙产生7us后读取总线数据。
把总线的读取动作放在15us时间限制的后面是为了保证数据读取的有效性
Delayxus_DS18B20(3);//延时60us,满足读时隙的时间长度要求
DQ=1;//释放总线
returnret;//返回读取到的数据
}
/*
************************************
函数:
Read_Byte
功能:
DS18B20读一个字节函数,先读最低位
参数:
无
返回:
读取的一字节数据
说明:
无
******************************************
*/
unsignedcharRead_Byte()
{
unsignedchari;
unsignedchardat="0";
for(i=0;i<8;i++)
{
dat>>=1;//先读最低位
if(Read_Bit())
dat|=0x80;
}
return(dat);
}
/*
************************************
函数:
Start_DS18B20
功能:
启动温度转换
参数:
无
返回:
无
说明:
复位后写44H命令
******************************************
*/
voidStart_DS18B20()
{
DQ=1;
RST_DS18B20();
WR_Byte(0xcc);//skip
WR_Byte(0x44);//启动温度转换
}
/*
************************************
函数:
Read_Tem
功能:
读取温度
参数:
无
返回:
int型温度数据,高八位为高八位温度数据,低八位为低八位温度数据
说明:
复位后写BE命令
******************************************
*/
intRead_Tem()
{
inttem="0";
RST_DS18B20();
WR_Byte(0xcc);//skip
WR_Byte(0xbe);//发出读取命令
tem=Read_Byte();//读出温度低八位
tem|=(((int)Read_Byte())<<8);//读出温度高八位
returntem;
}