DS18B20時序分析
時間(jian):2018-09-25 來源:未知

1、過(guo)程1、2是初始(shi)化過(guo)程,每次讀取都要初始(shi)化,否則(ze)18b20處于待機狀態,無法成(cheng)功讀取。過(guo)程1:拉(la)低信號(hao)線480-700us,使它復位,然(ran)后(hou)釋放(fang)總(zong)線15-60us,18b20會拉(la)低總(zong)線60-240us,然(ran)后(hou)它釋放(fang)總(zong)線。所以初始(shi)化成(cheng)功的(de)一個標(biao)志就(jiu)是能否讀到18b20這個先(xian)低后(hou)高的(de)操作時序(xu)。
(注意:黑色部(bu)分表示(shi)主機操作(zuo),藍色部(bu)分表示(shi)18b20操作(zuo),每次主機操作(zuo)完成之后等待18b20狀態(tai)(tai)時,必須要釋放(fang)總(zong)線(xian),比如將IO設置為高阻態(tai)(tai)什么的。否則18B20沒法把(ba)狀態(tai)(tai)寫(xie)到線(xian)上)
2、過(guo)(guo)程(cheng)(cheng)3、4是寫(xie)(xie)1bit數據過(guo)(guo)程(cheng)(cheng)。過(guo)(guo)程(cheng)(cheng)3是寫(xie)(xie)0 ,過(guo)(guo)程(cheng)(cheng)4是寫(xie)(xie)1。過(guo)(guo)程(cheng)(cheng)3:拉低總線60us,然后抬高總線5us,完成(cheng)。過(guo)(guo)程(cheng)(cheng)4:拉低總線5us,然后抬高總線60us,完成(cheng)
3、過(guo)(guo)(guo)程(cheng)5、6是讀(du)1bit過(guo)(guo)(guo)程(cheng)。過(guo)(guo)(guo)程(cheng)5是讀(du)0,過(guo)(guo)(guo)程(cheng)6是讀(du)1。過(guo)(guo)(guo)程(cheng)5、6:拉低總線(xian)5us,然后釋(shi)放總線(xian),讀(du)取總線(xian),如(ru)果為0,則讀(du)入0,如(ru)果為1,則讀(du)入1。
DS18B20時序(xu)
初始化序列(lie)——復位和存在(zai)脈沖
DS18B20的(de)所有通信(xin)都由(you)(you)(you)由(you)(you)(you)復(fu)位(wei)脈(mo)沖(chong)組成的(de)初始(shi)化序列開始(shi)。該初始(shi)化序列由(you)(you)(you)主機發出(chu),后(hou)跟由(you)(you)(you)DS18B20發出(chu)的(de)存(cun)在(zai)(zai)脈(mo)沖(chong)(presence pulse)。下圖(插圖13,即如(ru)下截圖)闡(chan)述了(le)這(zhe)一(yi)點。當發出(chu)應答復(fu)位(wei)脈(mo)沖(chong)的(de)存(cun)在(zai)(zai)脈(mo)沖(chong)后(hou),DS18B20通知(zhi)主機它(ta)在(zai)(zai)總線上并且準備好(hao)操作(zuo)了(le)。

