MCUXpresso SDK provides a peripheral driver for the Cyclic Redundancy Check (CRC) module of MCUXpresso SDK devices.
The cyclic redundancy check (CRC) module generates 16/32-bit CRC code for error detection. The CRC module provides three variants of polynomials, a programmable seed, and other parameters required to implement a 16-bit or 32-bit CRC standard.
CRC Driver Initialization and Configuration
CRC_Init() function enables the clock for the CRC module in the LPC SYSCON block and fully (re-)configures the CRC module according to configuration structure. It also starts checksum computation by writing the seed.
The seed member of the configuration structure is the initial checksum for which new data can be added to. When starting new checksum computation, the seed should be set to the initial checksum per the CRC protocol specification. For continued checksum operation, the seed should be set to the intermediate checksum value as obtained from previous calls to CRC_GetConfig() function. After CRC_Init(), one or multiple CRC_WriteData() calls follow to update checksum with data, then CRC_Get16bitResult() or CRC_Get32bitResult() follows to read the result. CRC_Init() can be called as many times as required, which allows for runtime changes of the CRC protocol.
CRC_GetDefaultConfig() function can be used to set the module configuration structure with parameters for CRC-16/CCITT-FALSE protocol.
CRC_Deinit() function disables clock to the CRC module.
CRC_Reset() performs hardware reset of the CRC module.
CRC Write Data
The CRC_WriteData() function is used to add data to actual CRC. Internally it tries to use 32-bit reads and writes for all aligned data in the user buffer and it uses 8-bit reads and writes for all unaligned data in the user buffer. This function can update CRC with user supplied data chunks of arbitrary size, so one can update CRC byte by byte or with all bytes at once. Prior call of CRC configuration function CRC_Init() fully specifies the CRC module configuration for CRC_WriteData() call.
CRC Get Checksum
The CRC_Get16bitResult() or CRC_Get32bitResult() function is used to read the CRC module checksum register. The bit reverse and 1's complement operations are already applied to the result if previously configured. Use CRC_GetConfig() function to get the actual checksum without bit reverse and 1's complement applied so it can be used as seed when resuming calculation later.
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.
CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_Get16bitResult() to get final checksum.
CRC_Init() / CRC_WriteData() / CRC_GetConfig() to get intermediate checksum to be used as seed value in future.
CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_GetConfig() to get intermediate checksum.
Comments about API usage in RTOS
If multiple RTOS tasks share the CRC module to compute checksums with different data and/or protocols, the following needs to be implemented by the user:
The triplets
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() or CRC_Get32bitResult() or CRC_GetConfig()
Should be protected by RTOS mutex to protect CRC module against concurrent accesses from different tasks. For example: Refer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crcRefer to the driver examples codes located at <SDK_ROOT>/boards/<BOARD>/driver_examples/crc
This structure holds the configuration for the CRC protocol.
bool crc_config_t::reverseIn |
bool crc_config_t::complementIn |
bool crc_config_t::reverseOut |
bool crc_config_t::complementOut |
uint32_t crc_config_t::seed |
Version 2.0.1.
Current version: 2.0.1
Change log:
- Version 2.0.0
- Version 2.0.1
- add explicit type cast when writing to WR_DATA
#define CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT 1 |
Uses CRC-16/CCITT-FALSE as default.
Enumerator |
---|
kCRC_Polynomial_CRC_CCITT |
x^16+x^12+x^5+1
|
kCRC_Polynomial_CRC_16 |
x^16+x^15+x^2+1
|
kCRC_Polynomial_CRC_32 |
x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1
|
void CRC_Init |
( |
CRC_Type * |
base, |
|
|
const crc_config_t * |
config |
|
) |
| |
This functions enables the CRC peripheral clock in the LPC SYSCON block. It also configures the CRC engine and starts checksum computation by writing the seed.
- Parameters
-
base | CRC peripheral address. |
config | CRC module configuration structure. |
static void CRC_Deinit |
( |
CRC_Type * |
base | ) |
|
|
inlinestatic |
This functions disables the CRC peripheral clock in the LPC SYSCON block.
- Parameters
-
base | CRC peripheral address. |
void CRC_Reset |
( |
CRC_Type * |
base | ) |
|
- Parameters
-
base | CRC peripheral address. |
Loads default values to CRC protocol configuration structure. The default values are:
* config->reverseIn = false;
* config->complementIn = false;
* config->reverseOut = false;
* config->complementOut = false;
* config->seed = 0xFFFFU;
*
- Parameters
-
config | CRC protocol configuration structure |
void CRC_GetConfig |
( |
CRC_Type * |
base, |
|
|
crc_config_t * |
config |
|
) |
| |
The values, including seed, can be used to resume CRC calculation later.
- Parameters
-
base | CRC peripheral address. |
config | CRC protocol configuration structure |
void CRC_WriteData |
( |
CRC_Type * |
base, |
|
|
const uint8_t * |
data, |
|
|
size_t |
dataSize |
|
) |
| |
Writes input data buffer bytes to CRC data register.
- Parameters
-
base | CRC peripheral address. |
data | Input data stream, MSByte in data[0]. |
dataSize | Size of the input data buffer in bytes. |
static uint32_t CRC_Get32bitResult |
( |
CRC_Type * |
base | ) |
|
|
inlinestatic |
Reads CRC data register.
- Parameters
-
base | CRC peripheral address. |
- Returns
- final 32-bit checksum, after configured bit reverse and complement operations.
static uint16_t CRC_Get16bitResult |
( |
CRC_Type * |
base | ) |
|
|
inlinestatic |
Reads CRC data register.
- Parameters
-
base | CRC peripheral address. |
- Returns
- final 16-bit checksum, after configured bit reverse and complement operations.