Maxim的多款產品包含1-Wire通信接口,可用于各種應用。這些應用可能包括與Microchip流行的PICmicros(PIC)之一的接口。為了方便1-Wire器件與外設接口控制器(PIC)微控制器之間的簡單接口,本應用筆記介紹了PIC微控制器的一般1-Wire軟件例程,并解釋了時序和相關細節。本應用筆記還提供了一個涵蓋所有1-Wire例程的文件。此外,還包括匯編代碼示例,該代碼是專門為PIC16F628從DS2762高精度Li+電池監測器讀取數據而編寫的。
介紹
Microchip的PICmicro微控制器器件(PIC)已成為低功耗和低成本系統解決方案的熱門設計選擇。微控制器具有多個通用輸入/輸出(GPIO)引腳,可輕松配置為實現Maxim的1-Wire協議。1-Wire協議允許與許多Maxim器件進行交互,包括電池和熱管理、存儲器、iButton器件等。本應用筆記介紹了PIC1F16的一般628-Wire例程,并解釋了時序和相關細節。為方便起見,所有材料均假定為4MHz時鐘,該頻率可用作許多PIC的內部時鐘。本文檔的附錄A包含一個包含所有1-Wire例程的文件。附錄B給出了一個示例匯編代碼程序,用于PIC16F628從DS2762高精度Li+電池監測器讀取數據。本應用筆記僅限于常規速度的1-Wire通信。?
常規宏
要以主機形式傳輸1-Wire協議,只需要兩種GPIO狀態:高阻抗和邏輯低電平。以下 PIC 程序集代碼段實現這兩種狀態。PIC16F628有兩個GPIO端口,PORTA和PORTB。任一端口都可以設置為1-Wire通信,但在本例中,使用PORTB。此外,以下代碼假定匯編代碼中配置了一個常量DQ,以指示PORTB中的哪個位是1-Wire引腳。在整個代碼中,此位號簡稱為 DQ。在外部,該引腳必須通過上拉電阻連接到電源。
OW_HIZ:MACRO ;Force the DQ line into a high impedance state. BSF STATUS,RP0 ; Select Bank 1 of data memory BSF TRISB, DQ ; Make DQ pin High Z BCF STATUS,RP0 ; Select Bank 0 of data memory ENDM OW_LO:MACRO ;Force the DQ line to a logic low. BCF STATUS,RP0 ; Select Bank 0 of data memory BCF PORTB, DQ ; Clear the DQ bit BSF STATUS,RP0 ; Select Bank 1 of data memory BCF TRISB, DQ ; Make DQ pin an output BCF STATUS,RP0 ; Select Bank 0 of data memory ENDM
這兩個代碼片段都是作為宏編寫的。通過將代碼編寫為宏,可以使用單個宏調用將其自動插入到程序集源代碼中。這限制了必須重寫代碼的次數。第一個宏OW_HIZ強制DQ線進入高阻抗狀態。第一步是選擇數據存儲器的存儲組1,因為TRISB寄存器位于存儲組1中。接下來,通過在TRISB寄存器中設置DQ位,將DQ輸出驅動器更改為高阻抗狀態。最后一行代碼更改回數據存儲器的庫 0。最后一行不是必需的,但用于使所有宏和函數調用使數據存儲器處于已知狀態。
第二個宏OW_LO將 DQ 線強制到邏輯低電平。首先,選擇數據存儲器的組0,以便可以訪問PORTB寄存器。PORTB 寄存器是數據寄存器,包含強制到 TRISB 引腳的值(如果它們配置為輸出)。
PORTB 的 DQ 位被清除,因此線路被強制為低電平。最后,選擇數據存儲器的組1,并清除TRISB寄存器的DQ位,使其成為輸出驅動器。與往常一樣,宏以選擇數據存儲器的庫 0 結束。
包括一個標記為WAIT的最終宏,以產生1-Wire信號的延遲。WAIT 用于產生 5μs 倍數的延遲。調用宏時,TIME 值為微秒,并生成相應的延遲時間。宏只需計算需要 5μs 延遲的次數,然后在 WAIT5U 內循環。例程 WAIT5U 將在下一節中顯示。對于 WAIT 中的每個指令,處理時間都作為注釋給出,以幫助了解延遲是如何實現的。
WAIT:MACRO TIME ;Delay for TIME μs. ;Variable time must be in multiples of 5μs. MOVLW (TIME/5) - 1 ;1μs to process MOVWF TMP0 ;1μs to process CALL WAIT5U ;2μs to process ENDM
通用1線例程
1-Wire時序協議具有特定的時序約束,必須遵循這些約束才能實現成功的通信。為了幫助實現特定的時序延遲,使用例程WAIT5U產生5μs延遲。此例程如下所示。
WAIT5U: ;This takes 5μs to complete NOP ;1μs to process NOP ;1μs to process DECFSZ TMP0,F ;1μs if not zero or 2μs if zero GOTO WAIT5U ;2μs to process RETLW 0 ;2μs to process
當與 WAIT 宏結合使用時,可以生成簡單的時序延遲。例如,如果需要 40μs 延遲,則會調用 WAIT 0.40。這會導致 WAIT 中的前 3 行執行,導致 4μs。接下來,WAIT4U 中的前 5 行代碼在 5μs 內執行,循環 6 次,總共 30μs。WAIT5U的最后一個循環需要6μs,然后返回到WAIT宏。因此,總處理時間為 4 + 30 + 6 = 40μs。
2.5V < VDD <5.5V, TA= -20°C 至 +70°C | |||||
參數 | 象征 | 最小值 | 典型值 | 麥克斯 | 單位 |
時隙 | t槽 | 60 | 120 | 微秒 | |
恢復時間 | t娛樂 | 1 | 微秒 | ||
寫入 0 低時間 | t低0 | 60 | 120 | 微秒 | |
寫入 1 低時間 | t低1 | 1 | 15 | 微秒 | |
讀取數據有效 | tRDV | 15 | 微秒 | ||
復位時間高 | tRSTH | 480 | 微秒 | ||
復位時間低 | tRSTL | 480 | 960 | 微秒 | |
存在檢測高 | t帕迪亞 | 15 | 60 | 微秒 | |
存在檢測低 | tPDL | 60 | 240 | 微秒 |
任何1-Wire交易的開始都始于來自主器件的復位脈沖,然后是來自從器件的存在檢測脈沖。圖 1 說明了此事務。該初始化序列可以通過PIC輕松傳輸,匯編代碼如圖1所示。1-Wire初始化、讀取和寫入的時序規格見上表1。這些參數在文檔的其余部分中都有引用。
圖1.1-Wire初始化序列。
OW_RESET: OW_HIZ ; Start with the line high CLRF PDBYTE ; Clear the PD byte OW_LO WAIT .500 ; Drive Low for 500μs OW_HIZ WAIT .70 ; Release line and wait 70μs for PD Pulse BTFSS PORTB,DQ ; Read for a PD Pulse INCF PDBYTE,F ; Set PDBYTE to 1 if get a PD Pulse WAIT .430 ; Wait 430μs after PD Pulse RETLW 0
OW_RESET程序首先確保DQ引腳處于高阻抗狀態,以便上拉電阻將其拉高。接下來,它清除PDBYTE寄存器,以便準備驗證下一個存在檢測脈沖。之后,DQ引腳被驅動為低電平500μs。這符合 tRSTL參數如表1所示,并提供了一個20μs的附加緩沖器。將引腳驅動至低電平后,引腳釋放至高阻抗狀態,并在讀取存在檢測脈沖之前增加70μs的延遲。使用 70μs 可確保 PIC 采樣在有效時間對 t 的任意組合PDL和 t帕迪亞.讀取存在檢測脈沖后,調整PDBYTE寄存器以顯示邏輯電平讀數。然后,DQ引腳將處于高阻抗狀態再保持430μs,以確保RSTH已滿足時間,并包括一個20μs的額外緩沖器。
1-Wire通信所需的下一個例程是DSTXBYTE,用于將數據傳輸到1-Wire從器件。此例程的 PIC 代碼如圖 2 所示。此例程與要在 W 寄存器中發送的數據一起調用,并立即移動到 IOBYTE 寄存器。接下來,將 COUNT 寄存器初始化為 8,以計算從 DQ 行發送的位數。從 DSTXLP 開始,PIC 開始發送數據。首先,DQ引腳被驅動為低電平3μs,無論發送什么邏輯電平。這確保了低1時間被滿足了。接下來,IOBYTE 的 lsb 移動到 CARRY 位,然后測試一個 60 或 <>。如果CARY為<>,則設置TRISB的DQ位,將引腳變為高阻抗狀態,并通過上拉電阻將線路拉高。如果 CARRY 為零,則行保持低電平。接下來增加<>μs的延遲以允許最小t低0時間。等待60μs后,引腳變為高阻抗狀態,然后再增加2μs用于上拉電阻恢復。最后,COUNT 寄存器遞減。如果 COUNT 寄存器為零,則所有 2 位均已發送,例程已完成。如果 COUNT 寄存器不為零,則從 DSTXLP 開始發送另一個位。寫零和寫一過程的可視化解釋如圖 <> 所示。
圖2.1線寫入時隙。
DSTXBYTE: ; Byte to send starts in W MOVWF IOBYTE ; We send it from IOBYTE MOVLW .8 MOVWF COUNT ; Set COUNT equal to 8 to count the bits DSTXLP: OW_LO NOP NOP NOP ; Drive the line low for 3μs RRF IOBYTE,F BSF STATUS,RP0 ; Select Bank 1 of data memory BTFSC STATUS,C ; Check the LSB of IOBYTE for 1 or 0 BSF TRISB,DQ ; HiZ the line if LSB is 1 BCF STATUS,RP0 ; Select Bank 0 of data memory WAIT .60 ; Continue driving line for 60μs OW_HIZ ; Release the line for pullup NOP NOP ; Recovery time of 2μs DECFSZ COUNT,F ; Decrement the bit counter GOTO DSTXLP RETLW 0
1-Wire通信的最后一個例程是DSRXBYTE,它允許PIC從從器件接收信息。代碼如圖 3 所示。在任何DQ活動開始之前,COUNT寄存器初始化為8,其功能是計算接收的位數。DSRXLP 首先將 DQ 引腳驅動為低電平,向從設備發出 PIC 已準備好接收數據的信號。該線路被驅動為低電平6μs,然后通過將DQ引腳置于高阻抗狀態來釋放。接下來,PIC再等待4μs,然后對數據線進行采樣。在低行驅動后,OW_LO中有 1 行代碼,OW_HIZ內有 3 行代碼。每條線需要1μs來處理。將所有時間相加得到 1 + 6 + 3 + 4 = 14μs,略低于 tRDV規格為15μs。讀取 PORTB 寄存器后,DQ 位被屏蔽,然后將寄存器添加到 255 以強制 CARRY 位鏡像 DQ 位。然后,CARRY 位移動到存儲傳入字節的 IOBYTE 中。一旦字節被存儲,就會增加50μs的延遲,以確保槽滿足了。最后一項檢查是確定 COUNT 寄存器是否為零。如果為零,則已讀取 8 位,并退出例程。否則,將在 DSRXLP 上重復該循環。讀零和讀一事務如圖 3 所示。
圖3.1-線讀取時隙。
MOVLW .8 MOVWF COUNT ; Set COUNT equal to 8 to count the bits DSRXLP: OW_LO NOP NOP NOP NOP NOP NOP ; Bring DQ low for 6μs OW_HIZ NOP NOP NOP NOP ; Change to HiZ and Wait 4μs MOVF PORTB,W ; Read DQ ANDLW 1<
總結
Maxim的1-Wire通信協議可以在Microchip的PICmicro系列微控制器上輕松實現。要完成1-Wire交易,只需要兩種GPIO狀態,并且PIC上的多個GPIO很容易配置用于此任務。1-Wire通信需要三個基本程序:初始化、讀字節和寫字節。介紹并詳細介紹了這三個程序,以提供精確的1-Wire常規速度通信。這使得PIC能夠與Maxim 1-Wire的眾多器件中的任何一種接口。本文檔的附錄 A 在一個方便的包含文件中包含所有三個例程。附錄B包含一個小型匯編程序,用于將PIC16F628連接至DS2762高精度Li+電池監測器。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
7660瀏覽量
152186 -
控制器
+關注
關注
112文章
16468瀏覽量
179638 -
1-Wire
+關注
關注
0文章
49瀏覽量
21359
發布評論請先 登錄
相關推薦
基于C++模板技術的1-wire總線編程
1-Wire時序的理解及配置
如何訪問1-Wire API
DS2480B串行接口1-Wire 線驅動器的使用
應用筆記159絕對可靠的1-Wire通信
用軟件實現1-Wire通信
![用軟件<b class='flag-5'>實現</b><b class='flag-5'>1-Wire</b><b class='flag-5'>通信</b>](https://file1.elecfans.com//web2/M00/A4/DE/wKgZomUMNgSAEKn_AAAvMtVvKX8596.gif)
1-Wire器件與8051系列單片機的軟件接口
![<b class='flag-5'>1-Wire</b>器件與8051系列單片機的軟件接口](https://file1.elecfans.com//web2/M00/A4/EA/wKgZomUMNjGABspDAABYptDL7jI688.jpg)
DS1820單總線(1-wire)數字溫度傳感器
![DS1820單總線(<b class='flag-5'>1-wire</b>)數字溫度傳感器](https://file1.elecfans.com//web2/M00/A5/CC/wKgZomUMOiqAdkxSAABqbAcQ5yM531.jpg)
1-Wire總線主機
1-Wire通信協議的工作原理及優勢介紹
實現隔離式1-Wire總線
![<b class='flag-5'>實現</b>隔離式<b class='flag-5'>1-Wire</b>總線](https://file.elecfans.com//web2/M00/8B/76/pYYBAGPGCnaAJVqdAAAv46C3yHA825.gif)
使用UART實現1-Wire總線主控
![使用UART<b class='flag-5'>實現</b><b class='flag-5'>1-Wire</b>總線主控](https://file.elecfans.com//web2/M00/9B/C9/pYYBAGQjsEaAFjXcAAAKNRdUKbg612.png)
評論