1、過程1、2是初始化過程,每次讀取都要初始化,否則18b20處于待機狀態,無法成功讀取。過程1:拉低信號線480-700us,使它復位,然后釋放總線15-60us,18b20會拉低總線60-240us,然后它釋放總線。所以初始化成功的一個標志就是能否讀到18b20這個先低后高的操作時序。
(注意:黑色部分表示主機操作,藍色部分表示18b20操作,每次主機操作完成之后等待18b20狀態時,必須要釋放總線,比如將IO設置為高阻態什么的。否則18B20沒法把狀態寫到線上)
2、過程3、4是寫1bit數據過程。過程3是寫0 ,過程4是寫1。過程3:拉低總線60us,然后抬高總線5us,完成。過程4:拉低總線5us,然后抬高總線60us,完成
3、過程5、6是讀1bit過程。過程5是讀0,過程6是讀1。過程5、6:拉低總線5us,然后釋放總線,讀取總線,如果為0,則讀入0,如果為1,則讀入1。
DS18B20時序
初始化序列——復位和存在脈沖
DS18B20的所有通信都由由復位脈沖組成的初始化序列開始。該初始化序列由主機發出,后跟由DS18B20發出的存在脈沖(presence pulse)。下圖(插圖13,即如下截圖)闡述了這一點。當發出應答復位脈沖的存在脈沖后,DS18B20通知主機它在總線上并且準備好操作了。
在初始化步驟中,總線上的主機通過拉低單總線至少480μ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(unsigned int t)
{
for(t;t>0;t--)
{
_nop_();_nop_();_nop_();_nop_();
}
_nop_(); _nop_();
}
延時函數反匯編代碼(方便分析延時公式)
C:0x0031 7F01 MOV R7,#0x01
C:0x0033 7E00 MOV R6,#0x00
C:0x0035 1206A6 LCALLdelayxus(C:06A6)
38: voidDelayxus_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 JNZDelayxus_DS18B20 (C:06A6)
C:0x06B7 1E DEC R6
C:0x06B8 80EC SJMPDelayxus_DS18B20 (C:06A6)
44: _nop_(); _nop_();
C:0x06BA 00 NOP
C:0x06BB 00 NOP
45: }
C:0x06BC 22 RET
分析上述反匯編代碼,可知延時公式為15*(t+1)
/*
************************************
函數:RST_DS18B20
功能:復位DS18B20,讀取存在脈沖并返回
參數:無
返回:1:復位成功 ;0:復位失敗
說明: 拉低總線至少480us ;可用于檢測DS18B20工作是否正常
******************************************
*/
bit RST_DS18B20()
{
bit ret="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);
}
寫時序:
主機在寫時隙向DS18B20寫入數據,并在讀時隙從DS18B20讀入數據。在單總線上每個時隙只傳送一位數據。
寫時間隙
有兩種寫時隙:寫“0”時間隙和寫“1”時間隙。總線主機使用寫“1”時間隙向DS18B20寫入邏輯1,使用寫“0”時間隙向DS18B20寫入邏輯0.所有的寫時隙必須有最少60us的持續時間,相鄰兩個寫時隙必須要有最少1us的恢復時間。兩種寫時隙都通過主機拉低總線產生(見插圖14)。
為產生寫1時隙,在拉低總線后主機必須在15μs內釋放總線。在總線被釋放后,由于5kΩ上拉電阻的作用,總線恢復為高電平。為產生寫0時隙,在拉低總線后主機必須繼續拉低總線以滿足時隙持續時間的要求(至少60μs)。
在主機產生寫時隙后,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為待寫的位
返回:無
說明: 總線從高拉到低產生寫時序
******************************************
*/
void WR_Bit(bit i)
{
DQ=0;//產生寫時序
_nop_();
_nop_();//總線拉低持續時間要大于1us
DQ=i;//寫數據 ,0和1均可
Delayxus_DS18B20(3);//延時60us,等待ds18b20采樣讀取
DQ=1;//釋放總線
}
/*
***********************************
函數:WR_Byte
功能:DS18B20寫字節函數,先寫最低位
參數:dat為待寫的字節數據
返回:無
說明:無
******************************************
*/
void WR_Byte(unsigned chardat)
{
unsigned chari="0";
while(i++<8)
{
WR_Bit(dat&0x01);//從最低位寫起
dat>>=1; //注意不要寫成dat>>1
}
}
讀時序:
DS18B20只有在主機發出讀時隙后才會向主機發送數據。因此,在發出讀暫存器命令 [BEh]或讀電源命令[B4h]后,主機必須立即產生讀時隙以便DS18B20提供所需數據。另外,主機可在發出溫度轉換命令T [44h]或Recall命令E 2[B8h]后產生讀時隙,以便了解操作的狀態(在 DS18B20操作指令這一節會詳細解釋)。
所有的讀時隙必須至少有60us的持續時間。相鄰兩個讀時隙必須要有最少1us的恢復時間。所有的讀時隙都由拉低總線,持續至少1us后再釋放總線(由于上拉電阻的作用,總線恢復為高電平)產生。在主機產生讀時隙后,DS18B20開始發送0或1到總線上。DS18B20讓總線保持高電平的方式發送1,以拉低總線的方式表示發送0.當發送0的時候,DS18B20在讀時隙的末期將會釋放總線,總線將會被上拉電阻拉回高電平(也是總線空閑的狀態)。DS18B20輸出的數據在下降沿(下降沿產生讀時隙)產生后15us后有效。因此,主機釋放總線和采樣總線等動作要在15μs內完成。
插圖15表明了對于讀時隙,TINIT(下降沿后低電平持續時間), TRC(上升沿)和TSAMPLE(主機采樣總線)的時間和要在15μs以內。
插圖16顯示了最大化系統時間寬限的方法:讓TINIT 和TRC盡可能的短,把主機采樣總線放到15μs這一時間段的尾部。
由文檔可知,DS18B20只有在主機發出讀時隙時才能發送數據到主機。因此,主機必須在BE命令,B4命令后立即產生讀時隙以使DS18B20提供相應的數據。另外,在44命令,B8命令后也要產生讀時隙。
所有的讀時隙必須至少有60us的持續時間。相鄰兩個讀時隙必須要有最少1us的恢復時間。所有的讀時隙都由拉低總線,持續至少1us后再釋放總線(由于上拉電阻的作用,總線恢復為高電平)產生。DS18B20輸出的數據在下降沿產生后15us后有效。因此,釋放總線和主機采樣總線等動作要在15us內完成。
滿足以上要求的函數為:
/*
***********************************
函數:Read_Bit
功能:向DS18B20讀一位數據
參數:無
返回:bit i
說明: 總線從高拉到低,持續至1us以上,再釋放總線為高電平空閑狀態產生讀時序
******************************************
*/
unsigned char Read_Bit()
{
unsigned char ret;
DQ=0;//拉低總線
_nop_(); _nop_();
DQ=1;//釋放總線
_nop_(); _nop_();
_nop_(); _nop_();
ret=DQ;//讀時隙產生7 us后讀取總線數據。把總線的讀取動作放在15us時間限制的后面是為了保證數據讀取的有效性
Delayxus_DS18B20(3);//延時60us,滿足讀時隙的時間長度要求
DQ=1;//釋放總線
return ret; //返回讀取到的數據
}
/*
************************************
函數:Read_Byte
功能:DS18B20讀一個字節函數,先讀最低位
參數:無
返回:讀取的一字節數據
說明: 無
******************************************
*/
unsigned char Read_Byte()
{
unsigned char i;
unsigned chardat="0";
for(i=0;i<8;i++)
{
dat>>=1;//先讀最低位
if(Read_Bit())
dat|=0x80;
}
return(dat);
}
/*
************************************
函數:Start_DS18B20
功能:啟動溫度轉換
參數:無
返回:無
說明: 復位后寫44H命令
******************************************
*/
void Start_DS18B20()
{
DQ=1;
RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0x44);//啟動溫度轉換
}
/*
************************************
函數:Read_Tem
功能:讀取溫度
參數:無
返回:int型溫度數據,高八位為高八位溫度數據,低八位為低八位溫度數據
說明: 復位后寫BE命令
******************************************
*/
int Read_Tem()
{
int tem="0";
RST_DS18B20();
WR_Byte(0xcc);// skip
WR_Byte(0xbe);//發出讀取命令
tem=Read_Byte();//讀出溫度低八位
tem|=(((int)Read_Byte())<<8);//讀出溫度高八位
return tem;
}
注: DS18B20官方文檔中沒有說明讀寫數據位的順序,查了下資料,DS18B20讀寫數據都是從最低位讀寫的。
上一篇:stm8的IIC庫的使用
下一篇:STM8L之按鍵中斷
推薦閱讀
史海拾趣
面對全球市場的日益開放和競爭,Chiefdom Electronic Co Ltd積極尋求與其他行業巨頭的戰略合作。通過與全球知名的電子產品制造商、芯片供應商等建立緊密的合作關系,公司不僅獲得了更多的技術和市場資源,還進一步提升了自身的品牌影響力和市場份額。這些合作不僅幫助公司拓展了業務領域,還為其在全球電子行業中樹立了良好的口碑。
面對智能制造的浪潮,百蓉公司積極擁抱變革。他們引進了先進的自動化設備,對生產線進行了全面升級,實現了從手工制造向智能制造的轉變。這一轉型不僅提高了生產效率,還大幅提升了產品質量和產品的一致性,使得百蓉的產品在市場上更具競爭力。
面對國內市場的飽和,BOOKHAM公司決定實施國際化戰略,拓展海外市場。公司先后在多個國家和地區設立了分支機構,積極參加國際電子展會和交流活動,與國際同行建立起了廣泛的合作關系。通過不斷的努力,BOOKHAM公司的產品逐漸打入國際市場,公司的知名度和影響力也得到了顯著提升。
EOI深知客戶的重要性,因此公司一直致力于提供優質的服務。無論是售前咨詢還是售后服務,EOI都認真對待每一個客戶的需求和問題。公司建立了完善的客戶服務體系,為客戶提供及時、專業的支持。同時,EOI還定期舉辦客戶培訓和技術交流活動,提高客戶的技術水平和使用效果。這些努力使得EOI贏得了客戶的信任和忠誠度。
隨著全球市場的不斷變化和公司規模的擴大,Cal Test Electronics開始實施全球化戰略。公司積極拓展海外市場,通過參加國際展會、建立海外銷售渠道等方式,提高品牌知名度和市場份額。同時,公司還加強與國際同行的合作與交流,引進先進的技術和管理經驗,不斷提升自身的競爭力。這些努力使得Cal Test Electronics逐漸成為一個具有全球影響力的電子配件和測試產品制造商。
這些故事旨在展示Cal Test Electronics公司可能的發展軌跡和成就,但并非基于實際發生的事件。對于該公司的真實發展歷程和故事,建議查閱相關官方資料或行業報告以獲取更準確的信息。
長園維安自成立以來,始終堅持技術創新為核心競爭力。在早期發展階段,公司投入大量資源研發新型線路保護元器件,如PPTC、CPTC等。這些產品憑借其卓越的性能和穩定性,迅速在通訊、汽車電子等領域獲得廣泛應用。通過不斷創新,長園維安在電子行業樹立了技術領先的形象。
要用到CEImageDiff.exe建立工程模板,在硬盤和安裝光盤里都找不到CEImageDiff.exe,有誰知道哪里可以找到嗎? 謝謝!… 查看全部問答∨ |
我的開發板是mini2440的 現在我想移植官方的bsp到我的開發板上 ,現在通過點燈法發現我的eboot能夠走到這一步startup.s mrc p15, 0, r1, c1, c0, 0 & ...… 查看全部問答∨ |
移植了dm9000到kitl當鏡像下載完以后我看到了調試的畫面,上面有detach device 和reset device 我喜歡了reset device 后想再attach device 就不行了 出來一個下載鏡像的畫面 但是在我的印象中這不應該啊 如果我每 ...… 查看全部問答∨ |
當程序轉向執行中斷服務程序時,《外部中斷請求標志位IE0(IE1),內部定時/計數器溢出標志位TF0(TF1)》,由硬件自動清0。 我想請問哥們,到底是在什么時候(比“當程序轉向執行中斷服務程序時”更具體)清0的呢?是在IRET指令執行之后嗎?… 查看全部問答∨ |
645規約讀電表的問題,怎么也讀不出電表數據,源代碼如下:請大大們指點啊,感激不盡,小弟是新人,也不知道在哪看自己的積分,問題解決 怎么也讀不出電表數據,源代碼如下:請大大們指點啊,感激不盡,小弟是新人,也不知道在哪看自己的積分,問題解決了有分送分,沒分送q幣 #include #include #in ...… 查看全部問答∨ |
|
今天還進行著示波器設計。之前還一直好好的。就在我燒入程序的時候。也仔細檢查了下,程序確實包含了jtagwait(),防止鎖死。可惜,就在下完程序后,修改之后再下的時候就不行了。以下為截圖。悲劇啊。~大伙幫忙看看這程序有錯不。void jtagWait(voi ...… 查看全部問答∨ |
如何利用專門設計的測量室和分子束沉積(MBD)系統測量高電阻概述 晶體[1]材料是現代電子和光電子技術的基礎。因此,這些材料的電子特性,如(各向異性) 電導率和光電導率以及與這些特性有關的溫度依存性,都是研究人員關注的問題。采用大量結晶技術的晶體生長尺寸可能不大,但往往表現出極高的電阻。這個應用筆記 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 將低功耗設計進行到底——評論、轉發贏大禮!
- 芯幣競拍:感恩教師節專場
- Keysight示波器主題月有獎系列活動之 注冊大獎天天抽 搶樓踩中亦有獎
- Microchip有獎直播:VectorBlox™ SDK 報名中
- 有獎直播|ADI 慣性MEMS應用那些事
- 借助 Microchip 生態系統中的 PIC® 和 AVR® 單片機開啟嵌入式到云端之旅 系列在線研討會
- 帶你零起點入門STM32(專為嵌入式應用而開發的內核)
- 福祿克首款熱成像萬用表Fluke-279FC 即將上市!填寫問卷贏好禮嘍!
- EEWorld Datasheet 伴你同行!快來領取200芯積分福利啦~
- 泰克福袋:示伴功倍,萬能福袋派送中