單總線,即一根線進行通信,最常用的溫感 DS18B20 采用的就是單總線結構。
??一、概述
??二、硬件結構
??三、單總線的時序圖
??四、實測分析時序
??五、DS18B20
單總線是美國 DALLAS 公司推出的外圍串行擴展總線技術,與 SPI、I2C 串行數據通信方式不同,它采用單根信號線,既傳輸時鐘又傳輸數據,而且數據傳輸是雙向的。
單總線英文名 1-Wire,傳輸速率一般是 15.3Kbit/s,最大可達 142Kbit/s,通常采用 100Kbit/s 以下的速率傳輸數據。
單總線適用于單主機系統,能夠控制一個或多個從機設備。主機可以是微控制器,從機可以是單總線器件,它們之間的數據交換只通過一條信號線。

單總線主機或從機設備通過一個漏極開路或三態端口連接至該數據線,由于是開漏結構,需要在數據線上加一個上拉電阻,一般是 4.7K。
為了確保總線上的某些器件在工作時(如溫度傳感器進行溫度轉換、E2PROM 寫人數據時)有足夠的電流供給,除了上拉電阻之外,還需要在總線上使用 MOSFET 提供強上拉供電,大多數的應用這個強上拉是不需要的。
主機或從機將數據線拉低到GND表示數據0,將數據線釋放為高表示數據1。

單總線典型內部結構框圖
單總線器件內部設置有寄生供電電路(Parasite Power Circuit)。

主機通過 64 全球唯一的 ROM ID 來識別掛在總線網絡上的從機。
每個單總線器件都有一個全球唯一的 64 位 ROM ID,該注冊碼保證唯一的身份,并用于多節點 1-Wire 網絡中的器件尋址,64 位 ROM 注冊碼不可更改,ROM ID 由出廠激光刻度在單總線器件內部。
64 位 ROM ID 組成:前 8 位是 1-WIRE 家族碼,后 48 位是唯一的序列號、最后 8 位是由前 56 位 ROM 碼所計算出的 CRC 校驗碼。

64位ROM ID組成
節省 I/O 口線、資源結構簡單、成本低廉、便于總線擴展和維護等諸多優點。
由于所有設備部件均掛在單一總線上,使這種結構只能分時工作,即同一時刻只能在兩個設備之間傳送數據,這就使系統總體數據傳輸的效率和速度受到限制,這是單總線結構的主要缺點。
1-Wire 器件需要嚴格的協議來保證數據的完整。
如下給出了時序的波形圖,在后面實測波形會詳細介紹時序要求。

復位/應答脈沖

寫1和寫0時隙

讀1和讀0時隙

波形定義
四、實測分析時序
復位/應答脈沖要求:主機拉低總線 480~960us 來產生復位信號,然后釋放總線進入接收模式,接著從機等待 15-60us(上拉電阻上拉至高電平),從機再拉低總線 60-240us 來產生應答信號,主機接收到從機的應答信號后,表明從機準備就緒,初始化過程完成了。

實測復位應答信號
寫0時隙要求:寫 0 時隙起始于主機拉低總線,主機拉低總線后,只需在整個時隙期間保持總線低電平在 60us 以上,一般是 60~120us 之間。

實測寫0時隙
寫1時隙要求:寫 1 時隙和寫 0 時隙一樣,起始于主機拉低總線,在拉低總線 15us 之內需要將總線拉高,拉高總線需要維持 60us 以上。

實測寫1時隙

實測讀0時隙
五、DS18B20
DS18B20 是學習 51 單片機中時,最常用的溫感,采用的就是單總線結構。其供電方式有兩種,一種是總線寄生電源,一種是使用外部電源。

DS18B20采用寄生電源

利用單片機從DS18B20 獲取溫度。
分四步:初始化(復位/應答)→ 寫字節 → 讀字節 → 計算溫度。
如下是給出的代碼示例。
#include"delay.h"#include"18b20.h"/*------------------------------------------------18b20初始化------------------------------------------------*/bit Init_DS18B20(void){bit dat=0;DQ = 1; //DQ復位DelayUs2x(5); //稍做延時DQ = 0; //單片機將DQ拉低DelayUs2x(200); //精確延時 大于 480us 小于960usDelayUs2x(200);DQ = 1; //拉高總線DelayUs2x(50); //15~60us 后 接收60-240us的存在脈沖dat=DQ; //如果x=0則初始化成功, x=1則初始化失敗DelayUs2x(25); //稍作延時返回return dat;}/*------------------------------------------------讀取一個字節------------------------------------------------*/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--){DQ = 0; // 給脈沖信號dat>>=1;DQ = 1; // 給脈沖信號if(DQ)dat|=0x80;DelayUs2x(25);}return(dat);}/*------------------------------------------------寫入一個字節------------------------------------------------*/void WriteOneChar(unsigned char dat){unsigned char i=0;for (i=8; i>0; i--){DQ = 0;DQ = dat&0x01;DelayUs2x(25);DQ = 1;dat>>=1;}DelayUs2x(25);}/*------------------------------------------------讀取溫度------------------------------------------------*/unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳過讀序號列號的操作WriteOneChar(0x44); // 啟動溫度轉換DelayMs(10);Init_DS18B20();WriteOneChar(0xCC); //跳過讀序號列號的操作WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度a=ReadOneChar(); //低位b=ReadOneChar(); //高位b<<=8;t=a+b;return(t);}
今天的文章到這里就結束了。。。
你學到了嗎?
原文來源于: 公眾號:記得誠 版權歸原作者或平臺所有,僅供學習參考與學術研究,如有侵權,麻煩聯系刪除~感謝 往期推薦:
廢舊板子再利用:搭建無線調試環境!
分享嵌入式軟件調試方法及幾個有用的工具!
手把手教你使用VSCode + gdb + gdbserver調試ARM程序
嵌入式大雜燴周記 | 第 9 期
嵌入式段錯誤的3種調試方法匯總!
寫國際化的嵌入式代碼,時間問題如何處理?
在公眾號聊天界面回復1024,可獲取嵌入式資源;回復?m?,可查看文章匯總。