1

I have the implementation for calculating CRC16 with function and I want to do it using HAL_CRC_Calculate but cant get the same results.

My function is:

uint16_t CalcCRC(const uint8_t* const buffer, const uint8_t u8length)
{
    uint32_t temp; 
    uint32_t temp2;
    uint32_t flag;
    temp = 0xFFFF;
    for (uint8_t i = 0; i < u8length; i++)
    {
        temp = temp ^ buffer[i];
        for (uint8_t j = 1; j <= 8; j++)
        {
            flag = temp & 0x0001;
            temp >>=1;
            if (flag)
                temp ^= 0xA001;
        }
    }
    // Reverse byte order.
    temp2 = temp >> 8;
    temp = (temp << 8) | temp2;
    temp &= 0xFFFF;
    return (uint16_t)temp;
}

And HAL initialization:

hcrc.Instance = CRC;
hcrc.Init.DefaultPolynomialUse = DEFAULT_POLYNOMIAL_DISABLE;
hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_DISABLE;
hcrc.Init.GeneratingPolynomial = 0xA001;
hcrc.Init.CRCLength = CRC_POLYLENGTH_16B;
hcrc.Init.InitValue = 0xffff;
hcrc.Init.InputDataInversionMode = CRC_INPUTDATA_INVERSION_BYTE;
hcrc.Init.OutputDataInversionMode = CRC_OUTPUTDATA_INVERSION_ENABLE;
hcrc.InputDataFormat = CRC_INPUTDATA_FORMAT_BYTES;

when I use it like this i get different results.

uint16_t u16crc_1 = HAL_CRC_Calculate(&hcrc, (uint32_t*)struct->buffer, struct->bufferSize);
uint16_t u16crc = CalcCRC(struct->buffer, struct->bufferSize);

Minimal example:

uint8_t buffer[6] = {25,15,0,7,0,1};
uint16_t u16crc_hal = HAL_CRC_Calculate(&hcrc, (uint32_t*)buffer, 6);
uint16_t u16crc = CalcCRC(buffer, 6);

And then I get:

u16crc_hal = 3094
u16crc = 9746
10
  • Edit the question to provide a minimal reproducible example. Commented Jan 26, 2024 at 12:31
  • Most likely you want to enable DefaultInitValueUse rather than disable: hcrc.Init.DefaultInitValueUse = DEFAULT_INIT_VALUE_ENABLE Commented Jan 26, 2024 at 13:11
  • @pm101 try it. Result still the same Commented Jan 26, 2024 at 13:16
  • You tell HAL_CRC_Calculate that there are 6 uint32_ts where buffer points. You don't have that. You have 6 uint8_ts. Try: _Alignas(uint32_t) uint8_t buffer[2 * sizeof(uint32_t)] = {25,15,0,7,0,1}; HAL_CRC_Calculate(&hcrc, (uint32_t*)buffer, 2); Commented Jan 26, 2024 at 13:36
  • 2
    @gulpr: (a) A minimal reproducible example provides benefits even if it is not compiled and executed on the target device. It brings out dependencies and reveals errors. (b) A minimal reproducible example may also be executed on other devices or adapted to do so. (c) People other than I may execute it on the target device. (d) Stack Overflow is not intended for debugging questions. They arise incidentally and are tolerated. Policy is, for good reasons, for debugging questions to include a minimal reproducible example. Commented Jan 26, 2024 at 15:24

1 Answer 1

1

Not sure where you got the code for your "crc16", but it doesn't even use a hash table. Perhaps the HAL version is correct and your version is not.

