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

📄 crc.c

📁 freescale crc模块驱动 经调试
💻 C
字号:
/******************************************************************************
 * 源程序文件名: crc.c                                                        *
 * 功能: 循环冗余码校验模块                                                   *
 * 说明: 循环冗余码校验为16位,使用CRC-16生成多项式                            *
 ******************************************************************************/

/******************************************************************************
 *                             CRC校验的工作原理                              *
 * CRC校验方法是将要发送的数据比特序列当作一个多项式f(x)的系数,在发送方用收发 *
 * 双方预先约定的生成多项式G(x)去除,求得一个余数多项式.将余数多项式加到数据多 *
 * 项式之后发送到接收端.接收端用同样的生成多项式G(x)去除接收数据多项式f(x),得 *
 * 到计算余数多项式.如果计算余数多项式与接收余数多项式相同,则表示传输无差错;  *
 * 如果计算余数多项式不等于接收余数多项式,则表示传输有差错,由发送方重发数据,  *
 * 直到正确为止                                                               *
 ******************************************************************************/

# include "crc.h"

/* CRC16 = X16+X15+X5+1 */
static const unsigned short _crc1608_0xA001_[256] = {
	0X0000,0XC0C1,0XC181,0X0140,0XC301,0X03C0,0X0280,0XC241,
	0XC601,0X06C0,0X0780,0XC741,0X0500,0XC5C1,0XC481,0X0440, // 0
    0XCC01,0X0CC0,0X0D80,0XCD41,0X0F00,0XCFC1,0XCE81,0X0E40,
	0X0A00,0XCAC1,0XCB81,0X0B40,0XC901,0X09C0,0X0880,0XC841, // 1
	0XD801,0X18C0,0X1980,0XD941,0X1B00,0XDBC1,0XDA81,0X1A40,
	0X1E00,0XDEC1,0XDF81,0X1F40,0XDD01,0X1DC0,0X1C80,0XDC41, // 2
    0X1400,0XD4C1,0XD581,0X1540,0XD701,0X17C0,0X1680,0XD641,
    0XD201,0X12C0,0X1380,0XD341,0X1100,0XD1C1,0XD081,0X1040, // 3
	0XF001,0X30C0,0X3180,0XF141,0X3300,0XF3C1,0XF281,0X3240,
	0X3600,0XF6C1,0XF781,0X3740,0XF501,0X35C0,0X3480,0XF441, // 4
	0X3C00,0XFCC1,0XFD81,0X3D40,0XFF01,0X3FC0,0X3E80,0XFE41,
	0XFA01,0X3AC0,0X3B80,0XFB41,0X3900,0XF9C1,0XF881,0X3840, // 5
	0X2800,0XE8C1,0XE981,0X2940,0XEB01,0X2BC0,0X2A80,0XEA41,
	0XEE01,0X2EC0,0X2F80,0XEF41,0X2D00,0XEDC1,0XEC81,0X2C40, // 6
	0XE401,0X24C0,0X2580,0XE541,0X2700,0XE7C1,0XE681,0X2640,
	0X2200,0XE2C1,0XE381,0X2340,0XE101,0X21C0,0X2080,0XE041, // 7
	0XA001,0X60C0,0X6180,0XA141,0X6300,0XA3C1,0XA281,0X6240,
	0X6600,0XA6C1,0XA781,0X6740,0XA501,0X65C0,0X6480,0XA441, // 8
	0X6C00,0XACC1,0XAD81,0X6D40,0XAF01,0X6FC0,0X6E80,0XAE41,
	0XAA01,0X6AC0,0X6B80,0XAB41,0X6900,0XA9C1,0XA881,0X6840, // 9
	0X7800,0XB8C1,0XB981,0X7940,0XBB01,0X7BC0,0X7A80,0XBA41,
	0XBE01,0X7EC0,0X7F80,0XBF41,0X7D00,0XBDC1,0XBC81,0X7C40, // A
	0XB401,0X74C0,0X7580,0XB541,0X7700,0XB7C1,0XB681,0X7640,
	0X7200,0XB2C1,0XB381,0X7340,0XB101,0X71C0,0X7080,0XB041, // B
	0X5000,0X90C1,0X9181,0X5140,0X9301,0X53C0,0X5280,0X9241,
	0X9601,0X56C0,0X5780,0X9741,0X5500,0X95C1,0X9481,0X5440, // C
	0X9C01,0X5CC0,0X5D80,0X9D41,0X5F00,0X9FC1,0X9E81,0X5E40,
	0X5A00,0X9AC1,0X9B81,0X5B40,0X9901,0X59C0,0X5880,0X9841, // D
	0X8801,0X48C0,0X4980,0X8941,0X4B00,0X8BC1,0X8A81,0X4A40,
	0X4E00,0X8EC1,0X8F81,0X4F40,0X8D01,0X4DC0,0X4C80,0X8C41, // E
	0X4400,0X84C1,0X8581,0X4540,0X8701,0X47C0,0X4680,0X8641,
	0X8201,0X42C0,0X4380,0X8341,0X4100,0X81C1,0X8081,0X4040  // F
};

# define _crc1608revupdatemacro(d,a,t) \
	*(a) = ((*(a)>> 8)^(t)[(*(a)^(d))&0x000000FF])

/******************************************************************************
 * 函数原型: unsigned int crc1608strrevCrC16(char *buf, char nn, int *crcp);  *
 * 功能: 计算CRC的值并更新CRC累加器值                                         *
 * 说明: 1.本函数采用了"反序查表"的算法                                       *
 *       2.buf为所校验数组第1个字节的指针,nn为需要校验字节的个数              *
 *       3.crcp存储计算出的CRC校验值                                          *
 ******************************************************************************/
unsigned int crc1608strrevCRC16 (char *buf, char nn, int *crcp)
{
	// calculates CRC for a string using the table-lookup method
	// reversal sequence
	char i;
	unsigned int acc;
    acc = 0x0000;
    for(i = 0; i < nn; i++)
		_crc1608revupdatemacro(
		    (unsigned int)(unsigned char)buf[i], &acc,
		        _crc1608_0xA001_);
	if(crcp)
		*(unsigned int *)crcp = acc;
	return (unsigned int)acc;
}
# undef  _crc1608revupdmacro

⌨️ 快捷键说明

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