在初始化步驟中,總(zong)線(xian)上(shang)的主機通過拉(la)低單總(zong)線(xian)至少480μs來產(chan)生復位脈沖。然后總(zong)線(xian)主機釋(shi)放總(zong)線(xian)并進入接(jie)收模式。
當總線(xian)(xian)釋放后(hou),5kΩ的上拉電(dian)阻把單(dan)總線(xian)(xian)上的電(dian)平拉回(hui)高電(dian)平。當DS18B20檢(jian)測到上升沿后(hou)等待15到60us,然(ran)后(hou)以拉低總線(xian)(xian)60-240us的方(fang)式發出存在脈沖(chong)。
如文檔所述(shu),主機將總線拉低短480us,之后釋放總線。由于5kΩ上(shang)拉電阻的作用,總線恢復(fu)到高電平。DS18B20檢測到上(shang)升沿后等待15到60us,發出(chu)存在脈沖:拉低總線60-240us。至此(ci),初(chu)始化和存在時序(xu)完畢。
根據上述(shu)要求編寫的復位函(han)數為:
首先是延(yan)(yan)時(shi)(shi)函(han)數(shu):(由(you)于DS18B20延(yan)(yan)時(shi)(shi)均以15us為(wei)單位,故編寫了延(yan)(yan)時(shi)(shi)單位為(wei)15us的延(yan)(yan)時(shi)(shi)函(han)數(shu),注意:以下延(yan)(yan)時(shi)(shi)函(han)數(shu)晶振為(wei)12MHz)
/*
************************************
函數:Delayxus_DS18B20
功能:DS18B20延(yan)時函數
參數:t為定時(shi)時(shi)間(jian)長度
返回:無
說明: 延時(shi)公(gong)式(shi):15n+15(近似),晶振12Mhz
******************************************
*/
void Delayxus_DS18B20(unsigned int t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}
延時函數反(fan)匯編代碼(方便分析延時公式(shi))
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
分析上述反匯編(bian)代碼,可知延時(shi)公式(shi)為15*(t+1)
/*
************************************
函數:RST_DS18B20
功能:復位(wei)DS18B20,讀取(qu)存(cun)在脈沖并返回
參數:無
返回:1:復位成功 ;0:復位失敗
說明: 拉(la)低總(zong)線至少480us ;可(ke)用于檢測DS18B20工作(zuo)是否正(zheng)常
******************************************
*/
bit RST_DS18B20()
{
bit ret="1";
DQ=0;/*拉(la)低(di)總線 */
Delayxus_DS18B20(32);/*為保險起見,延時495us */
DQ=1;/*釋(shi)放總線 ,DS18B20檢(jian)測到上升沿后(hou)會發(fa)送存在脈沖*/
Delayxus_DS18B20(4);/*需要等待15~60us,這里延時(shi)75us后(hou)可(ke)以保證接受到的是存在脈(mo)沖(如果(guo)通(tong)信正(zheng)常的話) */
ret=DQ;
Delayxus_DS18B20(14);/*延時495us,讓ds18b20釋(shi)放總線,避免(mian)影響到(dao)下一步的操作(zuo) */
DQ=1;/*釋放(fang)總線 */
return(~ret);
}
寫時序:
主機在寫(xie)時隙(xi)(xi)向DS18B20寫(xie)入(ru)數據,并在讀(du)時隙(xi)(xi)從(cong)DS18B20讀(du)入(ru)數據。在單總線上每個時隙(xi)(xi)只傳(chuan)送(song)一位數據。
寫時間隙
有兩(liang)種寫(xie)時(shi)(shi)(shi)隙(xi):寫(xie)“0”時(shi)(shi)(shi)間(jian)隙(xi)和寫(xie)“1”時(shi)(shi)(shi)間(jian)隙(xi)。總線(xian)主機使(shi)用寫(xie)“1”時(shi)(shi)(shi)間(jian)隙(xi)向(xiang)DS18B20寫(xie)入邏(luo)輯1,使(shi)用寫(xie)“0”時(shi)(shi)(shi)間(jian)隙(xi)向(xiang)DS18B20寫(xie)入邏(luo)輯0.所有的(de)寫(xie)時(shi)(shi)(shi)隙(xi)必須(xu)有少60us的(de)持續時(shi)(shi)(shi)間(jian),相鄰兩(liang)個寫(xie)時(shi)(shi)(shi)隙(xi)必須(xu)要有少1us的(de)恢復時(shi)(shi)(shi)間(jian)。兩(liang)種寫(xie)時(shi)(shi)(shi)隙(xi)都通過主機拉低總線(xian)產(chan)生(見插圖14)。

