这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 活动中心 » 板卡试用 » 【分享开发笔记,赚取电动螺丝刀】S32K146使用CRC模块校验数据

共1条 1/1 1 跳转至

【分享开发笔记,赚取电动螺丝刀】S32K146使用CRC模块校验数据

高工
2025-03-21 22:05:26   被打赏 24 分(兑奖)     打赏

【简介】

在软件开发中CRC(Cyclic Redundancy Check)是一种经常被使用的一种校验算法,我么继续使用S32K146的硬件CRC功能来校验编译的镜像的完整性。以下是常用的CRC32算法参数配置说明,主要涉及以下5个参数配置。

Poly:CRC 算法多项式配置,不同的场景使用的多项式是不一样的

Init:CRC 计算配置的初始值

RefIn/RefOut:这两个参数是保持一致的,对应数据计算的格式为MSB or LSB

XorOut:输出的数据是否需要与0xffffffff 或者 0x00000000进行异或操作

image.png

介绍完了CRC计算的参数说明,我们在以下的S32K146 的CRC框图:

image.png

从上述框图上查看CRC硬件模块计算逻辑还是比较清晰的,跟CRC32算法相关的控制信号主要有以下几组信号

Poly:多项式参数通过 CRC Polynomial register (GPOLY) 寄存器进行配置

image.png

Init 通过seed 及WAS 进行设置,当WAS 为1时将seed 值即初始值配置到CRC计算单元

image.png

image.png

RefIn/RefOut: 参数配置对应TOT/TOTR 信号配置转换送入CRC计算模块的数据格式,及用户读取到的数据转换

image.png

image.png

XorOut 参数配置通过FXOR 信号来配置,输出结果是否进行翻转

image.png

image.png

【S32DS配置】

介绍完了CRC 模块的配置,我们继续使用S32DS 对CRC进行配置,我们使用标准CRC32算法进行参数配置


image.png

CRC 的时钟配置使用的内部bus时钟

image.png

image.png

【功能验证】

配置好CRC参数后我们使用CRC模块来计算字符串“123456789”的CRC32数值是否和网页工具计算的一致来确认CRC模块的工作状态。以下是在线工具对于“123456789” 字符串的计算结果image.png

我们以上面的运算结果为期待值,选取CRC32/BZIP2 CRC32/ISO-HDLC CRC32/MEF 这几组来验证CRC模块的功能,编写如下测试代码

unsigned int  crc32_test(char argc,char *argv[])
{
    uint8_t * p = "123456789";

    /* CRC-32/ISO-HDLC test  */
    CRC_DRV_Deinit(INST_CRC_1);
    crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
    crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
    crc_1_Cfg0.complementChecksum = true;
    crc_1_Cfg0.polynomial = 0X04C11DB7UL;
    crc_1_Cfg0.seed = 0xFFFFFFFFUL;
    CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
    CRC_DRV_WriteData(INST_CRC_1,p,9);
    if( 0xCBF43926 == CRC_DRV_GetCrcResult(INST_CRC_1))
    {
       LOG_I("CRC-32/ISO-HDLC test ok");
    }

    /* CRC-32/ISO-BZ2 test  */
    CRC_DRV_Deinit(INST_CRC_1);
    crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_NONE;
    crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_NONE;
    crc_1_Cfg0.complementChecksum = true;
    crc_1_Cfg0.polynomial = 0X04C11DB7UL;
    crc_1_Cfg0.seed = 0xFFFFFFFFUL;
    CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
    CRC_DRV_WriteData(INST_CRC_1,p,9);
    if( 0xFC891918 == CRC_DRV_GetCrcResult(INST_CRC_1))
    {
       LOG_I("CRC-32/BZIP2 test ok");
    }


    /* CRC-32/ISO-MEF test  */
    CRC_DRV_Deinit(INST_CRC_1);
    crc_1_Cfg0.readTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
    crc_1_Cfg0.writeTranspose = CRC_TRANSPOSE_BITS_AND_BYTES;
    crc_1_Cfg0.complementChecksum = false;
    crc_1_Cfg0.polynomial = 0x741B8CD7;
    crc_1_Cfg0.seed = 0xFFFFFFFFUL;
    CRC_DRV_Init(INST_CRC_1,&crc_1_Cfg0);
    CRC_DRV_WriteData(INST_CRC_1,p,9);
    if( 0xD2C22F51 == CRC_DRV_GetCrcResult(INST_CRC_1))
    {
       LOG_I("CRC-32/MEF test ok");
    }
    return 0;
}


上述代码运行验证运行后,计算结果跟在线工具(https://crccalc.com/?crc=123456789&method=CRC-32&datatype=ascii&outtype=hex)计算的一致,说明硬件CRC功能验证OK.

image.png







共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]