Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Alexeus
Вымогатель припоя
Сообщения: 690 Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщение
Alexeus » Ср апр 20, 2011 13:21:36
Принимаю пакет данных с устройства через SPI протокол. Пакет из шести байт, причем пять -это данные, а шестой похоже контрольная сумма. Принимаю, использую пять байт как мне нужно, но не могу проверить пакет на целостность- неизвестно как расчитывается эта контрольная сумма. А иногда бывают сбои- в этот момент проверка КС как раз не помешала бы...
Пакет данных типа:
Код: Выделить всё
1 2 3 4 5 6 ;байт
29 10 12 4D 00 E8 ;E8- CRC
29 10 12 45 28 C8 ;C8- CRC
Помогите пожалуйста определить, как мне программно высчитать такой же CRC и сравнить его с 6м байтом для определения целостности пакета.
a_skr
Вымогатель припоя
Сообщения: 630 Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский
Сообщение
a_skr » Ср апр 20, 2011 14:11:39
маловато примеров и очень похожие, но:
29 + 10 + 12 + 4D + 00 + E8 = 180
29 + 10 + 12 + 45 + 28 + C8 = 180
coredumped
Опытный кот
Сообщения: 838 Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли
Сообщение
coredumped » Ср апр 20, 2011 14:19:42
Подбирать можно очень долго. Вы скажите, что за устройство, может протокол известен и соответственно алгоритм тоже.
По крайней мере не Intel-овский 2's complement.
Все будет только лучше, в крайнем случае - хуже.
Psych
Опытный кот
Сообщения: 848 Зарегистрирован: Ср мар 02, 2011 07:47:39
Откуда: Уфа
Сообщение
Psych » Ср апр 20, 2011 14:26:27
Очень похоже вот на этот вариант:
Делается XOR между 5 байтами, далее результат XOR 8E получаем 6 байт. Подходит для обоих случаев. То есть 1 байт^2 байт^3 байт^4 байт^5 байт^8E получим crc
urry
Сверлит текстолит когтями
Сообщения: 1262 Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:
Сообщение
urry » Ср апр 20, 2011 15:24:09
Да, дополнение, потому что обычный поиск полинома ничего не дает - начинал с 0 и фф, результат - чистый и как дополнение до 0 - ничего не находится.
Код: Выделить всё
unsigned char CprofilesDlg::calc_crc (char cPolinom)
{
unsigned char i,data,crc,fb,st_byt,cRazmer;
cRazmer=5;//sizeof(cArr);
st_byt=0;
crc=0x0;
cArr[0]=0x29;
cArr[1]=0x10;
cArr[2]=0x12;
cArr[3]=0x4D;
cArr[4]=0x00;
do{
data=cArr[st_byt];
for (i=0;i<8;i++)// счетчик битов в байте
{
fb =crc ^ data;
fb&=1;
crc >>= 1;
data >>= 1;
if (fb == 1)crc^=cPolinom;// полином
}
st_byt++;
}while (st_byt != cRazmer);// счетчик байтов в массиве
return crc;
}
//----------------------------------------------------------------------
void CprofilesDlg::FindPolinom(void)
{
char cEtalon=0xE8;
for(unsigned char i=0;i<0xFF;i++)
{
if(calc_crc (i) == cEtalon)
{
TRACE("polinom = %d\n",i);
}
}
TRACE("ok\n");
}
Alexeus
Вымогатель припоя
Сообщения: 690 Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщение
Alexeus » Ср апр 20, 2011 17:18:42
a_skr, в большинстве случаев действительно 0х80 получается, но есть вариант где не получается.
a_skr
Вымогатель припоя
Сообщения: 630 Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский
Сообщение
a_skr » Ср апр 20, 2011 19:02:29
Alexeus писал(а): a_skr, в большинстве случаев действительно 0х80 получается, но есть вариант где не получается.
примеры в студию
GRAF
Мудрый кот
Сообщения: 1867 Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград
Сообщение
GRAF » Ср апр 20, 2011 19:08:35
Пакет делится на образующий полином CRC, остаток записывается в виде контрольной суммы.
Alexeus
Вымогатель припоя
Сообщения: 690 Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщение
Alexeus » Ср апр 20, 2011 19:16:14
вот куча пакетов, если все складывать, то получается или 80 или 0 (всё в HEX)
Код: Выделить всё
29 10 12 4d 0 e8 80
29 10 12 45 28 c8 80
29 10 12 45 0 f0 80
29 10 12 3d 28 d0 80
29 10 12 3d 0 f8 80
29 10 12 35 28 d8 80
29 10 12 35 0 80 0
29 10 12 2d 28 e0 80
29 10 12 2d 0 88 0
29 10 12 25 28 e8 80
29 10 12 25 0 90 0
29 10 12 1d 28 f0 80
29 10 12 1d 0 98 0
29 10 12 15 28 f8 80
29 10 12 15 0 a0 0
29 10 12 0d 28 80 0
29 10 12 0d 0 a8 0
29 10 12 5 28 88 0
29 10 12 5 0 b0 0
29 10 0a 4d 28 c8 80
29 10 0a 4d 0 f0 80
29 10 0a 45 28 d0 80
29 10 0a 45 0 f8 80
29 10 0a 3d 28 d8 80
29 10 0a 3d 0 80 0
29 10 0a 35 28 e0 80
29 10 0a 35 0 88 0
29 10 0a 2d 28 e8 80
29 10 0a 2d 0 90 0
----------------------------------------------
29 10 12 4d 0 e8 80
39 10 12 4d 0 d8 80
49 10 12 4d 0 c8 80
69 10 12 4d 0 a8 80
----------------------------------------------
29 10 12 4d 4 e4 80
29 50 12 4d 5 a3 80
29 50 12 4d 1 a7 80
29 70 12 4d 2 86 80
28 74 12 4d 0 85 80
29 74 12 4d 0 84 80
2a 74 12 4d 0 83 80
2b 74 12 4d 0 82 80
2c 74 12 4d 0 81 80
2d 74 12 4d 0 80 80
2e 74 12 4d 0 ff 0
----------------------------------------------
GRAF
Мудрый кот
Сообщения: 1867 Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград
Сообщение
GRAF » Чт апр 21, 2011 01:04:42
В АВР-овском апноте AVR236 подробно расписано, как контрольная сумма для CRC считается.
Alexeus
Вымогатель припоя
Сообщения: 690 Зарегистрирован: Вс мар 04, 2007 01:17:12
Сообщение
Alexeus » Чт апр 21, 2011 07:36:55
Спасибо, посмотрю.
Эти пакеты с NEC`овского микроконтроллера.