Maxim的多款產(chǎn)品包含1-Wire通信接口,可用于各種應用。這些應用可能包括與Microchip流行的PICmicros(PIC)之一的接口。為了方便1-Wire器件與外設接口控制器(PIC)微控制器之間的簡單接口,本應用筆記介紹了PIC微控制器的一般1-Wire軟件例程,并解釋了時序和相關細節(jié)。本應用筆記還提供了一個涵蓋所有1-Wire例程的文件。此外,還包括匯編代碼示例,該代碼是專門為PIC16F628從DS2762高精度Li+電池監(jiān)測器讀取數(shù)據(jù)而編寫的。
介紹
Microchip的PICmicro微控制器器件(PIC)已成為低功耗和低成本系統(tǒng)解決方案的熱門設計選擇。微控制器具有多個通用輸入/輸出(GPIO)引腳,可輕松配置為實現(xiàn)Maxim的1-Wire協(xié)議。1-Wire協(xié)議允許與許多Maxim器件進行交互,包括電池和熱管理、存儲器、iButton器件等。本應用筆記介紹了PIC1F16的一般628-Wire例程,并解釋了時序和相關細節(jié)。為方便起見,所有材料均假定為4MHz時鐘,該頻率可用作許多PIC的內(nèi)部時鐘。本文檔的附錄A包含一個包含所有1-Wire例程的文件。附錄B給出了一個示例匯編代碼程序,用于PIC16F628從DS2762高精度Li+電池監(jiān)測器讀取數(shù)據(jù)。本應用筆記僅限于常規(guī)速度的1-Wire通信。?
常規(guī)宏
要以主機形式傳輸1-Wire協(xié)議,只需要兩種GPIO狀態(tài):高阻抗和邏輯低電平。以下 PIC 程序集代碼段實現(xiàn)這兩種狀態(tài)。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
這兩個代碼片段都是作為宏編寫的。通過將代碼編寫為宏,可以使用單個宏調(diào)用將其自動插入到程序集源代碼中。這限制了必須重寫代碼的次數(shù)。第一個宏OW_HIZ強制DQ線進入高阻抗狀態(tài)。第一步是選擇數(shù)據(jù)存儲器的存儲組1,因為TRISB寄存器位于存儲組1中。接下來,通過在TRISB寄存器中設置DQ位,將DQ輸出驅動器更改為高阻抗狀態(tài)。最后一行代碼更改回數(shù)據(jù)存儲器的庫 0。最后一行不是必需的,但用于使所有宏和函數(shù)調(diào)用使數(shù)據(jù)存儲器處于已知狀態(tài)。
第二個宏OW_LO將 DQ 線強制到邏輯低電平。首先,選擇數(shù)據(jù)存儲器的組0,以便可以訪問PORTB寄存器。PORTB 寄存器是數(shù)據(jù)寄存器,包含強制到 TRISB 引腳的值(如果它們配置為輸出)。
PORTB 的 DQ 位被清除,因此線路被強制為低電平。最后,選擇數(shù)據(jù)存儲器的組1,并清除TRISB寄存器的DQ位,使其成為輸出驅動器。與往常一樣,宏以選擇數(shù)據(jù)存儲器的庫 0 結束。
包括一個標記為WAIT的最終宏,以產(chǎn)生1-Wire信號的延遲。WAIT 用于產(chǎn)生 5μs 倍數(shù)的延遲。調(diào)用宏時,TIME 值為微秒,并生成相應的延遲時間。宏只需計算需要 5μs 延遲的次數(shù),然后在 WAIT5U 內(nèi)循環(huán)。例程 WAIT5U 將在下一節(jié)中顯示。對于 WAIT 中的每個指令,處理時間都作為注釋給出,以幫助了解延遲是如何實現(xiàn)的。
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時序協(xié)議具有特定的時序約束,必須遵循這些約束才能實現(xiàn)成功的通信。為了幫助實現(xiàn)特定的時序延遲,使用例程WAIT5U產(chǎn)生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 延遲,則會調(diào)用 WAIT 0.40。這會導致 WAIT 中的前 3 行執(zhí)行,導致 4μs。接下來,WAIT4U 中的前 5 行代碼在 5μs 內(nèi)執(zhí)行,循環(huán) 6 次,總共 30μs。WAIT5U的最后一個循環(huán)需要6μs,然后返回到WAIT宏。因此,總處理時間為 4 + 30 + 6 = 40μs。
| 2.5V < VDD <5.5V, TA= -20°C 至 +70°C | |||||
| 參數(shù) | 象征 | 最小值 | 典型值 | 麥克斯 | 單位 |
| 時隙 | t槽 | 60 | 120 | 微秒 | |
| 恢復時間 | t娛樂 | 1 | 微秒 | ||
| 寫入 0 低時間 | t低0 | 60 | 120 | 微秒 | |
| 寫入 1 低時間 | t低1 | 1 | 15 | 微秒 | |
| 讀取數(shù)據(jù)有效 | tRDV | 15 | 微秒 | ||
| 復位時間高 | tRSTH | 480 | 微秒 | ||
| 復位時間低 | tRSTL | 480 | 960 | 微秒 | |
| 存在檢測高 | t帕迪亞 | 15 | 60 | 微秒 | |
| 存在檢測低 | tPDL | 60 | 240 | 微秒 | |
任何1-Wire交易的開始都始于來自主器件的復位脈沖,然后是來自從器件的存在檢測脈沖。圖 1 說明了此事務。該初始化序列可以通過PIC輕松傳輸,匯編代碼如圖1所示。1-Wire初始化、讀取和寫入的時序規(guī)格見上表1。這些參數(shù)在文檔的其余部分中都有引用。

