<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 什么是 1-Wire 協(xié)議?

什么是 1-Wire 協(xié)議?

發(fā)布人:電子資料庫 時(shí)間:2023-01-16 來(lái)源:工程師 發(fā)布文章

1-Wire 協(xié)議是一種單線(xiàn)接口、半雙工、雙向、低速和功率、長(cháng)距離串行數據通信協(xié)議。盡管該協(xié)議被歸類(lèi)為單線(xiàn)標準,但單線(xiàn)標準總線(xiàn)至少需要兩根線(xiàn)——一根用于數據和/或電源,另一根用于接地回路。根據電源模式,可能需要額外的電線(xiàn)。

單線(xiàn)標準具有主從配置,其中只能有一個(gè)主設備、一臺計算機或微控制器以及多個(gè)從設備??梢允褂?1-wire 標準總線(xiàn)連接多達 100 個(gè)從屬 1-wire 設備。但是,隨著(zhù)從設備添加到總線(xiàn),主設備輪詢(xún)它們可能需要更多時(shí)間。

該協(xié)議不使用時(shí)鐘信號。相反,從屬設備在內部計時(shí)并與來(lái)自主設備的信號同步。主設備單獨負責從設備的讀寫(xiě)操作,因此它們不能自行發(fā)起數據傳輸。他們能做的是在主機復位時(shí)通過(guò)總線(xiàn)指示他們的存在。 每個(gè)主設備都由一個(gè) 64 位地址標識,存儲在每個(gè)單線(xiàn)從設備的 ROM 中。

這是一種低速串行通信標準,典型數據速度為 15.4 kbps??偩€(xiàn)可以超速至 125 kbps 的最大數據速度。與其他標準串行數據通信協(xié)議(如 UART、I2C 和 SPI)相比,1-Wire 協(xié)議的數據速度較低,但 1-wire 總線(xiàn)在生產(chǎn)和運行中非常經(jīng)濟。它提供簡(jiǎn)單的硬件實(shí)現和極低的功耗占用空間。

雖然硬件簡(jiǎn)單,但微控制器端的軟件實(shí)現卻非常復雜。盡管功耗低,但它可以在相對較長(cháng)的距離內傳輸數據。

1-Wire 協(xié)議用于溫度傳感器、實(shí)時(shí)時(shí)鐘、定時(shí)器、EEPROM 和流行的 iButton。這些 1-wire 從器件中的大多數都是(現在的)Maxim Integrated 的產(chǎn)品。

讓我們更詳細地討論一下。

什么是 1-Wire 協(xié)議?

1-Wire 協(xié)議是一種單線(xiàn)接口,用于微控制器和計算機中的低速數據通信。該協(xié)議在沒(méi)有時(shí)鐘信號的情況下在單條數據線(xiàn)上運行。它是一種主從串行通信協(xié)議,其中與多個(gè)從機的半雙工雙向數據通信由單個(gè)主機單獨管理和控制。

1-wire 標準總線(xiàn)

1-wire 標準總線(xiàn)至少有兩根線(xiàn)。一根是數據線(xiàn),一根是地線(xiàn)返回。主機和從機都與數據線(xiàn)有開(kāi)漏(集電極開(kāi)路)連接。這就是 4.7K 電阻通常將數據線(xiàn)拉高的原因。1-wire 從設備有兩種可能的供電模式:寄生和傳統。

在寄生模式下,只有數據線(xiàn)和接地回路必須追蹤到 1-wire 從器件。如果使用傳統的電源模式,則必須為每個(gè)連接到總線(xiàn)的 1-wire 從設備追蹤一條額外的正電源線(xiàn)。

因此,PCB 上的 1-wire 總線(xiàn)可能有兩根或三根線(xiàn)。傳統的1-wire總線(xiàn)三線(xiàn)供電更可靠。

寄生供電VS常規供電

如前所述,1-wire 從設備可以在寄生模式和常規模式下供電。所有 1-wire 從器件都有三個(gè)端子:VDD、GND 和數據。在寄生模式下,VDD 和 GND 引腳接地,因此信號和電源在同一根線(xiàn)(即數據線(xiàn))上提供給從設備。

從屬設備有一個(gè) 800 pF 的內部電容器,當數據線(xiàn)為高電平時(shí),它會(huì )被充電。當數據線(xiàn)為低電平時(shí),存儲的電荷使從機保持活動(dòng)狀態(tài)。數據線(xiàn)通常由一個(gè) 4.7K 電阻上拉。

