
10. Cyclic redundancy check (CRC)
To help prevent communication errors, the Motoron by default requires a cyclic redundancy check
(CRC) byte to be appended to each command it receives, and it also appends a CRC byte to each
response it sends. If the CRC byte for a command is incorrect, the Motoron will ignore the command
and set the “CRC error” status flag. You can disable CRC by sending a “Set protocol options”
command as documented in
.
A detailed account of how cyclic redundancy checking works is beyond the scope of this document, but
you can find more information using
[http://en.wikipedia.org/wiki/Cyclic_redundancy_check]
. The
CRC computation is basically a carryless long division of a CRC “polynomial”, 0x91, into your message
(expressed as a continuous stream of bits), where all you care about is the remainder. The Motoron
uses CRC-7, which means it uses an 8-bit polynomial and, as a result, produces a 7-bit remainder.
This remainder is the lower 7 bits of the CRC byte that is tacked onto the end of a message.
The C code below shows one way to implement the CRC algorithm:
Note that the innermost for loop in the example above can be replaced with a lookup from a
precomputed 256-byte lookup table, which should be faster.
For example, a “Set speed” command setting the speed of 1 to 100 with a CRC byte appended to it
would be:
0xD1 0x01 0x64 0x00 0x68
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdint.h>
uint8_t getCRC(uint8_t * message, uint8_t length)
{
uint8_t crc = 0;
for
(uint8_t i = 0; i < length; i++)
{
crc ^= message[i];
for
(uint8_t j = 0; j < 8; j++)
{
if
(crc & 1) { crc ^= 0x91; }
crc >>= 1;
}
}
return
crc;
}
Pololu Motoron Motor Controller User’s Guide
© 2001–2022 Pololu Corporation
10. Cyclic redundancy check (CRC)
Page 66 of 67