為(wei)產生(sheng)寫1時隙(xi),在拉低(di)總(zong)線后(hou)主機必(bi)須在15μs內釋(shi)放總(zong)線。在總(zong)線被(bei)釋(shi)放后(hou),由于5kΩ上拉電(dian)阻的作用,總(zong)線恢復(fu)為(wei)高電(dian)平。為(wei)產生(sheng)寫0時隙(xi),在拉低(di)總(zong)線后(hou)主機必(bi)須繼續(xu)拉低(di)總(zong)線以(yi)滿足時隙(xi)持續(xu)時間的要求(至(zhi)少60μs)。
在主(zhu)機產生寫(xie)時(shi)隙后,DS18B20會在其后的(de)15到60us的(de)一(yi)個時(shi)間窗口(kou)內(nei)采(cai)樣(yang)單總(zong)(zong)線。在采(cai)樣(yang)的(de)時(shi)間窗口(kou)內(nei),如果總(zong)(zong)線為(wei)高電平,主(zhu)機會向DS18B20寫(xie)入1;如果總(zong)(zong)線為(wei)低電平,主(zhu)機會向DS18B20寫(xie)入0。
如文(wen)檔所述,所有(you)(you)的寫時隙(xi)(xi)必(bi)須至(zhi)少有(you)(you)60us的持續時間(jian)。相鄰兩個(ge)寫時隙(xi)(xi)必(bi)須要有(you)(you)少1us的恢復時間(jian)。所有(you)(you)的寫時隙(xi)(xi)(寫0和寫1)都由拉低總線產生。
為產生寫1時(shi)隙,在(zai)拉低(di)總(zong)線后主機必須在(zai)15us內釋放總(zong)線(拉低(di)的電平(ping)(ping)要持續(xu)至(zhi)少1us)。由于上(shang)拉電阻的作用(yong),總(zong)線電平(ping)(ping)恢(hui)復(fu)為高電平(ping)(ping),直到完成寫時(shi)隙。
為(wei)產生寫0時隙,在拉低總(zong)線(xian)后(hou)主機持續拉低總(zong)線(xian)即可,直到寫時隙完成(cheng)后(hou)釋放總(zong)線(xian)(持續時間(jian)60-120us)。
寫時隙產生后,DS18B20會在產生后的15到60us的時間內采樣總線,以此來(lai)確定寫0還是寫1。
滿足上述要(yao)求的寫函數為:
/*
************************************
函數:WR_Bit
功能:向DS18B20寫(xie)一位數據
參數:i為(wei)待寫的位
返回:無
說明: 總線從高(gao)拉(la)到(dao)低產生寫(xie)時序
******************************************
*/
void WR_Bit(bit i)
{
DQ=0;//產生寫時序
_nop_();
_nop_();//總線拉(la)低持(chi)續時(shi)間要(yao)大于1us
DQ=i;//寫數據(ju) ,0和(he)1均可
Delayxus_DS18B20(3);//延時(shi)60us,等待ds18b20采(cai)樣讀取
DQ=1;//釋放總線
}
/*
***********************************
函數:WR_Byte
功能:DS18B20寫字節函數,先(xian)寫低(di)位
參數:dat為待(dai)寫的字節數據
返回:無
說明:無
******************************************
*/
void WR_Byte(unsigned char dat)
{
unsigned char i="0";
while(i++<8)
{
WR_Bit(dat&0x01);//從低位寫起
dat>>=1; //注意不要寫成dat>>1
}
}
讀時序:
DS18B20只(zhi)有(you)在(zai)主(zhu)(zhu)機(ji)發(fa)(fa)出讀(du)時(shi)隙(xi)后(hou)才會(hui)向主(zhu)(zhu)機(ji)發(fa)(fa)送數據。因(yin)此,在(zai)發(fa)(fa)出讀(du)暫存器命令(ling) [BEh]或讀(du)電源命令(ling)[B4h]后(hou),主(zhu)(zhu)機(ji)必須立即產生讀(du)時(shi)隙(xi)以(yi)便(bian)DS18B20提供所(suo)需數據。另外,主(zhu)(zhu)機(ji)可(ke)在(zai)發(fa)(fa)出溫度轉(zhuan)換命令(ling)T [44h]或Recall命令(ling)E 2[B8h]后(hou)產生讀(du)時(shi)隙(xi),以(yi)便(bian)了解操(cao)作(zuo)的(de)狀態(在(zai) DS18B20操(cao)作(zuo)指(zhi)令(ling)這(zhe)一節會(hui)詳細解釋)。
所有(you)的(de)讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi)必(bi)須至(zhi)少(shao)(shao)有(you)60us的(de)持(chi)續時(shi)(shi)(shi)(shi)(shi)間(jian)(jian)。相鄰兩個讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi)必(bi)須要有(you)少(shao)(shao)1us的(de)恢復(fu)時(shi)(shi)(shi)(shi)(shi)間(jian)(jian)。所有(you)的(de)讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi)都由(you)拉(la)(la)低總(zong)線,持(chi)續至(zhi)少(shao)(shao)1us后(hou)(hou)再釋放總(zong)線(由(you)于上拉(la)(la)電阻的(de)作用,總(zong)線恢復(fu)為(wei)高電平(ping))產生(sheng)。在主(zhu)(zhu)機產生(sheng)讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi)后(hou)(hou),DS18B20開始發(fa)送(song)0或1到(dao)總(zong)線上。DS18B20讓總(zong)線保持(chi)高電平(ping)的(de)方式發(fa)送(song)1,以拉(la)(la)低總(zong)線的(de)方式表示發(fa)送(song)0.當發(fa)送(song)0的(de)時(shi)(shi)(shi)(shi)(shi)候,DS18B20在讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi)的(de)末期將會釋放總(zong)線,總(zong)線將會被上拉(la)(la)電阻拉(la)(la)回高電平(ping)(也是總(zong)線空閑的(de)狀態)。DS18B20輸(shu)出的(de)數據在下降沿(下降沿產生(sheng)讀時(shi)(shi)(shi)(shi)(shi)隙(xi)(xi))產生(sheng)后(hou)(hou)15us后(hou)(hou)有(you)效。因此,主(zhu)(zhu)機釋放總(zong)線和采樣總(zong)線等(deng)動作要在15μs內完成。
插圖15表明了對于(yu)讀時隙,TINIT(下降沿(yan)(yan)后低電平(ping)持續時間(jian)), TRC(上升(sheng)沿(yan)(yan))和TSAMPLE(主(zhu)機采樣總線)的時間(jian)和要在15μs以內。
插(cha)圖16顯(xian)示(shi)了大(da)化系統時(shi)(shi)間寬限(xian)的(de)方(fang)法:讓TINIT 和TRC盡可能的(de)短,把(ba)主機(ji)采樣總(zong)線放到15μs這(zhe)一時(shi)(shi)間段的(de)尾(wei)部(bu)。

