Maxim的多款產(chǎn)品包含1-Wire通信接口,可用于各種應(yīng)用。這些應(yīng)用可能包括與Microchip流行的PICmicros(PIC)之一的接口。為了方便1-Wire器件與外設(shè)接口控制器(PIC)微控制器之間的簡(jiǎn)單接口,本應(yīng)用筆記介紹了PIC微控制器的一般1-Wire軟件例程,并解釋了時(shí)序和相關(guān)細(xì)節(jié)。本應(yīng)用筆記還提供了一個(gè)涵蓋所有1-Wire例程的文件。此外,還包括匯編代碼示例,該代碼是專(zhuān)門(mén)為PIC16F628從DS2762高精度Li+電池監(jiān)測(cè)器讀取數(shù)據(jù)而編寫(xiě)的。
介紹
Microchip的PICmicro微控制器器件(PIC)已成為低功耗和低成本系統(tǒng)解決方案的熱門(mén)設(shè)計(jì)選擇。微控制器具有多個(gè)通用輸入/輸出(GPIO)引腳,可輕松配置為實(shí)現(xiàn)Maxim的1-Wire協(xié)議。1-Wire協(xié)議允許與許多Maxim器件進(jìn)行交互,包括電池和熱管理、存儲(chǔ)器、iButton器件等。本應(yīng)用筆記介紹了PIC1F16的一般628-Wire例程,并解釋了時(shí)序和相關(guān)細(xì)節(jié)。為方便起見(jiàn),所有材料均假定為4MHz時(shí)鐘,該頻率可用作許多PIC的內(nèi)部時(shí)鐘。本文檔的附錄A包含一個(gè)包含所有1-Wire例程的文件。附錄B給出了一個(gè)示例匯編代碼程序,用于PIC16F628從DS2762高精度Li+電池監(jiān)測(cè)器讀取數(shù)據(jù)。本應(yīng)用筆記僅限于常規(guī)速度的1-Wire通信。?
常規(guī)宏
要以主機(jī)形式傳輸1-Wire協(xié)議,只需要兩種GPIO狀態(tài):高阻抗和邏輯低電平。以下 PIC 程序集代碼段實(shí)現(xiàn)這兩種狀態(tài)。PIC16F628有兩個(gè)GPIO端口,PORTA和PORTB。任一端口都可以設(shè)置為1-Wire通信,但在本例中,使用PORTB。此外,以下代碼假定匯編代碼中配置了一個(gè)常量DQ,以指示PORTB中的哪個(gè)位是1-Wire引腳。在整個(gè)代碼中,此位號(hào)簡(jiǎn)稱(chēng)為 DQ。在外部,該引腳必須通過(guò)上拉電阻連接到電源。
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
這兩個(gè)代碼片段都是作為宏編寫(xiě)的。通過(guò)將代碼編寫(xiě)為宏,可以使用單個(gè)宏調(diào)用將其自動(dòng)插入到程序集源代碼中。這限制了必須重寫(xiě)代碼的次數(shù)。第一個(gè)宏OW_HIZ強(qiáng)制DQ線進(jìn)入高阻抗?fàn)顟B(tài)。第一步是選擇數(shù)據(jù)存儲(chǔ)器的存儲(chǔ)組1,因?yàn)門(mén)RISB寄存器位于存儲(chǔ)組1中。接下來(lái),通過(guò)在TRISB寄存器中設(shè)置DQ位,將DQ輸出驅(qū)動(dòng)器更改為高阻抗?fàn)顟B(tài)。最后一行代碼更改回?cái)?shù)據(jù)存儲(chǔ)器的庫(kù) 0。最后一行不是必需的,但用于使所有宏和函數(shù)調(diào)用使數(shù)據(jù)存儲(chǔ)器處于已知狀態(tài)。
第二個(gè)宏OW_LO將 DQ 線強(qiáng)制到邏輯低電平。首先,選擇數(shù)據(jù)存儲(chǔ)器的組0,以便可以訪問(wèn)PORTB寄存器。PORTB 寄存器是數(shù)據(jù)寄存器,包含強(qiáng)制到 TRISB 引腳的值(如果它們配置為輸出)。
PORTB 的 DQ 位被清除,因此線路被強(qiáng)制為低電平。最后,選擇數(shù)據(jù)存儲(chǔ)器的組1,并清除TRISB寄存器的DQ位,使其成為輸出驅(qū)動(dòng)器。與往常一樣,宏以選擇數(shù)據(jù)存儲(chǔ)器的庫(kù) 0 結(jié)束。
包括一個(gè)標(biāo)記為WAIT的最終宏,以產(chǎn)生1-Wire信號(hào)的延遲。WAIT 用于產(chǎn)生 5μs 倍數(shù)的延遲。調(diào)用宏時(shí),TIME 值為微秒,并生成相應(yīng)的延遲時(shí)間。宏只需計(jì)算需要 5μs 延遲的次數(shù),然后在 WAIT5U 內(nèi)循環(huán)。例程 WAIT5U 將在下一節(jié)中顯示。對(duì)于 WAIT 中的每個(gè)指令,處理時(shí)間都作為注釋給出,以幫助了解延遲是如何實(shí)現(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時(shí)序協(xié)議具有特定的時(shí)序約束,必須遵循這些約束才能實(shí)現(xiàn)成功的通信。為了幫助實(shí)現(xiàn)特定的時(shí)序延遲,使用例程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
當(dāng)與 WAIT 宏結(jié)合使用時(shí),可以生成簡(jiǎn)單的時(shí)序延遲。例如,如果需要 40μs 延遲,則會(huì)調(diào)用 WAIT 0.40。這會(huì)導(dǎo)致 WAIT 中的前 3 行執(zhí)行,導(dǎo)致 4μs。接下來(lái),WAIT4U 中的前 5 行代碼在 5μs 內(nèi)執(zhí)行,循環(huán) 6 次,總共 30μs。WAIT5U的最后一個(gè)循環(huán)需要6μs,然后返回到WAIT宏。因此,總處理時(shí)間為 4 + 30 + 6 = 40μs。
2.5V < VDD <5.5V, TA= -20°C 至 +70°C | |||||
參數(shù) | 象征 | 最小值 | 典型值 | 麥克斯 | 單位 |
時(shí)隙 | t槽 | 60 | 120 | 微秒 | |
恢復(fù)時(shí)間 | t娛樂(lè) | 1 | 微秒 | ||
寫(xiě)入 0 低時(shí)間 | t低0 | 60 | 120 | 微秒 | |
寫(xiě)入 1 低時(shí)間 | t低1 | 1 | 15 | 微秒 | |
讀取數(shù)據(jù)有效 | tRDV | 15 | 微秒 | ||
復(fù)位時(shí)間高 | tRSTH | 480 | 微秒 | ||
復(fù)位時(shí)間低 | tRSTL | 480 | 960 | 微秒 | |
存在檢測(cè)高 | t帕迪亞 | 15 | 60 | 微秒 | |
存在檢測(cè)低 | tPDL | 60 | 240 | 微秒 |
任何1-Wire交易的開(kāi)始都始于來(lái)自主器件的復(fù)位脈沖,然后是來(lái)自從器件的存在檢測(cè)脈沖。圖 1 說(shuō)明了此事務(wù)。該初始化序列可以通過(guò)PIC輕松傳輸,匯編代碼如圖1所示。1-Wire初始化、讀取和寫(xiě)入的時(shí)序規(guī)格見(jiàn)上表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引腳處于高阻抗?fàn)顟B(tài),以便上拉電阻將其拉高。接下來(lái),它清除PDBYTE寄存器,以便準(zhǔn)備驗(yàn)證下一個(gè)存在檢測(cè)脈沖。之后,DQ引腳被驅(qū)動(dòng)為低電平500μs。這符合 tRSTL參數(shù)如表1所示,并提供了一個(gè)20μs的附加緩沖器。將引腳驅(qū)動(dòng)至低電平后,引腳釋放至高阻抗?fàn)顟B(tài),并在讀取存在檢測(cè)脈沖之前增加70μs的延遲。使用 70μs 可確保 PIC 采樣在有效時(shí)間對(duì) t 的任意組合PDL和 t帕迪亞.讀取存在檢測(cè)脈沖后,調(diào)整PDBYTE寄存器以顯示邏輯電平讀數(shù)。然后,DQ引腳將處于高阻抗?fàn)顟B(tài)再保持430μs,以確保RSTH已滿(mǎn)足時(shí)間,并包括一個(gè)20μs的額外緩沖器。
1-Wire通信所需的下一個(gè)例程是DSTXBYTE,用于將數(shù)據(jù)傳輸?shù)?-Wire從器件。此例程的 PIC 代碼如圖 2 所示。此例程與要在 W 寄存器中發(fā)送的數(shù)據(jù)一起調(diào)用,并立即移動(dòng)到 IOBYTE 寄存器。接下來(lái),將 COUNT 寄存器初始化為 8,以計(jì)算從 DQ 行發(fā)送的位數(shù)。從 DSTXLP 開(kāi)始,PIC 開(kāi)始發(fā)送數(shù)據(jù)。首先,DQ引腳被驅(qū)動(dòng)為低電平3μs,無(wú)論發(fā)送什么邏輯電平。這確保了低1時(shí)間被滿(mǎn)足了。接下來(lái),IOBYTE 的 lsb 移動(dòng)到 CARRY 位,然后測(cè)試一個(gè) 60 或 <>。如果CARY為<>,則設(shè)置TRISB的DQ位,將引腳變?yōu)楦咦杩範(fàn)顟B(tài),并通過(guò)上拉電阻將線路拉高。如果 CARRY 為零,則行保持低電平。接下來(lái)增加<>μs的延遲以允許最小t低0時(shí)間。等待60μs后,引腳變?yōu)楦咦杩範(fàn)顟B(tài),然后再增加2μs用于上拉電阻恢復(fù)。最后,COUNT 寄存器遞減。如果 COUNT 寄存器為零,則所有 2 位均已發(fā)送,例程已完成。如果 COUNT 寄存器不為零,則從 DSTXLP 開(kāi)始發(fā)送另一個(gè)位。寫(xiě)零和寫(xiě)一過(guò)程的可視化解釋如圖 <> 所示。
圖2.1線寫(xiě)入時(shí)隙。
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通信的最后一個(gè)例程是DSRXBYTE,它允許PIC從從器件接收信息。代碼如圖 3 所示。在任何DQ活動(dòng)開(kāi)始之前,COUNT寄存器初始化為8,其功能是計(jì)算接收的位數(shù)。DSRXLP 首先將 DQ 引腳驅(qū)動(dòng)為低電平,向從設(shè)備發(fā)出 PIC 已準(zhǔn)備好接收數(shù)據(jù)的信號(hào)。該線路被驅(qū)動(dòng)為低電平6μs,然后通過(guò)將DQ引腳置于高阻抗?fàn)顟B(tài)來(lái)釋放。接下來(lái),PIC再等待4μs,然后對(duì)數(shù)據(jù)線進(jìn)行采樣。在低行驅(qū)動(dòng)后,OW_LO中有 1 行代碼,OW_HIZ內(nèi)有 3 行代碼。每條線需要1μs來(lái)處理。將所有時(shí)間相加得到 1 + 6 + 3 + 4 = 14μs,略低于 tRDV規(guī)格為15μs。讀取 PORTB 寄存器后,DQ 位被屏蔽,然后將寄存器添加到 255 以強(qiáng)制 CARRY 位鏡像 DQ 位。然后,CARRY 位移動(dòng)到存儲(chǔ)傳入字節(jié)的 IOBYTE 中。一旦字節(jié)被存儲(chǔ),就會(huì)增加50μs的延遲,以確保槽滿(mǎn)足了。最后一項(xiàng)檢查是確定 COUNT 寄存器是否為零。如果為零,則已讀取 8 位,并退出例程。否則,將在 DSRXLP 上重復(fù)該循環(huán)。讀零和讀一事務(wù)如圖 3 所示。
圖3.1-線讀取時(shí)隙。
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<
總結(jié)
Maxim的1-Wire通信協(xié)議可以在Microchip的PICmicro系列微控制器上輕松實(shí)現(xiàn)。要完成1-Wire交易,只需要兩種GPIO狀態(tài),并且PIC上的多個(gè)GPIO很容易配置用于此任務(wù)。1-Wire通信需要三個(gè)基本程序:初始化、讀字節(jié)和寫(xiě)字節(jié)。介紹并詳細(xì)介紹了這三個(gè)程序,以提供精確的1-Wire常規(guī)速度通信。這使得PIC能夠與Maxim 1-Wire的眾多器件中的任何一種接口。本文檔的附錄 A 在一個(gè)方便的包含文件中包含所有三個(gè)例程。附錄B包含一個(gè)小型匯編程序,用于將PIC16F628連接至DS2762高精度Li+電池監(jiān)測(cè)器。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7489瀏覽量
151045 -
控制器
+關(guān)注
關(guān)注
112文章
16198瀏覽量
177399 -
1-Wire
+關(guān)注
關(guān)注
0文章
49瀏覽量
21293
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論