Pololu Maestro User Manual
Page 40

A detailed account of how cyclic redundancy checking works is beyond the scope of this document, but you can find
a wealth of information using
. 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 Maestro 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 you tack onto the end
of your command packets.
The CRC implemented on the Maestro is the same as the one on the
and
motor controller but differs from that on the
motor controller. Instead of being done MSB first, the computation is
performed LSB first to match the order in which the bits are transmitted over the serial line. In standard
binary notation, the number 0x91 is written as 10010001. However, the bits are transmitted in this
order: 1, 0, 0, 0, 1, 0, 0, 1, so we will write it as 10001001 to carry out the computation below.
The CRC-7 algorithm is as follows:
1. Express your 8-bit CRC-7 polynomial and message in binary, LSB first. The polynomial 0x91 is written as
10001001.
2. Add 7 zeros to the end of your message.
3. Write your CRC-7 polynomial underneath the message so that the LSB of your polynomial is directly below
the LSB of your message.
4. If the LSB of your CRC-7 is aligned under a 1, XOR the CRC-7 with the message to get a new message; if
the LSB of your CRC-7 is aligned under a 0, do nothing.
5. Shift your CRC-7 right one bit. If all 8 bits of your CRC-7 polynomial still line up underneath message bits,
go back to step 4.
6. What’s left of your message is now your CRC-7 result (transmit these seven bits as your CRC byte when
talking to the Maestro with CRC enabled).
If you have never encountered CRCs before, this probably sounds a lot more complicated than it really is. The
following example shows that the CRC-7 calculation is not that difficult. For the example, we will use a two-byte
sequence: 0x83, 0x01.
Steps 1 & 2 (write as binary, least significant bit first,
add 7 zeros to the end of the message):
CRC-7 Polynomial = [1 0 0 0 1 0 0 1]
message = [1 1 0 0 0 0 0 1] [1 0 0 0 0 0 0 0] 0 0 0 0 0 0 0
Steps 3, 4, & 5:
_______________________________________________
1 0 0 0 1 0 0 1 ) 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
XOR 1 0 0 0 1 0 0 1 | | | | | | | | | | | | | | |
--------------- | | | | | | | | | | | | | | |
1 0 0 1 0 0 0 1 | | | | | | | | | | | | | |
shift ----> 1 0 0 0 1 0 0 1 | | | | | | | | | | | | | |
_______________ | | | | | | | | | | | | | |
1 1 0 0 0 0 0 0 | | | | | | | | | | |
1 0 0 0 1 0 0 1 | | | | | | | | | | |
_______________ | | | | | | | | | | |
1 0 0 1 0 0 1 0 | | | | | | | | | |
1 0 0 0 1 0 0 1 | | | | | | | | | |
_______________ | | | | | | | | | |
1 1 0 1 1 0 0 0 | | | | | | |
1 0 0 0 1 0 0 1 | | | | | | |
_______________ | | | | | | |
Pololu Maestro Servo Controller User's Guide
© 2001–2014 Pololu Corporation
5. Serial Interface
Page 40 of 73