本帖最后由 芯圣电子官方QQ 于 2023-7-19 16:32 编辑
今天运行了一下CRC例程。代码:
- #define ALLOCATE_EXTERN
- #include "HC89S105AC8.h"
- unsigned char count[5] = {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_t unsigned short
- #define uint8_t unsigned char
- uint16_t temp;
- unsigned char count[5] = {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);
-
- }
运行效果图:
|