“數據包錯誤檢查”(PEC)是一種在數據傳輸過程中廣泛使用的錯誤檢測機制。Maxim集成產品采用PEC模式,以提高數據傳輸的可靠性。本應用筆記討論了PEC字節在具有1線和2線接口的溫度傳感器產品上的詳細實現。
背景
通信無處不在,錯誤會導致通信效率下降。為了使溝通更準確,人們使用不同的方法來檢測溝通錯誤。例如,在為網站登錄創建新密碼時,用戶需要輸入兩次密碼,以減少密碼中出現拼寫錯誤的機會。
當人們寫銀行路由號碼等號碼時,他們可能會犯錯誤。創建校驗位是為了捕獲這些轉錄錯誤。校驗位是一種冗余校驗,由算法從序列中的其他數字計算出的一個或多個數字組成。銀行路由號碼的最后一位數字是根據前八位數字計算的校驗位,用于在交易過程中驗證銀行路由號碼的真實性。
數據通信可能會出錯,例如通道噪聲、電氣失真、隨機位錯誤和串擾。循環冗余校驗 (CRC) 是一種錯誤檢測代碼,用于檢測數據傳輸中的意外錯誤。CRC用于多款具有1-Wire接口的Maxim溫度傳感器產品(即DS18B20、MAX31850)。部分產品帶有 I?2C/SMBus兼容串行接口(即DS1862、MAX31875)以分組錯誤檢查(PEC)的形式實現CRC,這是最初在SMBus中定義的機制。在數據傳輸系統中,可以在每個事務的末尾附加一個PEC字節作為錯誤檢測代碼。PEC 字節是根據多項式 C(X) = X 表示的 CRC-8 字節計算的8+ X2+ X1+ 1.PEC 機制提高了可靠性和通信魯棒性,PEC 實現對于 SMBus 設備是可選的。
描述
每款1-Wire器件都有一個唯一的64位串行碼存儲在板載ROM中。當多個設備在同一總線上時,總線主站使用64位唯一ROM ID唯一標識總線上的每個從設備,這允許主站確定從設備的數量及其設備類型。當主設備想要與一個特定的從設備通信時,主機向總線上的設備發出命令,然后是目標設備的64位ROM代碼序列,以尋址該特定的從設備。只有與64位ROM碼序列完全匹配的從機才會響應主站發出的功能命令。
在1-Wire接口產品中,CRC字節作為64位ROM碼的一部分(圖1)和暫存器存儲器的第9個字節(圖2)提供。64位ROM碼中的CRC字節是從ROM碼的前56位計算得出的,其中包括序列號和家族代碼。
暫存器內存中的 CRC 字節從暫存器的字節 0 到 7 計算得出,并在暫存器中的數據更改時更改。暫存器中的 CRC 字節是只讀的。例如,為了從1-Wire溫度傳感器讀取溫度值,主機發出讀取暫存器命令以讀取暫存器,包括CRC字節。然后,主站從暫存器重新計算前八個數據字節的CRC字節,并將計算出的CRC字節與讀取的CRC字節進行比較。如果它們匹配,則接收到的數據沒有錯誤。
圖1.64位1線ROM碼。
圖2.DS18B20暫存存儲器。
對于我2支持PEC、CRC字節的C/SMBus組件可用于寫入和讀取。例如,MAX31875,一個微小的微功耗本地溫度傳感器,具有I2C/SMBus接口,支持可選PEC模式。
在寫事務中,主機寫入MAX31875的地址,等待MAX31875的ACK位,然后主機發送目標寄存器,然后發送MAX31875的另一個ACK位。主機寫入兩個數據字節,并從MAX31875接收每個數據字節的ACK位。PEC模式開啟時,主機再發送一個CRC字節,并從MAX31875接收最后一個ACK位,停止交易。該CRC字節是使用從地址、寄存器地址和傳輸的數據計算的。
對于讀事務,主機發送MAX31875的地址和目標寄存器地址,并從從機接收每次發送的ACK位。主機產生重復啟動(Sr)字節,寫入MAX31875地址和讀位。MAX31875確認地址/讀字節并發送兩個數據字節。PEC模式開啟時,數據傳輸后MAX31875附加一個PEC字節。CRC字節是使用具有寫入位的從地址,寄存器地址,具有讀取位的從地址以及傳輸的數據計算的。
圖3.2字節寫入MAX31875,PEC碼。
圖4.SMBus 2 字節與 PEC 字節一起讀取。
示例1:使用CRC進行1線讀取
DS18B20是Maxim采用1-Wire接口的數字溫度計之一。CRC字節作為DS18B20的64位ROM碼的一部分和暫存器存儲器的第9個字節提供。 DS18B20的ROM CRC字節采用48位序列號和8位家族碼(28h)計算。表 1 中的示例使用序列號 04 16 74 8A 15 FF。
格式 | CRC-8 (MSB) | 序號 | 家庭代碼 | |||||
十六進制 | 72 | 04 | 16 | 74 | 8安 | 15 | FF | 28 |
二元的 | 0111 0010 | 0000 0100 | 0001 0110 | 0111 0100 | 1000 1010 | 0001 0101 | 1111 1111 | 0010 1000 |
為了計算CRC-8字節,主站使用多項式生成器,如圖5所示。CRC發生器由移位寄存器和XOR門組成,所有移位寄存器位初始化為0。從ROM代碼的最低有效位開始,一次將一位移入移位寄存器。從ROM移入第56位后,多項式發生器包含一個8位CRC值。
圖5.用于 CRC 的 CRC 發生器 = X8+ X5+ X4+ 1.
有關示例 CRC 字節計算的更多詳細信息 ?
在此示例中,主站根據接收到的 8 位 ROM 代碼計算 CRC-56 字節,從而產生值0x72。主機將計算出的CRC值(0x72)與存儲在DS18B20的ROM (0x72)中的CRC字節進行比較,后者與計算值相同,并確認主站讀數正確。
DS18B20的暫存存儲器CRC字節使用暫存器中的字節0至字節7計算。有關暫存器內存內容的示例,請參閱表 2。
字節 8 CRC 字節 |
字節 7 | 字節 6 | 字節 5 | 字節 4 | 字節 3 | 字節 2 |
字節 1 溫度 MSB |
字節 0 溫度 LSB |
0 瓦 | 1 0 | 0 攝氏度 | F F | 7 % | 1 8 | 1 字節 | 0 5 | 5 0 |
0000 0101 | 0001 0000 | 0000 1100 | 1111 1111 | 0111 1111 | 0001 1000 | 0001 1011 | 0000 0101 | 0101 0000 |
從暫存器中字節 0 的最低有效位 (LSB) 開始,一次一個位移入 CRC 發生器的移位寄存器。從暫存器移入第 0 位后,主機將05x8計算為 64 位 CRC 值。
主機將計算值 (0x05) 與暫存器 CRC 字節 (0x05) 進行比較。如果匹配,則大師確認暫存器中的讀數正確。
示例 2:I2使用 PEC 編寫 C/SMBus
溫度閾值寄存器(T這) 用于設置MAX31875的溫度限值。如果MAX31875測得的溫度超過TOS,則配置寄存器顯示過熱狀態。TOS 的上電狀態為 80°C (0x5000),地址0x03。設置 T 的步驟這至95°C (0x5F00),主機寫入MAX31875,如表3所示。
方向 | M->S | M->S | M->S | S->M | M->S | S->M | M->S | S->M | M->S | S->M | M->S | S->M | M->S |
內容 | S | 從地址 | 水利 | 一個 | 寄存器地址 | 一個 | 數據高 | 一個 | 數據低 | 一個 | PEC 字節 | 一個 | P |
二元的 | 1001 000 | 0 | 0000 0011 | 0101 1111 | 0000 0000 | 0010 0100 |
主機使用圖 8 所示的 PEC 生成器計算 PEC-6 字節。從從地址(MSB)的第一位開始,0x90035F00一次移入移位寄存器以計算0x24。
主機向MAX0發送90035x0024F31875并接收ACK,因為0x24與從機產生的PEC字節匹配。如果收到的PEC字節是匹配的,則從站向主站發送ACK。
圖6.用于 CRC 的 PEC 發生器 = X8+ X2+ X1+ 1.
示例 3:I2帶 PEC 的 C/SMBus 讀取
將MAX31875分辨率設置為12位。LSB的值為0.0625°C。 PEC模式開啟時,讀取MAX31875的溫度寄存器值(地址0x00)。MAX31875溫度數據格式為16位,二進制補碼,寄存器以2個字節讀出:上字節和下字節。溫度寄存器位 D[15:3] 包含溫度數據。為了讀取MAX31875的溫度寄存器,主機通過寫命令(0x90)發送從地址,接收ACK位,發送溫度寄存器地址(0x00),并接收ACK位。繼續重復啟動,主機通過讀命令(0x91)發送從地址,接收ACK位,MAX31875發回兩個數據字節值,并附加一個PEC字節。
表4是MAX31875溫度寄存器值23.00°C (0x1700)的主讀數示例。
方向 | M->S | M->S | M->S | S->M | M->S | S->M | ... | M->S | M->S | M->S | S->M | S->M | M->S | S->M | M->S | S->M | M->S | M->S |
內容 | S | 從地址 | 水利 | 一個 | 寄存器地址 | 一個 | 1 | 從地址 | 研發 | 一個 | 數據高 | 一個 | 數據低 | 一個 | PEC 字節 | N | P | |
二元的 | 1001 000 | 0 | 0000 0011 | 鍶 | 1001 000 | 1 | 0001 0111 | 0000 0000 | 0101 1011 |
在讀取操作期間,MAX31875向主機發送溫度寄存器值(0x1700)和PEC字節(0x5B)。主站使用圖 6 所示的 PEC 生成器計算 PEC 字節。從從地址的MSB開始,0x9000911700一次移入移位寄存器。主機將接收到的PEC字節與PEC發生器計算出的PEC字節進行比較,后者的值相同,并確認溫度寄存器的讀數正確。
結論
通過使用CRC或PEC,主站和從站可以驗證接收到的數據并檢測傳輸錯誤。特別是在多個設備同時連接同一主機的情況下,循環冗余檢查提供了一種有效的錯誤檢查方法。
審核編輯:郭婷
-
傳感器
+關注
關注
2560文章
52064瀏覽量
760759 -
ROM
+關注
關注
4文章
577瀏覽量
86747 -
總線
+關注
關注
10文章
2934瀏覽量
89045
發布評論請先 登錄
相關推薦
NONOS如何檢查是否實際發送了UDP數據包?
怎么跟蹤每個連接間隔的數據包數
uart引導加載程序數據包長度無效
如何發送音頻/視頻ISOC數據包?
網絡數據包捕獲機制研究
基于Jpcap的數據包捕獲器的設計與實現
ZigBee3.0數據包解析

數據包的發送流程
網絡數據包分析軟件wireshark的基本使用
虹科分享 | 網絡流量監控 | 數據包丟失101

評論