Support » Pololu Motoron Motor Controller User’s Guide »
11. 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 Section 9.
A detailed account of how cyclic redundancy checking works is beyond the scope of this document, but you can find more information using Wikipedia. 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:
#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; }
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 |