Zektor HDVI5 User manual - Checksums and Crc-8’S
10
HDVI5 Component Video Switch
11
HDVI5 Component Video Switch
Checksums and CRC-8 Checkcodes Defined
The use of a checksums or CRC-8 checkcodes can increase the reliability of communications
between the controller and any Zektor device.
A checksum is calculated by using an unsigned byte as an accumulator, and adding together all
the ASCII characters of a command string, up to and including the ‘;’ character, while ignoring
any overflow, and appending it as a decimal parameter to the end of the command.
A CRC-8 checkcode is calculated in a very similar way, but a CRC-8 algorithm is used instead of
a simply adding together the ASCII characters. The CRC-8 byte is initialized to ‘FF’ hex, and the
resultant value is sent inverted (one's compliment).
The CRC polynomial used is: x^8 +x^6 +x^3 +x^2 +1.
This polynomial was determined through exhaustive tests (all 8 bit polynomials tested), to be the
best CRC-8 polynomial for arbitrarily length bit streams.
See paper entitled: “Cyclic Redundancy Code (CRC) Polynomial Selection For Embedded
Networks” by Philip Koopman & Tridib Chakravarty. dsn04/koopman04_crc_poly_embedded.pdf> Another good source of CRC information is the CRC entry on Wikipedia, the free encyclopedia: Differences between a Checksum and a CRC-8 Checkcode A CRC is capable of finding many more and different types of errors than a checksum can. A good description of its capability is described in the above referenced articles, but a simple example show some of the differences well. Here’s an example of the intended command string: LI 2,3 Here’s some examples of the original and some badly formed strings, of the above example, and their associated checksums: LI 2,3;129 LI 3,2;129 IL 2,3;129 KJ 2,3;129 Notice that every checksum is the same. Checksums cannot detected data being out of order. Checksums cannot detect errors where two bits, in the same position in two different bytes, are flipped. Checksums are not a very robust way to check for communication errors. For comparison, here are the same examples and their associated CRC-8 checkcodes: LI 2,3:16 LI 3,2:114 IL 2,3:22 KJ 2,3:145 The CRC-8 checkcode easily catches these errors. Source Code Example of Calculating a Checksum The following is a simple “C” program that calculates the checksum of the string “TestString” and then prints the initial string with the calculated checksum appended to it. #include "stdio.h" int main( void) { char TestString[] = "LI 2,3"; unsigned char cksum; int index; char token = ';'; cksum = 0; // initialize checksum // Checksum all of 'TestString[]' index = 0; while (TestString[index] != '\0') cksum += TestString[index++]; // Add the checksum token character ';' to checksum cksum += token; // Print the results printf( "%s%c%u", TestString, token, (unsigned char)cksum); return (0); } Checksums and CRC-8’s (Cont’d)Checksums and CRC-8’s