作為一種單主機多從機的匯流排系統,在一條1-Wire匯流排上可掛接的從器件數量幾乎不受限制。為了不引起邏輯上的衝突,所有從器件的1-Wire匯流排接口都是漏極開路的,因此在使用時必須對匯流排外加上拉電阻(一般取5kΩ 左右)。主機對1-Wire匯流排的基本操作分為復位、讀和寫三種,其中所有的讀寫操作均為低位在前高位在後。復位、讀和寫是1-Wire匯流排通信的基礎,下面通過具體程式詳細介紹這3種操作的時序要求。(程式中DQ代表1-Wire匯流排,定義為P1.0,uchar定義為unsigned char)
1-Wire匯流排的復位
復位是1-Wire匯流排器件在接收到有效跳變的15~60μs內會將匯流排拉低60~240μs,在此期間主機可以通過對DQ採樣來判斷是否有從器件掛接在當前匯流排上。函式Reset()的返回值為0表示有器件掛接在匯流排上,返回值為1表示沒有器件掛接在匯流排上。
程式1.1 匯流排復位
uchar Reset(void)
{
uchar tdq;
DQ=0; //主機拉低匯流排
delay480μs(); //等待480μs
DQ=1; //主機釋放匯流排
delay60μs(); //等待60μs
tdq=DQ; //主機對匯流排採樣
delay480μs(); //等待覆位結束
return tdq; //返回採樣值
}
1-Wire匯流排的寫操作
由於只有一條I/O線,主機1-Wire匯流排的寫操作只能逐位進行,連續寫8次即可寫入匯流排一個位元組。如程式1.2所示,當MCS-51單片機的時鐘頻率為12MHz時,程式中的語句_nop_();可以產生 1μs的延時,調用此函式時需包含頭檔案“intrins.h”。向1-Wire匯流排寫1bit至少需要60μs,同時還要保證兩次連續的寫操作有1μs 以上的間隔。若待寫位wbit為0則主機拉低匯流排60μs然後釋放,寫0操作完成。若待寫位wbit為1,則主機拉低匯流排並在1~15μs內釋放,然後等待60μs,寫1操作完成。
程式1.2 向匯流排寫1bit
void Writebit(uchar wbit)
{
_nop_();
//保證兩次寫操作間隔1μs以上
DQ=0;
_nop_();
//保證主機拉低匯流排1μs以上
if(wbit)
{
//向匯流排寫1
DQ=1;
delay60μs();
}
else
{
//向匯流排寫0
delay60μs();
DQ=1;
}
}
1-Wire匯流排的讀操作
與寫操作類似,主機對1-Wire匯流排的讀操作也只能逐位進行,連續讀8次,即可讀入主機一個位元組。從1-Wire匯流排讀取1bit同樣至少需要60μs,同時也要保證兩次連續的讀操作間隔1μs以上。如程式 1.3所示,從匯流排讀數據時,主機首先拉低匯流排1μs以上然後釋放,在釋放匯流排後的1~15μs內主機對匯流排的採樣值即為讀取到的數據。
程式1.3 從匯流排讀1bit
uchar Readbit()
{
uchar tdq;
_nop_();
//保證兩次連續寫操作間隔1μs以上
DQ=0;
_nop_();
//保證拉低匯流排的時間不少於1μs
DQ=1;
_nop_();
tdq=DQ;
//主機對匯流排採樣
delay60μs();
//等待讀操作結束
return tdq;
//返回讀取到的數據
}
1-Wire匯流排ROM功能命令
在DS18B20內部光刻了一個長度為64bit的ROM編碼,這個編碼是器件的身份識別標誌。當匯流排上掛接著多個DS18B20時可以通過ROM編碼對特定器件進行操作。ROM功能命令是針對器件的ROM編碼進行操作的命令,共有5個,長度均為8bit(1Byte)。
①讀ROM(33H)
當掛接在匯流排上的1-Wire匯流排器件接收到此命令時,會在主機讀操作的配合下將自身的ROM編碼按由低位到高位的順序依次傳送給主機。匯流排上掛接有多個DS18B20時,此命令會使所有器件同時向主機傳送自身的ROM編碼,這將導致數據的衝突。
②匹配ROM(55H)
主機在傳送完此命令後,必須緊接著傳送一個64bit的ROM編碼,與此ROM編碼匹配的從器件會回響主機的後續命令,而其他從器件則處於等待狀態。該命令主要用於選擇匯流排上的特定器件進行訪問。
③跳過ROM(CCH)
④查找ROM(F0H)
當主機不知道匯流排上器件的ROM編碼時,可以使用此命令並配合特定的算法查找出匯流排上從器件的數量和各個從器件的ROM編碼。
⑤報警查找(ECH)
此命令用於查找匯流排上滿足報警條件的DS18B20,通過報警查找命令並配合特定的查找算法,可以查找出匯流排上滿足報警條件的器件數目和各個器件的ROM編碼。