由文檔可知,DS18B20只有在主(zhu)(zhu)機發出(chu)讀(du)時(shi)(shi)(shi)隙(xi)時(shi)(shi)(shi)才(cai)能發送數據(ju)到主(zhu)(zhu)機。因此(ci),主(zhu)(zhu)機必須在BE命令(ling),B4命令(ling)后立即(ji)產(chan)生讀(du)時(shi)(shi)(shi)隙(xi)以使DS18B20提供相應的數據(ju)。另外,在44命令(ling),B8命令(ling)后也(ye)要產(chan)生讀(du)時(shi)(shi)(shi)隙(xi)。
所有(you)的(de)(de)讀時(shi)(shi)隙必(bi)須至少(shao)有(you)60us的(de)(de)持續時(shi)(shi)間。相鄰兩個讀時(shi)(shi)隙必(bi)須要(yao)(yao)有(you)少(shao)1us的(de)(de)恢復時(shi)(shi)間。所有(you)的(de)(de)讀時(shi)(shi)隙都由(you)拉(la)(la)低總線(xian)(xian),持續至少(shao)1us后(hou)(hou)(hou)再釋(shi)放總線(xian)(xian)(由(you)于上拉(la)(la)電阻的(de)(de)作用(yong),總線(xian)(xian)恢復為高電平)產生。DS18B20輸出的(de)(de)數(shu)據在下降(jiang)沿(yan)產生后(hou)(hou)(hou)15us后(hou)(hou)(hou)有(you)效。因此,釋(shi)放總線(xian)(xian)和主(zhu)機采樣(yang)總線(xian)(xian)等動作要(yao)(yao)在15us內完成。
滿足以(yi)上(shang)要求的函數為:
/*
***********************************
函(han)數:Read_Bit
功能:向DS18B20讀一位數(shu)據
參數:無
返(fan)回:bit i
說明: 總(zong)線從高(gao)(gao)拉(la)到低,持續至(zhi)1us以(yi)上,再釋放總(zong)線為高(gao)(gao)電平(ping)空(kong)閑狀態產生讀時序
******************************************
*/
unsigned char Read_Bit()
{
unsigned char ret;
DQ=0;//拉低總(zong)線
_nop_(); _nop_();
DQ=1;//釋放總線(xian)
_nop_(); _nop_();
_nop_(); _nop_();
ret=DQ;//讀(du)時(shi)隙產生7 us后讀(du)取總(zong)線數據。把總(zong)線的(de)讀(du)取動作放在15us時(shi)間限制的(de)后面是為(wei)了保(bao)證(zheng)數據讀(du)取的(de)有效性
Delayxus_DS18B20(3);//延時60us,滿(man)足讀時隙(xi)的(de)時間長度要求
DQ=1;//釋(shi)放(fang)總線(xian)
return ret; //返(fan)回讀取(qu)到的數據
}
/*
************************************
函數:Read_Byte
功能(neng):DS18B20讀(du)一個字(zi)節函數,先讀(du)低位(wei)
參數:無
返回:讀取(qu)的一(yi)字節數據
說明: 無
******************************************
*/
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
功(gong)能:啟動溫度轉(zhuan)換
參數:無
返回:無
說明: 復位后寫(xie)44H命令
******************************************
*/
void Start_DS18B20()
{
DQ=1;
RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0x44);//啟動溫度轉換
}
/*
************************************
函數:Read_Tem
功能:讀取溫度
參數:無
返回:int型溫(wen)度(du)數(shu)據,高(gao)八位(wei)為高(gao)八位(wei)溫(wen)度(du)數(shu)據,低八位(wei)為低八位(wei)溫(wen)度(du)數(shu)據
說(shuo)明: 復位后(hou)寫(xie)BE命令
******************************************
*/
int Read_Tem()
{
int tem="0";
RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0xbe);//發出讀取命令
tem=Read_Byte();//讀出溫(wen)度低八位
tem|=(((int)Read_Byte())<<8);//讀出溫度高八(ba)位
return tem;
}
注(zhu): DS18B20官方文檔中(zhong)沒有說明讀寫(xie)數據位的(de)順序,查了下資料(liao),DS18B20讀寫(xie)數據都是從低位讀寫(xie)的(de)。

