Hi, I'm trying to use CRC peripheral on S32K312 EVB. I need to calculate CRC of data in Program Flash and compare it with a precomputed checksum.
I'm using a tool to calculate CRC based on CRC-16-XMODE algorithm.
First of all I switch-on peripheral with this setting:
MC_ME_Type * const crcModeEntryInstance = IP_MC_ME;
crcModeEntryInstance->PRTN1_COFB3_CLKEN |= MC_ME_PRTN1_COFB3_CLKEN_REQ96_MASK;
crcModeEntryInstance->PRTN1_PUPD |= MC_ME_PRTN1_PUPD_PCUD_MASK;
crcModeEntryInstance->CTL_KEY = 0x5AF0U;
crcModeEntryInstance->CTL_KEY = 0xA50FU;
/* Poll partition update status */
while ((crcModeEntryInstance->PRTN1_PUPD & MC_ME_PRTN1_PUPD_PCUD_MASK) != 0u) {}
Then, I configure CRC peripheral as indicated on datasheet:

CRC_Type * const crcBaseAddr = IP_CRC;
crcBaseAddr->CTRL &= ~CRC_CTRL_TCRC(1UL);
crcBaseAddr->CTRL &= ~ CRC_CTRL_TOTR(1UL);
crcBaseAddr->CTRL &= ~CRC_CTRL_TOT(1UL);
crcBaseAddr->CTRL &= ~CRC_CTRL_FXOR(1UL);
crcBaseAddr->GPOLY = CRC_GPOLY_LOW(0x1021U);
crcBaseAddr->CTRL |= CRC_CTRL_WAS(1UL);
crcBaseAddr->DATA &= ~((uint32_t)CRC_DATA_LL_MASK);
crcBaseAddr->DATA &= ~((uint32_t)CRC_DATA_LU_MASK);
crcBaseAddr->CTRL &= ~(CRC_CTRL_WAS_MASK);
Since computation on flash doesn't work, I wrote a small piece of code to calculate checksum on 4 bytes and reduce entropy.
uint8_t vector[4u] = {0x03u, 0x04u,0x06u,0x09u};
static uint8_t data = 0xFFu;
static uint16_t crc = 0u;
for(uint8_t k=0u;k<4u;k++)
{
data = vector[k];
crcBaseAddr->DATA =CRC_DATA_LL(data);
NOP();
NOP();
}
crc = (uint16_t)(crcBaseAddr->DATA & CRC_DATA_LL_MASK);
crc = crc | (uint16_t)(crcBaseAddr->DATA & CRC_DATA_LU_MASK);
Result of CRC peripheral is E60F:

However, by using online calculator(as https://www.lddgo.net/en/encrypt/crc) I get 7C93.
I tried to change algorith and use other CRC settings but there is no way to get correct result.
Can you help to find the problem?
Do you know about any issue related to the use of CRC peripheral on S32K3xx uC?