圖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引腳處于高阻抗狀態(tài),以便上拉電阻將其拉高。接下來,它清除PDBYTE寄存器,以便準備驗證下一個存在檢測脈沖。之后,DQ引腳被驅動為低電平500μs。這符合 tRSTL參數(shù)如表1所示,并提供了一個20μs的附加緩沖器。將引腳驅動至低電平后,引腳釋放至高阻抗狀態(tài),并在讀取存在檢測脈沖之前增加70μs的延遲。使用 70μs 可確保 PIC 采樣在有效時間對 t 的任意組合PDL和 t帕迪亞.讀取存在檢測脈沖后,調(diào)整PDBYTE寄存器以顯示邏輯電平讀數(shù)。然后,DQ引腳將處于高阻抗狀態(tài)再保持430μs,以確保RSTH已滿足時間,并包括一個20μs的額外緩沖器。
1-Wire通信所需的下一個例程是DSTXBYTE,用于將數(shù)據(jù)傳輸?shù)?-Wire從器件。此例程的 PIC 代碼如圖 2 所示。此例程與要在 W 寄存器中發(fā)送的數(shù)據(jù)一起調(diào)用,并立即移動到 IOBYTE 寄存器。接下來,將 COUNT 寄存器初始化為 8,以計算從 DQ 行發(fā)送的位數(shù)。從 DSTXLP 開始,PIC 開始發(fā)送數(shù)據(jù)。首先,DQ引腳被驅動為低電平3μs,無論發(fā)送什么邏輯電平。這確保了低1時間被滿足了。接下來,IOBYTE 的 lsb 移動到 CARRY 位,然后測試一個 60 或 <>。如果CARY為<>,則設置TRISB的DQ位,將引腳變?yōu)楦咦杩範顟B(tài),并通過上拉電阻將線路拉高。如果 CARRY 為零,則行保持低電平。接下來增加<>μs的延遲以允許最小t低0時間。等待60μs后,引腳變?yōu)楦咦杩範顟B(tài),然后再增加2μs用于上拉電阻恢復。最后,COUNT 寄存器遞減。如果 COUNT 寄存器為零,則所有 2 位均已發(fā)送,例程已完成。如果 COUNT 寄存器不為零,則從 DSTXLP 開始發(fā)送另一個位。寫零和寫一過程的可視化解釋如圖 <> 所示。

圖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,其功能是計算接收的位數(shù)。DSRXLP 首先將 DQ 引腳驅動為低電平,向從設備發(fā)出 PIC 已準備好接收數(shù)據(jù)的信號。該線路被驅動為低電平6μs,然后通過將DQ引腳置于高阻抗狀態(tài)來釋放。接下來,PIC再等待4μs,然后對數(shù)據(jù)線進行采樣。在低行驅動后,OW_LO中有 1 行代碼,OW_HIZ內(nèi)有 3 行代碼。每條線需要1μs來處理。將所有時間相加得到 1 + 6 + 3 + 4 = 14μs,略低于 tRDV規(guī)格為15μs。讀取 PORTB 寄存器后,DQ 位被屏蔽,然后將寄存器添加到 255 以強制 CARRY 位鏡像 DQ 位。然后,CARRY 位移動到存儲傳入字節(jié)的 IOBYTE 中。一旦字節(jié)被存儲,就會增加50μs的延遲,以確保槽滿足了。最后一項檢查是確定 COUNT 寄存器是否為零。如果為零,則已讀取 8 位,并退出例程。否則,將在 DSRXLP 上重復該循環(huán)。讀零和讀一事務如圖 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通信協(xié)議可以在Microchip的PICmicro系列微控制器上輕松實現(xiàn)。要完成1-Wire交易,只需要兩種GPIO狀態(tài),并且PIC上的多個GPIO很容易配置用于此任務。1-Wire通信需要三個基本程序:初始化、讀字節(jié)和寫字節(jié)。介紹并詳細介紹了這三個程序,以提供精確的1-Wire常規(guī)速度通信。這使得PIC能夠與Maxim 1-Wire的眾多器件中的任何一種接口。本文檔的附錄 A 在一個方便的包含文件中包含所有三個例程。附錄B包含一個小型匯編程序,用于將PIC16F628連接至DS2762高精度Li+電池監(jiān)測器。
審核編輯:郭婷
-
微控制器
+關注
關注
48文章
8196瀏覽量
160532 -
控制器
+關注
關注
114文章
17530瀏覽量
189125 -
1-Wire
+關注
關注
0文章
70瀏覽量
21913
發(fā)布評論請先 登錄
基于C++模板技術的1-wire總線編程
1-Wire時序的理解及配置
如何訪問1-Wire API
DS2480B串行接口1-Wire 線驅動器的使用
應用筆記159絕對可靠的1-Wire通信
什么是1-Wire
用軟件實現(xiàn)1-Wire通信
1-Wire器件與8051系列單片機的軟件接口
DS1820單總線(1-wire)數(shù)字溫度傳感器
1-Wire總線主機
1-Wire通信協(xié)議的工作原理及優(yōu)勢介紹
實現(xiàn)隔離式1-Wire總線
可靠的長線1-Wire網(wǎng)絡指南
使用UART實現(xiàn)1-Wire總線主控

如何配置微芯片PICmicro以實現(xiàn)1-Wire通信協(xié)議
評論