Trying to understand crc8. This is my calculations:
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
Now need crc8 of 141 The first one plus the second. Using online calculator https://ghsi.de/CRC/index.php?Polynom=100110001&Message=141 I see that crc8 of 141 must be 0xF8. But 0x31 + 0xC will be 3D. Where is the error?
First off, CRCs don't add like that. You need to take the register value after running
0x01through, which gives0x31, and use that as the starting register value when feeding0x41. You need to exclusive-or the0x41with the0x31as the first step, resulting in0x70. Given that, eight steps give you0xf8as expected.However you have not yet arrived at the OneWire CRC-8. That CRC-8 is computed in the reversed direction, shifting down instead of up and using the polynomial (excluding the x8) reversed. Unlike both what you did and what that website does, which is shifting up. What's more, the message is fed in backwards.