⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gentable.c

📁 CRC16的源程序
💻 C
字号:
/*************************************************************************
 * Embedded System CRC16 Table Generator
 *
 * By Ashley Roll
 * Digital Nemesis Pty Ltd
 * www.digitalnemesis.com
 * ash (at) digitalnemesis (dot) com 
 *
 * To generate a CRC16 value efficiently, one needs to use a table 
 * driven algorithm. The generation of these tables fairly simple but
 * the code is often hard to find and is almost always designed for
 * generating a 256 entry table for operating on 8bits at a time.
 * 
 * In Embedded Systems there are often severe space limitations and a full
 * table of 256 16 bit entries would never fit. However the CRC16 algorithm
 * does not require such a large table to work. It can be done smaller.
 *
 * On the PIC micro processors, a nibble (4bit) implementation can be
 * achieved fairly easily and this requres only a table of 16 16bit values
 * or 32 bytes.
 *
 * This code was developed from the explanations and examples at
 * http://www.geocities.com/SiliconValley/Pines/8659/crc.htm This is a 
 * good reference for those wanting to understand what is happening in
 * the CRC algorithm.
 *
 * A few notes about terms:
 *
 * The "Message" is the series of data bytes that are being feed in. These
 * are fed in Most-Significant-Bit first of the first byte first.
 *
 * I've used the Standard CCITT CRC16 polynomial as this "standard"
 * doesn't use any of the bit reflection that confuses the implementation.
 * This polynomial is 0x1021 but you could use any you like.
 *
 * When implemented properly, a 4bit table will give the same result as a
 * 8 bit table, so on the microprocessor side you can use a 4 bit table to 
 * save space and on the host side (PC) you can use a 8 bit table for speed.
 *
 * The lookup table is generated by calling GenCRC16TableEntry() with
 * index being the index in the table, NumBits the width of the lookup
 * table, eg 4 or 8. and Poly being the polynomial being used.
 *
 * Note that GenCRC16TableEntry returns a 16 bit number. This may have to
 * be slit into high and low bytes for implementation on some processors
 * like the PIC which can only support 8 bit values in tables.
 *
 *************************************************************************/

#include <stdio.h>
#include <string.h>


#include "ex4bit.c"
void DoTestVector();

/*
 * Calculate the value to XOR into the shifted CRC register for the given index
 * NumBits should be the "width" of the chunk being operated on eg: 4 or 8. Poly
 * is the polynomial to use eg 0x1021
 */
unsigned short GenCRC16TableEntry( const unsigned short index, const short NumBits, const unsigned short Poly )
{
	int i;
	unsigned short Ret;
		
	// Prepare the initial setup of the register so the index is at the
	// top most bits.
	Ret = index;
	Ret <<= 16 - NumBits;

	for( i = 0; i < NumBits; i++ ) {
		if( Ret & 0x8000 )
			Ret = (Ret << 1) ^ Poly;
		else 
			Ret = Ret << 1;
	}
	
	return Ret;
}

/*
 * The following Defines are used to configure the table generator
 */
#define NUM_BITS 4			// Width of message chunk each iteration of the CRC algorithm
#define POLYNOMIAL 0x1021	// The Polynomial (0x1021 is the CCITT standard one)

main() {
	unsigned short i, Count, te;
	
	// Setup the values to compute the table
	Count = 1 << NUM_BITS;		// Number of entries in the table
	
	// Generate the WORD width table
	printf("/* CRC16 Lookup table for %u bits per iteration. Full WORD per entry */\r\n", NUM_BITS );
	printf("unsigned short CRC16_Lookup[%u] = {", Count );

	for( i = 0; i < Count; i++ ) {
		if( (i % 8) == 0 )
			printf("\r\n\t");

		te = GenCRC16TableEntry( i, NUM_BITS, POLYNOMIAL );
		printf("0x%04X", te);

		if( i+1 != Count )
			printf(", ");
	}
	printf("\r\n};\r\n", Count );

	// Generate the HIGH byte table
	printf("/* CRC16 Lookup tables (High and Low Byte) for %u bits per iteration. */\r\n", NUM_BITS );
	printf("unsigned short CRC16_LookupHigh[%u] = {", Count );

	for( i = 0; i < Count; i++ ) {
		if( (i % 8) == 0 )
			printf("\r\n\t");

		te = GenCRC16TableEntry( i, NUM_BITS, POLYNOMIAL );
		printf("0x%02X", (unsigned char)(te >> 8));

		if( i+1 != Count )
			printf(", ");
	}
	printf("\r\n};\r\n", Count );

	// Generate the LOW byte table
	printf("unsigned short CRC16_LookupLow[%u] = {", Count );

	for( i = 0; i < Count; i++ ) {
		if( (i % 8) == 0 )
			printf("\r\n\t");

		te = GenCRC16TableEntry( i, NUM_BITS, POLYNOMIAL );
		printf("0x%02X", (unsigned char)(te & 0x00FF));

		if( i+1 != Count )
			printf(", ");
	}
	printf("\r\n};\r\n", Count );

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -