a一级爱做片免费观看欧美,久久国产一区二区,日本一二三区免费,久草视频手机在线观看

博客專欄

EEPW首頁 > 博客 > 什么是 1-Wire 協議?

什么是 1-Wire 協議?

發布人:電子資料庫 時間:2023-01-16 來源:工程師 發布文章

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

單線標準具有主從配置,其中只能有一個主設備、一臺計算機或微控制器以及多個從設備。可以使用 1-wire 標準總線連接多達 100 個從屬 1-wire 設備。但是,隨著從設備添加到總線,主設備輪詢它們可能需要更多時間。

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

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

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

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

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

什么是 1-Wire 協議?

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

1-wire 標準總線

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

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

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

寄生供電VS常規供電

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

從屬設備有一個 800 pF 的內部電容器,當數據線為高電平時,它會被充電。當數據線為低電平時,存儲的電荷使從機保持活動狀態。數據線通常由一個 4.7K 電阻上拉。

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

image.png


1-wire 器件的寄生供電。

image.png


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

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

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 之間。上拉電阻設置電流電平,無論設備是提供寄生電源還是傳統電源。

1-Wire 協議如何工作

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

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

image.png


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

例如,如果總線上連接了一個 1-wire 溫度傳感器,微控制器可以發送功能命令來啟動溫度轉換、讀取溫度等。ROM 和功能命令都是 8 位長。

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

當主機必須在數據線上寫入位時,它會將數據線拉低。

  • 要寫入“0”,主機在整個 60 us 時隙內拉低數據線,然后在時隙之間以 1us 間隔釋放它。

  • 要寫入“1”,主機在整個時隙內將數據線拉低 15 us 的較短時間,然后在時隙之間以 1 us 的間隔釋放它。

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

image.png


主設備在發送 ROM 搜索或功能命令后從從設備讀取。讀取操作由主設備控制。主機逐位讀取從機,同時數據以 8 位為一組傳送給主機。每個位在 60 us 時隙中讀取(如果總線過載則更短)。

master拉低數據線1us后釋放。然后,它在 15 us 后從總線采樣數據。如果從機在總線上寫入“0”,它會在整個 60 us 時隙內保持線路處于下拉狀態,然后在時隙之間以 1us 間隔釋放數據線。如果從機在總線上寫入'1',它會保持線下拉15 us,然后釋放上拉電阻將數據線拉高的數據線。

主機在 15 us 后對每個位進行采樣。如果從設備發送的位為“0”,則該線在采樣時被拉低。如果從設備發送的位為“1”,則該線在采樣時被拉高。

image.png


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

協議實現

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

該協議可以通過微控制器或計算機以兩種方式實現:輪詢和中斷驅動實現。Polled 是一種純軟件實現。中斷驅動的實現需要一個內置的定時器/計數器。

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

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 寫操作可以用這個函數來執行:

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);
}
}

對于計算機來說,同樣的功能可以用C++來寫,如下:

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);
}
}

對于Arduino,1-wire讀取操作可以通過這個函數來執行:

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++ 編寫如下。

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++ 編寫相同的函數:

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 來實現 1-Wire 協議的中斷驅動。計算機可能需要一個外部 UART 芯片或分線板來與 1-wire 設備通信。

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

傳輸過程中:

  • 位 0~3 設置為'0'

  • 第 4 位設置為“1”

  • Bits 5~7 由從機寫入。

  • 停止位設置為高

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

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

要寫入“1”,UART 必須發送 0xFF 并接收 0xFF 作為回報。要寫入“0”,UART 必須發送 0x00 并接收 0x00 作為回報。

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

image.png


順序檢測

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

image.png


1 線接口中的序列檢測。

器件

1-Wire 協議是專有標準。所有 1-wire 器件均由 Maxim Integrated 制造。該表列出了一些著名的 1-wire 器件。

image.png


*博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



關鍵詞: wire 協議

相關推薦

技術專區

關閉