CRC

#include "BAT32G135.h"
#include "clk.h"
#include "stdio.h"
#include "userdefine.h"
#include "sci.h"

void InvertUint16(unsigned short *DesBuf, unsigned short *SrcBuf)  
{  
    int i;  
    unsigned short temp = 0;    
    
    for(i = 0; i < 16; i++)  
    {  
        if(SrcBuf[0] & (1 << i))
        {          
            temp |= 1<<(15 - i);  
        }
    }  
    DesBuf[0] = temp;  
}

void InvertUint8(unsigned char *DesBuf, unsigned char *SrcBuf)
{
    int i;
    unsigned char temp = 0;
    
    for(i = 0; i < 8; i++)
    {
        if(SrcBuf[0] & (1 << i))
        {
            temp |= 1<<(7-i);
        }
    }
    DesBuf[0] = temp;
}

uint16_t u16CRCVerify (const uint8_t  *pu8Data,
                             uint32_t  u32Len,
                             uint16_t  u16CRCInit)
{
    uint8_t  u8i;
    uint32_t u16CRC = u16CRCInit;

    while (u32Len--) {
        u8i    = 8;
        u16CRC = u16CRC ^ (((uint16_t)*pu8Data++) << 8);
        do {
            if (u16CRC & 0x8000) {
                u16CRC = u16CRC << 1 ^ 0x1021;
            } else {
                u16CRC = u16CRC << 1;
            }
        } while (--u8i);
    }
    return u16CRC;
}

unsigned short CRC16_CCITT(unsigned char *puchMsg, unsigned long usDataLen)  
{  
    unsigned short wCRCin = 0x0000;  
    unsigned short wCPoly = 0x1021;  
    unsigned char wChar = 0;  
    
    while (usDataLen--)     
    {  
        wChar = *(puchMsg++);  
        InvertUint8(&wChar, &wChar);  
		
        wCRCin ^= (wChar << 8); 
        
        for(int i = 0; i < 8; i++)  
        {  
            if(wCRCin & 0x8000)
            {
                wCRCin = (wCRCin << 1) ^ wCPoly; 
            }            
            else 
            {              
                wCRCin = wCRCin << 1;  
            }
        }  
    }  
    InvertUint16(&wCRCin, &wCRCin);  
    return (wCRCin) ;  
} 


static uint8_t buf[] = {0x78,0x56,0x34,0x12};
static uint16_t crc;
int main(void)
{
	SystemCoreClockUpdate();
	
	UART0_Init(SystemCoreClock,9600);
	
	// 硬件 CRC-CCITT
	for(char i = 0;i < sizeof(buf);i++){
		CRC->CRCIN = buf[i];
	}
	printf("HARD:CRC-CCITT = 0x%04x\n",CRC->CRCD);
	
	// 清除结果寄存器重新开始CRC
	CRC->CRCD = 0;
	// 使用硬件CRC转换到CRC-YMODEM
	for(char i = 0;i < sizeof(buf);i++){
		uint8_t t = buf[i]; 
		InvertUint8(&t, &t);
		CRC->CRCIN = t;
	}
	crc = CRC->CRCD;
	InvertUint16(&crc, &crc);
	printf("HARD:YMODEM-CRC = 0x%04x\n",crc);
	// CRC-YMODEM
	crc = u16CRCVerify(buf,sizeof(buf),0);
	printf("SOFT:YMODEM-CRC = 0x%04x\n",crc);
	// CRC-CCITT
	crc = CRC16_CCITT(buf,sizeof(buf));
	printf("SOFT:CRC-CCITT = 0x%04x\n",crc);
	while(1)
	{
		
	}
}

CRC-CCITT

CRC-YMODE 

互相切换

CRC-CCITT-->CRC-YMODE  硬件CRC输入反序,输出反序。

注意硬件CRC结果寄存器清0.才可以进行新的CRC计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值