Jump to main content

# 1.2.5.2 Using the Library

The SE CRC library is called to compute the CRC of a given length (8, 16, 32 bits) to append to a data buffer on transmission, and to verify the correctness of a received frame and its CRC. The following example illustrates how the USI service computes the CRC of a received frame to verify frame integrity.

Example implementation of SE CRC library usage for frame validation

    static void _SRV_USI_Callback_Handle ( uint8_t *pData, uint16_t length, uintptr_t context )
    {
        uint32_t crcGetValue;
        uint32_t crcRcvValue;
        SRV_USI_PROTOCOL_ID protocol;
        PCRC_CRC_TYPE crcType;

        if (length)
        {
            /* New received message */
            /* Extract Protocol */
            protocol = (SRV_USI_PROTOCOL_ID)USI_TYPE_PROTOCOL(*(pData + 1));

            /* Get CRC type from Protocol */
            crcType = _SRV_USI_GetCRCTypeFromProtocol(protocol);

            /* Check CRC */
            crcGetValue = SRV_PCRC_GetValue(pData, length - (1<<crcType),
                    PCRC_HT_USI, crcType, 0);

            if (crcType == PCRC_CRC8)
            {
                crcRcvValue = (uint32_t)(*(pData + length - 1));
            }
            else if (crcType == PCRC_CRC16)
            {
                crcRcvValue = (((uint32_t)(*(pData + length - 2))) << 8) +
                              (uint32_t)(*(pData + length - 1));
            }
            else
            {
                crcRcvValue = (((uint32_t)(*(pData + length - 4))) << 24) +
                              (((uint32_t)(*(pData + length - 3))) << 16) +
                              (((uint32_t)(*(pData + length - 2))) << 8) +
                              (uint32_t)(*(pData + length - 1));
            }

            if (crcGetValue != crcRcvValue)
            {
                /* Discard message */
                return;
            }

            /* Correct frame, process it */
        }
    }

Rev: G