寄生供電需要嚴格的時(shí)序和準確規范的供電,以確保從屬設備正常運行。這就是為什么這種模式不太可靠的原因。通常,使用額外的硬上拉來(lái)確定電源。

image.png


1-wire 器件的寄生供電。

image.png


帶有額外硬上拉的 1-wire 器件的寄生供電。

在傳統的供電模式下,1-wire 從設備由外部供電。每個(gè) 1-wire 從屬設備都跟蹤一根額外的線(xiàn)。從站的外部電源確保即使在惡劣的高溫條件下也能安全運行。

image.png


1-wire 設備的常規供電。

典型的 1-wire 器件工作電壓范圍為 – 1.71~1.89V、1.71~3.63V、2.97~6.63V 和 2.97~5.25V。消耗的電流范圍在 1.06~5mA 之間。上拉電阻設置電流電平,無(wú)論設備是提供寄生電源還是傳統電源。

1-Wire 協(xié)議如何工作

該接口通常不用于微控制器或微型計算機。它通常由使用位拆分或通用異步接收器-發(fā)送器 (UART) 的軟件來(lái)實(shí)現。

數據線(xiàn)上的通信由主機使用復位啟動(dòng)。它拉低數據線(xiàn) 480 us,然后釋放它,允許典型的上拉電阻將數據線(xiàn)拉高。如果從設備連接到總線(xiàn),它們通過(guò)將數據線(xiàn)拉低 60~240 us 來(lái)響應復位信號。如果線(xiàn)路被從設備拉低,則主設備通過(guò)總線(xiàn)確認它們的存在。60~240 us后,slave(s)釋放數據線(xiàn),master開(kāi)始寫(xiě)入。

image.png


復位后,主設備可以與從設備寫(xiě)入和讀取數據。最初,它發(fā)送 ROM 命令,如搜索 ROM 命令 (0xF0),以訪(fǎng)問(wèn)從屬設備的 ROM 地址。在讀取所有連接的 1-wire 從設備的 ROM 地址后,主設備可以通過(guò)發(fā)送匹配 ROM 命令(0x55)來(lái)訪(fǎng)問(wèn)一個(gè)。ROM 命令之后是功能命令。

例如,如果總線(xiàn)上連接了一個(gè) 1-wire 溫度傳感器,微控制器可以發(fā)送功能命令來(lái)啟動(dòng)溫度轉換、讀取溫度等。ROM 和功能命令都是 8 位長(cháng)。

由于 1-Wire 標準不使用任何時(shí)鐘信號,“0”和“1”位的通信通過(guò)為特定時(shí)隙設置數據線(xiàn)的邏輯電平來(lái)實(shí)現。通常,時(shí)隙為 60 us 長(cháng)。每個(gè)時(shí)隙之間也有1us的間隔,使數據線(xiàn)再次被上拉電阻拉高。在每個(gè) 60 us 時(shí)隙中,主從之間通信 1 位。如果總線(xiàn)過(guò)載,時(shí)隙最多可縮短 10 倍。

當主機必須在數據線(xiàn)上寫(xiě)入位時(shí),它會(huì )將數據線(xiàn)拉低。

  • 要寫(xiě)入“0”,主機在整個(gè) 60 us 時(shí)隙內拉低數據線(xiàn),然后在時(shí)隙之間以 1us 間隔釋放它。

  • 要寫(xiě)入“1”,主機在整個(gè)時(shí)隙內將數據線(xiàn)拉低 15 us 的較短時(shí)間,然后在時(shí)隙之間以 1 us 的間隔釋放它。

從設備大約在中間時(shí)隙(即 60us 時(shí)隙中的 30us)發(fā)出脈沖。他們有一個(gè)基本的單穩態(tài)多諧振蕩器來(lái)檢測脈沖的持續時(shí)間。ROM 和功能命令為 8 位長(cháng)。傳送的數據也是以 8 位為一組。錯誤檢測是通過(guò) 8 位循環(huán)冗余校驗來(lái)執行的。

image.png