// CRC16 implementation according to CCITT standards
//
const unsigned short crc16tab[256] =
{
    0x0000,  0x1021,  0x2042,  0x3063,  0x4084,  0x50a5,  0x60c6,  0x70e7,
    0x8108,  0x9129,  0xa14a,  0xb16b,  0xc18c,  0xd1ad,  0xe1ce,  0xf1ef,
    0x1231,  0x0210,  0x3273,  0x2252,  0x52b5,  0x4294,  0x72f7,  0x62d6,
    0x9339,  0x8318,  0xb37b,  0xa35a,  0xd3bd,  0xc39c,  0xf3ff,  0xe3de,
    0x2462,  0x3443,  0x0420,  0x1401,  0x64e6,  0x74c7,  0x44a4,  0x5485,
    0xa56a,  0xb54b,  0x8528,  0x9509,  0xe5ee,  0xf5cf,  0xc5ac,  0xd58d,
    0x3653,  0x2672,  0x1611,  0x0630,  0x76d7,  0x66f6,  0x5695,  0x46b4,
    0xb75b,  0xa77a,  0x9719,  0x8738,  0xf7df,  0xe7fe,  0xd79d,  0xc7bc,
    0x48c4,  0x58e5,  0x6886,  0x78a7,  0x0840,  0x1861,  0x2802,  0x3823,
    0xc9cc,  0xd9ed,  0xe98e,  0xf9af,  0x8948,  0x9969,  0xa90a,  0xb92b,
    0x5af5,  0x4ad4,  0x7ab7,  0x6a96,  0x1a71,  0x0a50,  0x3a33,  0x2a12,
    0xdbfd,  0xcbdc,  0xfbbf,  0xeb9e,  0x9b79,  0x8b58,  0xbb3b,  0xab1a,
    0x6ca6,  0x7c87,  0x4ce4,  0x5cc5,  0x2c22,  0x3c03,  0x0c60,  0x1c41,
    0xedae,  0xfd8f,  0xcdec,  0xddcd,  0xad2a,  0xbd0b,  0x8d68,  0x9d49,
    0x7e97,  0x6eb6,  0x5ed5,  0x4ef4,  0x3e13,  0x2e32,  0x1e51,  0x0e70,
    0xff9f,  0xefbe,  0xdfdd,  0xcffc,  0xbf1b,  0xaf3a,  0x9f59,  0x8f78,
    0x9188,  0x81a9,  0xb1ca,  0xa1eb,  0xd10c,  0xc12d,  0xf14e,  0xe16f,
    0x1080,  0x00a1,  0x30c2,  0x20e3,  0x5004,  0x4025,  0x7046,  0x6067,
    0x83b9,  0x9398,  0xa3fb,  0xb3da,  0xc33d,  0xd31c,  0xe37f,  0xf35e,
    0x02b1,  0x1290,  0x22f3,  0x32d2,  0x4235,  0x5214,  0x6277,  0x7256,
    0xb5ea,  0xa5cb,  0x95a8,  0x8589,  0xf56e,  0xe54f,  0xd52c,  0xc50d,
    0x34e2,  0x24c3,  0x14a0,  0x0481,  0x7466,  0x6447,  0x5424,  0x4405,
    0xa7db,  0xb7fa,  0x8799,  0x97b8,  0xe75f,  0xf77e,  0xc71d,  0xd73c,
    0x26d3,  0x36f2,  0x0691,  0x16b0,  0x6657,  0x7676,  0x4615,  0x5634,
    0xd94c,  0xc96d,  0xf90e,  0xe92f,  0x99c8,  0x89e9,  0xb98a,  0xa9ab,
    0x5844,  0x4865,  0x7806,  0x6827,  0x18c0,  0x08e1,  0x3882,  0x28a3,
    0xcb7d,  0xdb5c,  0xeb3f,  0xfb1e,  0x8bf9,  0x9bd8,  0xabbb,  0xbb9a,
    0x4a75,  0x5a54,  0x6a37,  0x7a16,  0x0af1,  0x1ad0,  0x2ab3,  0x3a92,
    0xfd2e,  0xed0f,  0xdd6c,  0xcd4d,  0xbdaa,  0xad8b,  0x9de8,  0x8dc9,
    0x7c26,  0x6c07,  0x5c64,  0x4c45,  0x3ca2,  0x2c83,  0x1ce0,  0x0cc1,
    0xef1f,  0xff3e,  0xcf5d,  0xdf7c,  0xaf9b,  0xbfba,  0x8fd9,  0x9ff8,
    0x6e17,  0x7e36,  0x4e55,  0x5e74,  0x2e93,  0x3eb2,  0x0ed1,  0x1ef0
};

#define CRC16(CRC,BYT)  ( (unsigned short)((CRC) << 8U) ^ crc16tab[(((CRC) >> 8U) ^ (BYT)) & 0xFFU] )

unsigned short CRC16Buffer(unsigned short u16CRC, BYTE pu8Data[], unsigned u32Len) 
{ 
    while (u32Len--) u16CRC = CRC16(u16CRC, *pu8Data++); 
    return u16CRC; 
}
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.