【芯圣电子HC89S105A测评报告】+CRC校验
本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:32 编辑今天运行了一下CRC例程。代码:
#define ALLOCATE_EXTERN
#include "HC89S105AC8.h"
unsigned char count = {0x01,0x02,0x03,0x04,0x05}; //待计算数据
unsigned int Result = 0; //计算结果
unsigned int CRC_WriteArr(unsigned char *CheckArr,unsigned int CheckLen); //写入校验数据并返回结果
/**************************************************************************************
* @实现效果 对写入的数据进行CRC校验,结果为DD13
* @操作方法 进入debug,查看仿真结果,结果为DD13
**************************************************************************************/
void main(void)
{
/**************************************系统初始化*************************************/
WDTCCR = 0x00; //关闭看门狗
//本例程为方便测试关闭看门狗,实际使用中,建议客户打开看门狗,详见WDT复位例程
CLKCON = 0x02; //选择内部高频RC为系统时钟, Fosc=32MHz
CLKDIV = 0x02; //Fosc 2分频得到Fcpu,Fcpu=16MHz
/**************************************CRC初始化*************************************/
CRCC = 0x07; //CRC复位,LSB first,复位初值为0xFFFF
/**************************************CRC校验*************************************/
Result = CRC_WriteArr(count,0x05); //写入校验数据并返回结果,结果为DD13
while(1);
}
/***************************************************************************************
* @说明 写入需要校验的数据并返回校验结果
* @参数 *CheckArr : CRC校验数据首地址
* @参数 CheckLen : CRC校验数据长度
* 取值范围 0 - 65535
* @返回值 CRC校验结果
* 低位在前,高位在后
* @注 无
***************************************************************************************/
unsigned int CRC_WriteArr(unsigned char *CheckArr,unsigned int CheckLen)
{
CRCC |= 0x01;
while(CheckLen--)CRCL = *(CheckArr++);
return CRCR;
}
代码里提示结果为0xdd13
我写了个C程序,代码如下:
#include "stdio.h"
#define uint16_tunsigned short
#define uint8_t unsigned char
uint16_t temp;
unsigned char count = {0x01,0x02,0x03,0x04,0x05}; //待计算数据
/******************************************************************************
* Name: CRC-16/CCITT x16+x12+x5+1
* Poly: 0x1021
* Init: 0x0000
* Refin: True
* Refout:True
* Xorout:0x0000
* Alias: CRC-CCITT,CRC-16/CCITT-TRUE,CRC-16/KERMIT
*****************************************************************************/
uint16_t crc16_ccitt(uint8_t *data, uint16_t length)
{
uint8_t i;
uint16_t crc = 0xffff; // Initial value
while(length--)
{
crc ^= *data++;
for (i = 0; i < 8; ++i)
{
if (crc & 1)
crc = (crc >> 1) ^ 0x8408;
else
crc = (crc >> 1);
}
}
return crc;
}
void main(void)
{
temp=crc16_ccitt(count, 5);
printf("crc16 value=:%x\r\n",temp);
}运行效果图:
CRC校验是不是分很多种啊,如何确定单片机用的是什么crc校验呢 在K位信息码后再拼接R位的校验码,整个编码长度为N位,因此,这种编码也叫(N,K)码。对于一个给定的(N,K)码,可以证明存在一个最高次幂为N-K=R的多项式G(x)。根据G(x)可以生成K位信息的校验码,而G(x)叫做这个CRC码的生成多项式。 校验码的具体生成过程为:假设发送信息用信息多项式C(X)表示,将C(x)左移R位,则可表示成C(x)*x的R次方,这样C(x)的右边就会空出R位,这就是校验码的位置。通过C(x)*X的R次方除以生成多项式G(x)得到的余数就是校验码。 任意一个由二进制位串组成的代码都可以和一个系数仅为‘0’和‘1’取值的多项式一一对应 八层楼 发表于 2023-6-9 16:45
CRC校验是不是分很多种啊,如何确定单片机用的是什么crc校验呢
原理都是一样的 就是计算使用的多项式不同而已 接收方需要使用相同的生成码进行校验:接收到的字段/生成码 接收方需要使用相同的代码,才可以的。 这个CRC校验还是很通用的校验。不错的。
页:
[1]