#include "crc.h"
|
|
|
void Init_CRC_CRC_CCITT(void)
|
{
|
CRC_InitTypeDef init_para;
|
|
CMU_PERCLK_SetableEx(CRCCLK, ENABLE);
|
|
init_para.CRCSEL = CRC_CR_SEL_CRC16; /*!<CRCУÑé¶àÏîʽѡÔñ*/
|
init_para.RFLTIN = CRC_CR_RFLTIN_BYTE;/*!<CRCÊäÈ뷴ת¿ØÖÆ*/
|
init_para.RFLTO = CRC_CR_RFLTO_BYTE; /*!<CRCÊä³ö·´×ª¿ØÖÆ*/
|
init_para.XOR = DISABLE; /*!<Êä³öÒì»òʹÄÜ*/
|
init_para.PARA = CRC_CR_PARA_SERIAL;/*!<CRC¿ìËÙ¼ÆËãʹÄÜ*/
|
init_para.OPWD = CRC_CR_OPWD_BYTE; /*!<WORD²Ù×÷ʹÄÜ*/
|
init_para.CRCPOLY = 0x1021; /*!<CRC¶àÏîʽ¼Ä´æÆ÷*/
|
init_para.CRC_XOR = 0x0000; /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/
|
init_para.LFSR = 0x0000; /*!<³õʼֵ*/
|
CRC_Init(&init_para);
|
}
|
|
void Init_CRC_CRC_MODBUS(void)
|
{
|
CRC_InitTypeDef init_para;
|
|
CMU_PERCLK_SetableEx(CRCCLK, ENABLE);
|
|
init_para.CRCSEL = CRC_CR_SEL_CRC16; /*!<CRCУÑé¶àÏîʽѡÔñ*/
|
init_para.RFLTIN = CRC_CR_RFLTIN_BYTE;/*!<CRCÊäÈ뷴ת¿ØÖÆ*/
|
init_para.RFLTO = CRC_CR_RFLTO_BYTE; /*!<CRCÊä³ö·´×ª¿ØÖÆ*/
|
init_para.XOR = DISABLE; /*!<Êä³öÒì»òʹÄÜ*/
|
init_para.PARA = CRC_CR_PARA_SERIAL;/*!<CRC¿ìËÙ¼ÆËãʹÄÜ*/
|
init_para.OPWD = CRC_CR_OPWD_BYTE; /*!<WORD²Ù×÷ʹÄÜ*/
|
init_para.CRCPOLY = 0x8005; /*!<CRC¶àÏîʽ¼Ä´æÆ÷*/
|
init_para.CRC_XOR = 0x0000; /*!<ÔËËã½á¹ûÒì»ò¼Ä´æÆ÷*/
|
init_para.LFSR = 0xFFFF; /*!<³õʼֵ*/
|
CRC_Init(&init_para);
|
}
|
|
|
//CRC-16/CCITT x16+x12+x5+1 0x1021
|
//Init = 0x0000
|
//RefIn£¬RefOut
|
//¼ÆËã½á¹û¸ßµÍ×Ö½Úµ¹ÐòÊä³ö,¸ßλÔÚ×󣬵ÍλÔÚÓÒ¡£
|
unsigned int CalCRC16_CCITT( uint16 Init, uint08 *DataIn, uint32 Len )
|
{
|
uint32 i;
|
uint16 CRC16;
|
|
CRC_LFSR_Write(Init); //³õÖµ¼Ä´æÆ÷
|
|
for( i=0; i<Len; i++ )
|
{
|
CRC_DR_Write(DataIn[i]);//ÊäÈëÊä³ö¼Ä´æÆ÷
|
Do_DelayStart();
|
{
|
if(RESET == CRC_CR_BUSY_Chk())
|
{
|
break;
|
}
|
}While_DelayUsEnd(200);
|
}
|
|
CRC16 = CRC_DR_Read() & 0xffff;
|
return CRC16;
|
}
|
|
|
//CRC-16/MODBUS x16+x15+x2+1 0x8005
|
//Init = 0xFFFF
|
//RefIn£¬RefOut
|
//¼ÆËã½á¹û¸ßµÍ×Ö½Úµ¹ÐòÊä³ö
|
unsigned int CalCRC16_MODBUS( uint16 Init, uint08 *DataIn, uint32 Len )
|
{
|
uint32 i;
|
uint16 CRC16;
|
|
CRC_LFSR_Write(Init); //³õÖµ¼Ä´æÆ÷
|
|
for( i=0; i<Len; i++ )
|
{
|
CRC_DR_Write(DataIn[i]);//ÊäÈëÊä³ö¼Ä´æÆ÷
|
Do_DelayStart();
|
{
|
if(RESET == CRC_CR_BUSY_Chk())
|
{
|
break;
|
}
|
}While_DelayUsEnd(200);
|
}
|
|
CRC16 = CRC_DR_Read() & 0xffff;
|
return CRC16;
|
}
|
|
|
//Õâ¸öоƬµÄÓ²¼þCRCÐèÒªÕâô²Ù×÷£¬ÎÒÃÇÔ±¾Ð´µÄÈí¼þCRC²»ÐèÒªµÄ¡£ 0xffffºÍ0x0000Õâôת»»Ö®ºó¶¼ÊÇÔÖµ¡£
|
unsigned int BitChange(unsigned int us_DataIn)
|
{
|
unsigned int us_Data = us_DataIn;
|
us_Data = ((us_Data & 0xFF00) >> 8) | ((us_Data & 0x00FF) << 8);
|
us_Data = ((us_Data & 0xF0F0) >> 4) | ((us_Data & 0x0F0F) << 4);
|
us_Data = ((us_Data & 0xCCCC) >> 2) | ((us_Data & 0x3333) << 2);
|
us_Data = ((us_Data & 0xAAAA) >> 1) | ((us_Data & 0x5555) << 1);
|
|
return (us_Data);
|
}
|