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

什么是數(shù)據(jù)包?
ZigBee3.0數(shù)據(jù)包解析

數(shù)據(jù)包的發(fā)送流程
網(wǎng)絡(luò)數(shù)據(jù)包分析軟件wireshark的基本使用
虹科分享 | 什么是深度數(shù)據(jù)包檢測(DPI)

虹科分享 | 網(wǎng)絡(luò)流量監(jiān)控 | 數(shù)據(jù)包丟失101

評論