#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计算。