All Data Structures Functions Variables Typedefs Enumerations Enumerator Groups Pages
CRC: Cyclic Redundancy Check Driver

## Overview

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_WriteSeed() Write seed (initial checksum) to CRC module.

# 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

## Files

file | fsl_crc.h

## Data Structures

struct | crc_config_t
| CRC protocol configuration. More...

## Macros

#define | CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT 1
| Default configuration structure filled by CRC_GetDefaultConfig(). More...

## Enumerations

enum | crc_polynomial_t { kCRC_Polynomial_CRC_CCITT = 0U, kCRC_Polynomial_CRC_16 = 1U, kCRC_Polynomial_CRC_32 = 2U }
| CRC polynomials to use. More...

## Functions

void | CRC_Init (CRC_Type *base, const crc_config_t *config)
| Enables and configures the CRC peripheral module. More...
static void | CRC_Deinit (CRC_Type *base)
| Disables the CRC peripheral module. More...
void | CRC_Reset (CRC_Type *base)
| resets CRC peripheral module. More...
void | CRC_WriteSeed (CRC_Type *base, uint32_t seed)
| Write seed to CRC peripheral module. More...
void | CRC_GetDefaultConfig (crc_config_t *config)
| Loads default values to CRC protocol configuration structure. More...
void | CRC_GetConfig (CRC_Type *base, crc_config_t *config)
| Loads actual values configured in CRC peripheral to CRC protocol configuration structure. More...
void | CRC_WriteData (CRC_Type *base, const uint8_t *data, size_t dataSize)
| Writes data to the CRC module. More...
static uint32_t | CRC_Get32bitResult (CRC_Type *base)
| Reads 32-bit checksum from the CRC module. More...
static uint16_t | CRC_Get16bitResult (CRC_Type *base)
| Reads 16-bit checksum from the CRC module. More...

## Driver version

#define | FSL_CRC_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))
| CRC driver version. More...

## Data Structure Documentation

struct crc_config_t

This structure holds the configuration for the CRC protocol.

### Data Fields

crc_polynomial_t | polynomial
| CRC polynomial. More...
bool | reverseIn
| Reverse bits on input. More...
bool | complementIn
| Perform 1's complement on input. More...
bool | reverseOut
| Reverse bits on output. More...
bool | complementOut
| Perform 1's complement on output. More...
uint32_t | seed
| Starting checksum value. More...

#### Field Documentation

crc_polynomial_t crc_config_t::polynomial

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

## Macro Definition Documentation

#define FSL_CRC_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))

Version 2.1.1.

Current version: 2.1.1

Change log:

- Version 2.0.0
  - initial version
- Version 2.0.1
  - add explicit type cast when writing to WR_DATA
- Version 2.0.2
  - Fix MISRA issue
- Version 2.1.0
  - Add CRC_WriteSeed function
- Version 2.1.1
  - Fix MISRA issue

#define CRC_DRIVER_USE_CRC16_CCITT_FALSE_AS_DEFAULT 1

Uses CRC-16/CCITT-FALSE as default.

## Enumeration Type Documentation

enum crc_polynomial_t

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

## Function Documentation

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.

void CRC_WriteSeed | ( | CRC_Type * | base,
|  | uint32_t | seed
| ) |  |

Parameters

  base | CRC peripheral address.
  seed | CRC Seed value.

void CRC_GetDefaultConfig | ( | crc_config_t * | config | ) |

Loads default values to CRC protocol configuration structure. The default values are:

* config->polynomial = kCRC_Polynomial_CRC_CCITT;
* 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.