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 */
}
}