主設備在發(fā)送 ROM 搜索或功能命令后從從設備讀取。讀取操作由主設備控制。主機逐位讀取從機,同時(shí)數據以 8 位為一組傳送給主機。每個(gè)位在 60 us 時(shí)隙中讀?。ㄈ绻偩€(xiàn)過(guò)載則更短)。

master拉低數據線(xiàn)1us后釋放。然后,它在 15 us 后從總線(xiàn)采樣數據。如果從機在總線(xiàn)上寫(xiě)入“0”,它會(huì )在整個(gè) 60 us 時(shí)隙內保持線(xiàn)路處于下拉狀態(tài),然后在時(shí)隙之間以 1us 間隔釋放數據線(xiàn)。如果從機在總線(xiàn)上寫(xiě)入'1',它會(huì )保持線(xiàn)下拉15 us,然后釋放上拉電阻將數據線(xiàn)拉高的數據線(xiàn)。

主機在 15 us 后對每個(gè)位進(jìn)行采樣。如果從設備發(fā)送的位為“0”,則該線(xiàn)在采樣時(shí)被拉低。如果從設備發(fā)送的位為“1”,則該線(xiàn)在采樣時(shí)被拉高。

image.png


主機可以在 1 線(xiàn)標準總線(xiàn)上與多達 100 個(gè)從機通信。然而,連接到總線(xiàn)的 1-wire 從機數量越多,主機從它們拉取數據所需的時(shí)間就越多。軟件庫通常使用 bit-banging 或 UART 來(lái)計時(shí)脈沖持續時(shí)間。在 1-Wire 協(xié)議中,LSB 總是最先發(fā)送。

協(xié)議實(shí)現

1-wire 通信中有五種總線(xiàn)信號,每一種都由主機發(fā)起和控制。這些信號是 Reset、Presence、Write 0、Write 1 和 Read。

該協(xié)議可以通過(guò)微控制器或計算機以?xún)煞N方式實(shí)現:輪詢(xún)和中斷驅動(dòng)實(shí)現。Polled 是一種純軟件實(shí)現。中斷驅動(dòng)的實(shí)現需要一個(gè)內置的定時(shí)器/計數器。

就 Arduino 而言,可以使用 delayMicroseconds() 函數完成輪詢(xún)實(shí)現(僅軟件)。這個(gè)函數有這個(gè)源代碼:

void delayMicroseconds(unsigned int us)
{
// calling avrlib’s delay_us() function with low values (e.g. 1 or
// 2 microseconds) gives delays longer than desired.
//delay_us(us);
// for the 16 MHz clock on most Arduino boards
// for a one-microsecond delay, simply return. the overhead
// of the function call yields a delay of approximately 1 1/8 us.
if (–us == 0)
return;
// the following loop takes a quarter of a microsecond (4 cycles)
// per iteration, so execute it four times for each microsecond of
// delay requested.
us <<= 2;
// account for the time taken in the preceeding commands.
us -= 2;
// busy wait
__asm__ __volatile__ (
“1: sbiw %0,1” “nt” // 2 cycles
“brne 1b” : “=w” (us) : “0” (us) // 2 cycles
);
}

對于 Arduino,1-wire 寫(xiě)操作可以用這個(gè)函數來(lái)執行:

void OWWrite(uint8_t bit){
if(bit){
//Write bit ‘1’
digitalWrite(PINNUMBER, 0x00);
delayMicroseconds(6);
digitalWrite(PINNUMBER, 0x01);
delayMicroseconds(64);
}
else{
//Write bit ‘0’
digitalWrite(PINNUMBER, 0x00);
delayMicroseconds(60);
digitalWrite(PINNUMBER, 0x01);
delayMicroseconds(10);
}
}

對于計算機來(lái)說(shuō),同樣的功能可以用C++來(lái)寫(xiě),如下:

void OWWrite(uint8_t bit){
if(bit==1){
//PF5 is port name
PORTF &= ~(1<<PF5);
delayMicroseconds(6);
PORTF |= (1<<PF5);
delayMicroseconds(64);
}
else{
PORTF &= ~(1<<PF5);
delayMicroseconds(60);
PORTF |= (1<<PF5);
delayMicroseconds(10);
}
}

對于A(yíng)rduino,1-wire讀取操作可以通過(guò)這個(gè)函數來(lái)執行:

