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

📄 ex4bit.c

📁 CRC16的源程序
💻 C
字号:
/*************************************************************************
 * Example Table Driven CRC16 Routine using 4-bit message chunks
 * The ex4bit.c file contains an implementation of the CCITT CRC16.
 * By Ashley Roll
 * Digital Nemesis Pty Ltd
 * www.digitalnemesis.com
 * ash (at) digitalnemesis (dot) com 
 *
 * The following is an example of implementing a restricted size CRC16
 * table lookup. No optimisation as been done so the code is clear and
 * easy to understand.
 *
 * Test Vector: "123456789" (character string, no quotes)
 * Generated CRC: 0x29B1
 * 使用keil c仿真结果正确为0x29b1
 *************************************************************************/

/* 
 * CRC16 Lookup tables (High and Low Byte) for 4 bits per iteration. 
 */
unsigned short CRC16_LookupHigh[16] = {
        0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
        0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1
};
unsigned short CRC16_LookupLow[16] = {
        0x00, 0x21, 0x42, 0x63, 0x84, 0xA5, 0xC6, 0xE7,
        0x08, 0x29, 0x4A, 0x6B, 0x8C, 0xAD, 0xCE, 0xEF
};

/*
 * CRC16 "Register". This is implemented as two 8bit values
 */
unsigned char CRC16_High, CRC16_Low;

/*
 * Before each message CRC is generated, the CRC register must be 
 * initialised by calling this function
 */
void CRC16_Init( void )
{
	// Initialise the CRC to 0xFFFF for the CCITT specification
	CRC16_High = 0xFF;
	CRC16_Low = 0xFF;
}

/*
 * Process 4 bits of the message to update the CRC Value.
 *
 * Note that the data must be in the low nibble of val.
 */
void CRC16_Update4Bits( unsigned char val )
{
	unsigned char	t;

	// Step one, extract the Most significant 4 bits of the CRC register
	t = CRC16_High >> 4;

	// XOR in the Message Data into the extracted bits
	t = t ^ val;

	// Shift the CRC Register left 4 bits
	CRC16_High = (CRC16_High << 4) | (CRC16_Low >> 4);
	CRC16_Low = CRC16_Low << 4;

	// Do the table lookups and XOR the result into the CRC Tables
	CRC16_High = CRC16_High ^ CRC16_LookupHigh[t];
	CRC16_Low = CRC16_Low ^ CRC16_LookupLow[t];
}

/*
 * Process one Message Byte to update the current CRC Value
 */
void CRC16_Update( unsigned char val )
{
	CRC16_Update4Bits( val >> 4 );		// High nibble first
	CRC16_Update4Bits( val & 0x0F );	// Low nibble
}

⌨️ 快捷键说明

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