Hello,
First off I am a beginner so I might be missing something here.
If you see something I am missing, please let me know because I am actively trying to learn.
I am starting to use CRC as well as the S32k148 SDK
I am having issues creating a configuration that is compatible with CRC 32 bit Ethernet or just common CRC 32 bit.
The polynomial for the CRC 32 I am talking about is 0x04C11DB7
I was successful in getting CRC 16 bit to work, however I am having issues with CRC 32 bit.
I notice when I have the default settings (no read/write transpose or XOR ) I get CRC 32 MPEG-2 rather then CRC-32 bit Ethernet.
The difference between them I found is that CRC-32 ethernet has a reflected in and reflected out data compared to MPEG-2. My assumption from the reading the data sheet is that this is the same as NXP's transpose read and write.
Unfortunately when I implemented this it gave me a result that was incorrect.
Since I was at a lost, I try all the different parameters given to me (checksum read/write transpose etc.) and no results were correct for the basic crc-32 bit for Ethernet.
Is there any other core function about CRC I am missing that it is not enabling me to get a basic 32 bit crc working?
I will have some of my code below.
//In CRC1 Config
//Config settings
crc_user_config_t crc1_InitConfig0 = {
.crcWidth = CRC_BITS_32,
.seed = 0xFFFFFFFFU,
.polynomial = 0x04C11DB7U,
.writeTranspose = CRC_TRANSPOSE_BITS_AND_BYTES,
.readTranspose = CRC_TRANSPOSE_BITS_AND_BYTES,
.complementChecksum = false
};
//In Main
//Initialize
CLOCK_SYS_Init(g_clockManConfigsArr,CLOCK_MANAGER_CONFIG_CNT, g_clockManCallbacksArr,CLOCK_MANAGER_CALLBACK_CNT);
CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);
PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr);
//CRC initialization
CRC_DRV_Init(INST_CRC1, &crc1_InitConfig0);
//Defines
volatile uint32_t output1;
uint32_t seed = 0xFFFFFFFFU;
uint32_t data = 0x12345678U;
volatile uint32_t result;
char data_set [10]= {'0','1','2','3','4','5','6','7','8','9'};
//CRC code calc
CRC_DRV_WriteData(INST_CRC1, data_set, 10);
output1= CRC_DRV_GetCrcResult(INST_CRC1);
result=CRC_DRV_GetCrc32(INST_CRC1,data,true,seed);
Parameters I have tried.
Tool I am using to determine accuracy.
Thank you for help
Andrew.