MAX14915為高性能、8通道、工業(yè)高邊開關(guān),具有豐富、先進(jìn)的功能集。SPI接口允許微控制器監(jiān)視和控制MAX14915的大部分方面。為了增強(qiáng)魯棒性,MAX14915中的硬件循環(huán)冗余校驗(yàn)(CRC)電路可以選擇保護(hù)其與微控制器之間的所有數(shù)據(jù)通信,防止誤碼。然而,在MAX14915中啟用CRC功能是不夠的。微控制器還必須在軟件中實(shí)現(xiàn)相同的CRC算法,既要為發(fā)送到MAX14915的數(shù)據(jù)附加校驗(yàn)位,又要驗(yàn)證從MAX14915接收的數(shù)據(jù)。實(shí)現(xiàn)此目的的一種方法是檢查數(shù)據(jù)手冊(cè)并使用它來創(chuàng)建自定義固件以實(shí)現(xiàn)必要的CRC功能。為了提供更快且經(jīng)過驗(yàn)證的解決方案,本應(yīng)用筆記中提供了一系列功能。它們是用C語言編寫的,應(yīng)該很容易移植到任何常見的微控制器上。
串行接口上的CRC錯(cuò)誤檢測
MAX14915串行數(shù)據(jù)的CRC錯(cuò)誤檢測可以啟用,以盡量減少由于SDI和SDO信號(hào)的數(shù)據(jù)損壞而導(dǎo)致的錯(cuò)誤操作或錯(cuò)誤信息。如果使能錯(cuò)誤檢測,通過設(shè)置CRCEN引腳= 1,MAX14915執(zhí)行以下操作:
對(duì)從微控制器接收的SDI數(shù)據(jù)執(zhí)行錯(cuò)誤檢測,以及
計(jì)算發(fā)送到微控制器的SDO數(shù)據(jù)的CRC,并將校驗(yàn)字節(jié)附加到發(fā)送到微控制器的SDO診斷/狀態(tài)數(shù)據(jù)
這可確保從微控制器接收的數(shù)據(jù)(設(shè)置/配置)和發(fā)送到微控制器的數(shù)據(jù)(診斷/狀態(tài))出現(xiàn)未檢測到錯(cuò)誤的可能性較低。
CRC 錯(cuò)誤檢測支持SPI尋址和菊花鏈操作模式,以及標(biāo)準(zhǔn)和突發(fā)讀/寫周期。
SDI(讀取周期)上的輸入數(shù)據(jù)
將 CRCEN 輸入設(shè)置為高電平可啟用 CRC 錯(cuò)誤檢測。CRC 幀校驗(yàn)序列 (FCS) 隨每個(gè)串行事務(wù)一起發(fā)送。5 位 FCS 基于生成器多項(xiàng)式 X5+ X4+ X2+ 1,CRC 起始值 = 11111。當(dāng)CRC使能時(shí),MAX14915期望在接收的SDI程序/配置數(shù)據(jù)后附加一個(gè)校驗(yàn)字節(jié)。圖 1 顯示了校驗(yàn)字節(jié)格式。
圖1.微控制器的SDI檢查字節(jié)。
5位FCS位CRC[4:0]是根據(jù)一個(gè)SPI命令中發(fā)送的所有數(shù)據(jù)計(jì)算的,包括校驗(yàn)字節(jié)MSB中的三個(gè)“0”。因此,在突發(fā)命令的情況下,CRC 的計(jì)算范圍為 8+3 位到 24+3 位。CRC0是FCS的LSB。
MAX14915驗(yàn)證接收到的FCS位,如果未檢測到錯(cuò)誤,MAX14915設(shè)置OUT_輸出開關(guān)和/或根據(jù)SDI數(shù)據(jù)更改器件配置。如果檢測到CRC錯(cuò)誤,MAX14915不會(huì)改變OUT_輸出和/或器件配置。相反,MAX14915將COMERR邏輯輸出設(shè)置為低電平,即COMERR輸出晶體管漏極開路導(dǎo)通。
如果掩模寄存器設(shè)置為使能全局故障寄存器中的CRCfault位,MAX14915還將FAULT引腳設(shè)置為低電平,為微控制器提供中斷,以進(jìn)一步指示SPI接口上的通信錯(cuò)誤。
SDO(寫入周期)上的輸出數(shù)據(jù)
當(dāng)DAISY引腳為低電平時(shí),MAX14915附加到SDO數(shù)據(jù)的檢查字節(jié)的格式如圖2所示:
圖2.MAX14915在尋址SPI模式下發(fā)送SDO檢查字節(jié)。
A1 和 A0 是 A1 和 A0 引腳的電平,而 THERR 位是在發(fā)生芯片熱關(guān)斷事件時(shí)設(shè)置的。CRC[4:0]是MAX14915根據(jù)SDO數(shù)據(jù)計(jì)算的1個(gè)CRC位,包括A0、A14915和THERR值。這允許微控制器檢查從MAX<>接收的SDO數(shù)據(jù)是否存在錯(cuò)誤。
源代碼
本應(yīng)用筆記提供了實(shí)現(xiàn)CRC生成器和CRC檢查器的C源代碼。MAX14915使用單字節(jié)或雙字節(jié)包與微控制器通信。源代碼為每種情況提供了一個(gè)編碼器和解碼器:
CRC5encode_2byte(用于傳輸 2 個(gè)字節(jié))
CRC5encode_1byte(用于傳輸 1 字節(jié))
CRC5check_2byte(用于檢查MAX2的14915字節(jié)響應(yīng))
CRC5check_1byte(用于檢查MAX1的14915字節(jié)響應(yīng))
除了選擇單字節(jié)或雙字節(jié)數(shù)據(jù)包與MAX14915通信外,請(qǐng)注意,在這些代碼示例中,“byte”是8位無符號(hào)值的別名,有時(shí)以不同的方式標(biāo)記,例如UINT8。
Send1為第一個(gè)字節(jié),send2為第二個(gè)字節(jié),發(fā)送至MAX14915。代碼應(yīng)先發(fā)送1,后發(fā)送2,再crc_code至MAX14915。
crc_code = crc5encode (send1, send2);
用戶應(yīng)通過SPI接口發(fā)送3個(gè)字節(jié),先發(fā)送1,后跟send2,然后發(fā)送crc_code。當(dāng)微控制器通過SPI接口將配置設(shè)置發(fā)送到MAX14915時(shí),MAX14915同時(shí)將狀態(tài)信息返回給微控制器。這是檢查從MAX14915接收的crc_code是否正確的方法:
crc_ret = crc5decode (ret1, ret2);
字節(jié)結(jié)果“crc_ret”應(yīng)與MAX14915接收的第三個(gè)字節(jié)相同。
圖 3 和圖 4 顯示了 C 函數(shù)注釋中提到的數(shù)據(jù)位置。下載電子表格
圖3.CRC5數(shù)據(jù)發(fā)送到SDI上的MAX14915。
圖4.MAX5在SDO上發(fā)送的CRC14915數(shù)據(jù)。
public byte crc5encode(byte BYTE1, byte BYTE2)
{
byte crc5_start = 0x1f;
byte crc5_poly = 0x15;
byte crc_result = crc5_start;
// BYTE1
for (int i=0; i<8; i++)
{
if( ((( BYTE1>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f); } // shift left, keep only lower 6 bits
}
// BYTE2
for (int i=0; i<8; i++)
{
if( ((( BYTE2>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f); } // shift left, keep only lower 6 bits
}
// 3 extra bits set to zero
byte BYTE3=0x00;
for (int i=0; i<3; i++)
{
if( ((( BYTE3>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f)); } // shift left, keep only lower 6 bits
}
return crc_result;
}
byte crc5_decode(byte BYTE1, byte BYTE2)
{
byte crc5_start = 0x1f;
byte crc5_poly = 0x15;
byte crc_result = crc5_start;
// BYTE1
for (int i=2; i<8; i++)
{
if( ((( BYTE1>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f); } // shift left, keep only lower 6 bits
}
// BYTE2
for (int i=0; i<8; i++)
{
if( ((( BYTE2>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f); } // shift left, keep only lower 6 bits
}
// 3 extra bits set to zero
byte BYTE3=0x00;
for (int i=0; i<3; i++)
{
if( ((( BYTE3>>(7-i) ) &0x01) ^ ((crc_result & 0x10)>>4)) > 0 ) // IF(XOR(C6;BITAND(D5;2^4)/2^4)
{ crc_result = (byte) (crc5_poly ^ ((crc_result<<1) & 0x1f)); } // BITXOR($D$1;BITAND((D5*2);31))
else
{ crc_result = (byte)((crc_result<<1) & 0x1f); } // shift left, keep only lower 6 bits
}
return crc_result;
}
結(jié)論
本應(yīng)用筆記介紹了如何在與MAX14915八通道工業(yè)高邊開關(guān)通信的微控制器上對(duì)CRC算法進(jìn)行編碼。該代碼使用MAX14915EVKIT和相應(yīng)的GUI進(jìn)行測試。通過利用本應(yīng)用筆記中的C代碼示例,工程師獲得了一個(gè)經(jīng)過驗(yàn)證的解決方案來實(shí)現(xiàn)這種額外的數(shù)據(jù)通信保護(hù)。在某些情況下,應(yīng)在目標(biāo)微控制器上執(zhí)行一些基準(zhǔn)測試,尤其是在優(yōu)先考慮快速執(zhí)行速度的情況下。
審核編輯:郭婷
-
微控制器
+關(guān)注
關(guān)注
48文章
7394瀏覽量
150629 -
控制器
+關(guān)注
關(guān)注
112文章
16028瀏覽量
176648 -
SPI
+關(guān)注
關(guān)注
17文章
1681瀏覽量
91052
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論