2014-09-22 2 views
0

Попытка понять crc8. Это мои расчеты:Сумма CRC8 OneWire

poly 100110001 # OneWire 

bin 00000001 # 1 

1. 000000010 << 1 = 000000100 
2. 000000100 << 1 = 000001000 
3. 000001000 << 1 = 000010000 
4. 000010000 << 1 = 000100000 
5. 000100000 << 1 = 001000000 
6. 001000000 << 1 = 010000000 
7. 010000000 << 1 = 100000000 
8. 100000000^100110001 = 000110001 << 1 = 001100010 == 00110001 # 8 digits 

crc8 = 0x31 # online calc true 

bin 01000001 # 41 

1. 010000010 << 1 = 100000100 
2. 100000100^100110001 = 000110101 << 1 = 001101010 
3. 001101010 << 1 = 011010100 
4. 011010100 << 1 = 110101000 
5. 110101000^100110001 = 010011001 << 1 = 100110010 
6. 100110010^100110001 = 000000011 << 1 = 000000110 
7. 000000110 << 1 = 000001100 
8. 000001100 << 1 = 000011000 == 00001100 

crc8 = 0xC# online calc true 

Теперь нужно crc8 из 141 Первый один плюс второй. С помощью онлайн-калькулятора https://ghsi.de/CRC/index.php?Polynom=100110001&Message=141 Я вижу, что crc8 из 141 должно быть 0xF8. Но 0x31 + 0xC будет 3D. Где ошибка?

ответ

0

Во-первых, CRC не добавляют такого. Вам необходимо принять значение регистра после запуска 0x01 через, что дает 0x31, и использовать это как начальное значение регистра при подаче 0x41. Вам необходимо сделать эксклюзивную или 0x41 с 0x31 в качестве первого шага, в результате получится 0x70. Учитывая, что восемь шагов дают вам 0xf8, как и ожидалось.

Однако вы еще не достигли OneWire CRC-8. Этот CRC-8 вычисляется в обратном направлении, сдвигаясь вниз, а не вверх и используя многочлен (исключая x). В отличие от того, что вы сделали и что делает этот сайт, что меняется. Более того, сообщение подается обратно.

+0

Это сработало :) Thx. '1. \t 011100000 << 1 = 111000000 2. \t 111000000^100110001 = 011110001 << 1 = 111100010 3. \t 111100010^100110001 = 011010011 << 1 = 110100110 4. \t 110100110^100110001 = 010010111 << 1 = 100101110 5. \t 100101110^100110001 = 000011111 << 1 = 000111110 6. \t 000111110 << 1 = 001111100 7. \t 001111100 << 1 = 011111000 8. \t 011111000 << 1 = 111110000 == 11111000' О-Wire , Как я понимаю, вместо сдвига влево 1, я должен перейти вправо 8? Если исходное сообщение «123456789», для OneWire оно должно быть «987654321». Но что делать с поли? – cask

+0

Для каждого шага сдвиг вправо один, эксклюзивный с полиномом, если бит сдвинут, один. Полином обратный, поэтому '10001100'. –