uint8_t OWRead(void){
uint8_t result;
digitalWrite(PINNUMBER, 0x00);
delayMicroseconds(6);
digitalWrite(PINNUMBER, 0x01);
delayMicroseconds(9);
pinMode(PINNUMBER, INPUT);
result = digitalRead(PINNUMBER) & 0x01;
delayMicroseconds(55);
pinMode(PINNUMBER, OUTPUT);
return result;
}

對于計算機,相同的功能可以用 C++ 編寫(xiě)如下。

uint8_t OWReadBit(void){
uint8_t result = 0;
PORTF &= ~(1<<PF5);
delayMicroseconds(10);
PORTF |= (1<<PF5);
delayMicroseconds(20);
if(PINF & (1<<PF5)){
result = HIGH;
}
delayMicroseconds(30);
return result;
}

對于 Arduino,可以使用此函數執行重置和存在操作:

uint8_t OWResetPresence(void){
uint8_t result;
delayMicroseconds(0);
digitalWrite(PINNUMBER, 0x00);
delayMicroseconds(480);
digitalWrite(PINNUMBER, 0x01);
delayMicroseconds(70);
pinMode(PINNUMBER, INPUT);
result = digitalRead(PINNUMBER)^0x01;
delayMicroseconds(410);
pinMode(PINNUMBER, OUTPUT);
return result;
}

對于計算機,可以用 C++ 編寫(xiě)相同的函數:

uint8_t OWResetPresence(void){
uint8_t result = LOW;
PORTF &= ~(1<<PF5);
delayMicroseconds(480);
PORTF |= (1<<PF5);
delayMicroseconds(55);
if(PINF&(1<<PF5)){
result = HIGH;
}
return result;
}

微控制器和計算機可以使用 UART 來(lái)實(shí)現 1-Wire 協(xié)議的中斷驅動(dòng)。計算機可能需要一個(gè)外部 UART 芯片或分線(xiàn)板來(lái)與 1-wire 設備通信。

UART 的 Tx 和 Rx 必須連接到 1-wire 總線(xiàn)的數據線(xiàn)。UART 端口必須有一個(gè)集電極開(kāi)路緩沖器,以便從設備可以下拉數據線(xiàn)。對于復位和存在信號,波特率必須設置為 9600,并且控制器/計算機需要傳輸 0xF0。

傳輸過(guò)程中:

  • 位 0~3 設置為'0'

  • 第 4 位設置為“1”

  • Bits 5~7 由從機寫(xiě)入。

  • 停止位設置為高

如果沒(méi)有從設備連接到總線(xiàn),則接收到的值為 0xF0。如果收到 0xF0 以外的任何值,則表示總線(xiàn)上存在 1-wire 從機。

對于單線(xiàn)寫(xiě)操作,UART 的波特率必須設置為 115200。起始位必須設置為“0”,停止位必須設置為“1”。

要寫(xiě)入“1”,UART 必須發(fā)送 0xFF 并接收 0xFF 作為回報。要寫(xiě)入“0”,UART 必須發(fā)送 0x00 并接收 0x00 作為回報。

對于單線(xiàn)讀取操作,UART 的波特率必須設置為 115200。起始位必須設置為“0”,停止位必須設置為“1”。讀取時(shí),UART 傳輸一個(gè)值為 0xFF 的值,相當于釋放拉高狀態(tài)的線(xiàn)。其余位由從機寫(xiě)入。如果從設備寫(xiě)入“1”,則起始位之后的所有位都設置為“1”,因此 UART 接收到值 0xFF。如果從設備寫(xiě)入“0”,則起始位之后的所有位都設置為“0”,因此 UART 接收到除 0xFF 之外的任何值。

image.png


順序檢測

主設備可以搜索和檢測總線(xiàn)上任意數量的 1-wire 從設備。還可以將多達 100 個(gè)從屬設備連接到 1-wire 標準總線(xiàn)。然而,在標準的 1-wire 總線(xiàn)中,主機沒(méi)有檢測總線(xiàn)上從機物理順序的機制。在一些 1-wire 器件中,提供了兩個(gè)額外的引腳來(lái)支持序列檢測。DS28EA00 就是這樣一種器件。

image.png


1 線(xiàn)接口中的序列檢測。

器件

1-Wire 協(xié)議是專(zhuān)有標準。所有 1-wire 器件均由 Maxim Integrated 制造。該表列出了一些著(zhù)名的 1-wire 器件。

image.png


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: wire 協(xié)議

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>