一、1-Wire相關介紹
- 1-Wire由 美國Dallas(達拉斯) 公司推出
- 採用單根信號線,既傳輸時鐘又傳輸數據,而且數據傳輸是雙向的
- 單總線的數據傳輸速率一般爲16.3Kbit/s,最大可達142 Kbit/s,通常情況下采用100Kbit/s以下的速率傳輸數據
- 1-Wire線端口爲漏極開路構或三態門的端口,因此一般需要加上拉電阻Rp,通常選用5K~10KΩ
- 1-Wire數據傳輸的次序爲從最低位到最高位,與I2C不同
1.典型命令序列:
- (1)初始化:單總線上所有傳輸過程都需要以初始化開始
- (2)ROM命令:在主機檢測到從機的應答脈衝後,就可以發出ROM命令
- (3)功能命令:每個單總線器件都有自己的專用指令,需要參照各自的數據手冊
2.典型電路圖:
二、1-Wire通信過程
1.初始化
- 初始化過程 = 復位脈衝 + 從機應答脈衝
- 主機通過拉低單總線480 ~ 960 us產生復位脈衝,然後釋放總線,進入接收模式。主機釋放總線時,會產生低電平跳變爲高電平的上升沿
- 單總線器件檢測到上升沿之後,延時15 ~ 60 us,單總線器件拉低總線60 ~ 240 us來產生應答脈衝。主機接收到從機的應答脈衝說明單總線器件就緒,初始化過程完成。
2.寫操作
- 寫間隙有兩種,包括寫0的時間隙和寫1的時間隙
- 當數據線拉低後,在15 ~ 60 us的時間窗口內對數據線進行採樣。如果數據線爲低電平,就是寫0,如果數據線爲高電平,就是寫1。
- 主機要產生一個寫1時間隙,就必須把數據線拉低,在寫時間隙開始後的15 us內允許數據線拉高(即在0~15us內釋放總線)。主機要產生一個寫0時間隙,就必須把數據線拉低並保持60 us
3.讀操作
- 與寫操作一樣,讀操作至少需要60us,在兩次獨立的讀操作直接至少需要1us的恢復時間,所有的讀操作都是由主機拉低總線並保持至少1us後,再釋放總線開始
- 讀操作,主機拉低總線1us,隨後釋放總線,若發送“1”,則保持總線爲高電平;若發送“0”,則拉低總線並在該週期結束後釋放總線
三、1-Wire程序(以DS18B20爲例)
DS18B20功能命令
命令 |
命令代碼 |
跳過ROM |
CCH |
啓動轉換 |
44H |
讀取暫存器 |
BEH |
unsigned char DS18B20_RST(void)
{
unsigned char Check;
DQ = 0;
delay_us(480);
DQ = 1;
delay_us(60);
Check = DQ;
delay_us(480);
return Check;
}
void DS18B20_Write_Byte(unsigned char data)
{
unsigned char i = 0;
for(i = 0;i < 8 ;i++)
{
DQ = 0;
delay_us(1);
DQ = data & 0x01;
delay_us(60);
data >>= 1;
DQ= 1;
_nop_();_nop_();
}
}
unsigned char DS18B20_Read_Byte(void)
{
unsigned char i = 0;
unsigned char temp = 0;
for(i = 0;i < 8;i++)
{
_nop_();_nop_();
DQ = 0;
_nop_();_nop_();
DQ = 1;
_nop_();_nop_();
temp = DQ << 7;
data |= temp;
data >> 1;
delay_us(60);
}
}