MbedCRC
The MbedCRC Class provides support for Cyclic Redundancy Check (CRC) algorithms. MbedCRC is a template class with polynomial value and polynomial width as arguments.
You can use the compute
API to calculate CRC for the selected polynomial. If data is available in parts, you must call the compute_partial_start
, compute_partial
and compute_partial_stop
APIs in the proper order to get the correct CRC value. You can use the get_polynomial
and get_width
APIs to learn the current object's polynomial and width values.
ROM polynomial tables are for supported 8/16-bit CCITT, 16-bit IBM and 32-bit ANSI polynomials. By default, ROM tables are used for CRC computation. If ROM tables are not available, then CRC is computed at runtime bit by bit for all data input.
For boards that support hardware CRC, the MbedCRC API replaces the software implementation of CRC to take advantage of the hardware acceleration the board provides.
MbedCRC class reference
MbedCRC examples
Example 1
Below is a CRC example to compute 32-bit CRC.
/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
int main()
{
MbedCRC<POLY_32BIT_ANSI, 32> ct;
char test[] = "123456789";
uint32_t crc = 0;
printf("\nPolynomial = 0x%lx Width = %d \n", ct.get_polynomial(), ct.get_width());
ct.compute((void *)test, strlen((const char *)test), &crc);
printf("The CRC of data \"123456789\" is : 0x%lx\n", crc);
return 0;
}
Example 2
Below is a 32-bit CRC example using compute_partial
APIs.
/*
* Copyright (c) 2017-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
int main()
{
MbedCRC<POLY_32BIT_ANSI, 32> ct;
char test[] = "123456789";
uint32_t crc;
ct.compute_partial_start(&crc);
ct.compute_partial((void *)&test, 4, &crc);
ct.compute_partial((void *)&test[4], 5, &crc);
ct.compute_partial_stop(&crc);
printf("The CRC of 0x%lx \"123456789\" is \"0xCBF43926\" Result: 0x%lx\n",
ct.get_polynomial(), crc);
return 0;
}
Example 3
Below is a CRC example for the SD driver.
/*
* Copyright (c) 2018-2020 Arm Limited and affiliates.
* SPDX-License-Identifier: Apache-2.0
*/
#include "mbed.h"
int crc_sd_7bit()
{
MbedCRC<POLY_7BIT_SD, 7> ct;
char test[5];
uint32_t crc;
test[0] = 0x40;
test[1] = 0x00;
test[2] = 0x00;
test[3] = 0x00;
test[4] = 0x00;
ct.compute((void *)test, 5, &crc);
// CRC 7-bit as 8-bit data
crc = (crc | 0x01) & 0xFF;
printf("The CRC of 0x%lx \"CMD0\" is \"0x95\" Result: 0x%lx\n",
ct.get_polynomial(), crc);
test[0] = 0x48;
test[1] = 0x00;
test[2] = 0x00;
test[3] = 0x01;
test[4] = 0xAA;
ct.compute((void *)test, 5, &crc);
// CRC 7-bit as 8-bit data
crc = (crc | 0x01) & 0xFF;
printf("The CRC of 0x%lx \"CMD8\" is \"0x87\" Result: 0x%lx\n",
ct.get_polynomial(), crc);
test[0] = 0x51;
test[1] = 0x00;
test[2] = 0x00;
test[3] = 0x00;
test[4] = 0x00;
ct.compute((void *)test, 5, &crc);
// CRC 7-bit as 8-bit data
crc = (crc | 0x01) & 0xFF;
printf("The CRC of 0x%lx \"CMD17\" is \"0x55\" Result: 0x%lx\n",
ct.get_polynomial(), crc);
return 0;
}
int crc_sd_16bit()
{
char test[512];
uint32_t crc;
MbedCRC<POLY_16BIT_CCITT, 16> sd(0, 0, false, false);
memset(test, 0xFF, 512);
// 512 bytes with 0xFF data --> CRC16 = 0x7FA1
sd.compute((void *)test, 512, &crc);
printf("16BIT SD CRC (512 bytes 0xFF) is \"0x7FA1\" Result: 0x%lx\n", crc);
return 0;
}
int main()
{
crc_sd_16bit();
crc_sd_7bit();
return 0;
}