Kinetis SDK v.2.0 API Reference Manual
Rev. 0
Freescale Semiconductor, Inc.
|
The Kinetis SDK provides the Peripheral driver for the Cyclic Redundancy Check (CRC) module of Kinetis devices.
The cyclic redundancy check (CRC) module generates 16/32-bit CRC code for error detection. The CRC module provides a programmable polynomial, seed, and other parameters required to implement a 16-bit or 32-bit CRC standard.
CRC_Init() function enables the clock gate for the CRC module in the Kinetis SIM module and fully (re-)configures the CRC module according to configuration structure. 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 shall be set to the initial checksum per the CRC protocol specification. For continued checksum operation, the seed shall be set to the intermediate checksum value as obtained from previous calls to CRC_Get16bitResult() or CRC_Get32bitResult() 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. The crcResult member of configuration structure determines if CRC_Get16bitResult() or CRC_Get32bitResult() return value is final checksum or intermediate checksum. CRC_Init() can be called as many times as required, thus, allows for runtime changes of CRC protocol.
CRC_GetDefaultConfig() function can be used to set the module configuration structure with parameters for CRC-16/CCIT-FALSE protocol.
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 CRC configuration function CRC_Init() fully specifies the CRC module configuration for CRC_WriteData() call.
The CRC_Get16bitResult() or CRC_Get32bitResult() function is used to read the CRC module data register. Depending on prior CRC module usage the return value is either intermediate checksum or final checksum. Example: for 16-bit CRCs the following call sequences can be used:
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_Get16bitResult() to get intermediate checksum.
CRC_Init() / CRC_WriteData() / ... / CRC_WriteData() / CRC_Get16bitResult() to get intermediate checksum.
If multiple RTOS tasks will share the CRC module to compute checksums with different data and/or protocols, the following shall be implemented by user:
The triplets
CRC_Init() / CRC_WriteData() / CRC_Get16bitResult() or CRC_Get32bitResult()
shall be protected by RTOS mutex to protect CRC module against concurrent accesses from different tasks. Example:
All APIs can be used from interrupt handler although execution time shall be considered (interrupt latency of equal and lower priority interrupts increases). Protection against concurrent accesses from different interrupt handlers and/or tasks shall be assured by the user.
Simple example with default CRC-16/CCIT-FALSE protocol
Simple example with CRC-32 protocol configuration
Per-partes data updates with context switch between. Assuming we have 3 tasks/threads, each using CRC module to compute checksums of different protocol, with context switches.
Firstly, we prepare 3 CRC module init functions for 3 different protocols: CRC-16 (ARC), CRC-16/CCIT-FALSE and CRC-32. Table below lists the individual protocol specifications. See also: http://reveng.sourceforge.net/crc-catalogue/
CRC-16/CCIT-FALSE | CRC-16 | CRC-32 | |
---|---|---|---|
Width | 16 bits | 16 bits | 32 bits |
Polynomial | 0x1021 | 0x8005 | 0x04C11DB7 |
Initial seed | 0xFFFF | 0x0000 | 0xFFFFFFFF |
Complement checksum | No | No | Yes |
Reflect In | No | Yes | Yes |
Reflect Out | No | Yes | Yes |
Corresponding init functions:
The following context switches show possible API usage:
Files | |
file | fsl_crc.h |
Data Structures | |
struct | crc_config_t |
CRC protocol configuration. More... | |
Macros | |
#define | CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT 1 |
Default configuration structure filled by CRC_GetDefaultConfig(). More... | |
Enumerations | |
enum | crc_bits_t { kCrcBits16 = 0U, kCrcBits32 = 1U } |
CRC bit width. More... | |
enum | crc_result_t { kCrcFinalChecksum = 0U, kCrcIntermediateChecksum = 1U } |
CRC result type. 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_GetDefaultConfig (crc_config_t *config) |
Loads default values 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... | |
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, 0, 0)) |
CRC driver version. More... | |
struct crc_config_t |
This structure holds the configuration for the CRC protocol.
Data Fields | |
uint32_t | polynomial |
CRC Polynomial, MSBit first. More... | |
uint32_t | seed |
Starting checksum value. | |
bool | reflectIn |
Reflect bits on input. More... | |
bool | reflectOut |
Reflect bits on output. More... | |
bool | complementChecksum |
True if the result shall be complement of the actual checksum. More... | |
crc_bits_t | crcBits |
Selects 16- or 32- bit CRC protocol. More... | |
crc_result_t | crcResult |
Selects final or intermediate checksum return from CRC_Get16bitResult() or CRC_Get32bitResult() | |
uint32_t crc_config_t::polynomial |
Example polynomial: 0x1021 = 1_0000_0010_0001 = x^12+x^5+1
bool crc_config_t::reflectIn |
bool crc_config_t::reflectOut |
bool crc_config_t::complementChecksum |
crc_bits_t crc_config_t::crcBits |
#define FSL_CRC_DRIVER_VERSION (MAKE_VERSION(2, 0, 0)) |
Version 2.0.0.
#define CRC_DRIVER_USE_CRC16_CCIT_FALSE_AS_DEFAULT 1 |
Use CRC16-CCIT-FALSE as defeault.
enum crc_bits_t |
enum crc_result_t |
Enumerator | |
---|---|
kCrcFinalChecksum |
CRC data register read value is the final checksum. Reflect out and final xor protocol features are applied. |
kCrcIntermediateChecksum |
CRC data register read value is intermediate checksum (raw value). Reflect out and final xor protocol feature are not applied. Intermediate checksum can be used as a seed for CRC_Init() to continue adding data to this checksum. |
void CRC_Init | ( | CRC_Type * | base, |
const crc_config_t * | config | ||
) |
This functions enables the clock gate in the Kinetis SIM module for the CRC peripheral. It also configures the CRC module and starts checksum computation by writing the seed.
base | CRC peripheral address. |
config | CRC module configuration structure |
|
inlinestatic |
This functions disables the clock gate in the Kinetis SIM module for the CRC peripheral.
base | CRC peripheral address. |
void CRC_GetDefaultConfig | ( | crc_config_t * | config | ) |
Loads default values to CRC protocol configuration structure. The default values are:
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. The configured type of transpose is applied.
base | CRC peripheral address. |
data | Input data stream, MSByte in data[0]. |
dataSize | Size in bytes of the input data buffer. |
|
inlinestatic |
Reads CRC data register (intermediate or final checksum). The configured type of transpose and complement are applied.
base | CRC peripheral address. |
uint16_t CRC_Get16bitResult | ( | CRC_Type * | base | ) |
Reads CRC data register (intermediate or final checksum). The configured type of transpose and complement are applied.
base | CRC peripheral address. |