Читаю 64 битный идентификатор по 1 wire, достоверно получаю один и тот же код и идентификатор производителя
Осталось проверить CRC, которая ко мне приходит вместе с данными.
Согласно даташиту подсчет должен быть для 8 бит - CRC is: CRC = x8 + x5 + x4 + 1.
Взял исходники у атмела по этому поводу , скомпилировал под свой буфер следующим образом:
Код
unsigned char flag=0, tempdata[9];
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
unsigned char OWI_CheckRomCRC(unsigned char * romValue)
{
unsigned char i;
unsigned char crc8 = 0;
for (i = 0; i < 7; i++)
{
crc8 = OWI_ComputeCRC8(*romValue, crc8);
romValue++;
}
if (crc8 == (*romValue))
{
return 1;
}
return 0;
}
// заполняем tempdata 64-битным идентификатором......
if(OWI_CheckRomCRC(tempdata))
{
flag = CRC_OK;
}
unsigned char OWI_ComputeCRC8(unsigned char inData, unsigned char seed)
{
unsigned char bitsLeft;
unsigned char temp;
for (bitsLeft = 8; bitsLeft > 0; bitsLeft--)
{
temp = ((seed ^ inData) & 0x01);
if (temp == 0)
{
seed >>= 1;
}
else
{
seed ^= 0x18;
seed >>= 1;
seed |= 0x80;
}
inData >>= 1;
}
return seed;
}
unsigned char OWI_CheckRomCRC(unsigned char * romValue)
{
unsigned char i;
unsigned char crc8 = 0;
for (i = 0; i < 7; i++)
{
crc8 = OWI_ComputeCRC8(*romValue, crc8);
romValue++;
}
if (crc8 == (*romValue))
{
return 1;
}
return 0;
}
// заполняем tempdata 64-битным идентификатором......
if(OWI_CheckRomCRC(tempdata))
{
flag = CRC_OK;
}
В итоге совпадения между подсчитываемой по 7 байтам tempdata и принимаемой CRC нет.
Может кто сталкиался, приведите пожадуйста пример кода подсчета и сравнения CRC.
Заранее благодарен