CRC
函数列表
简要说明
CRC(Cyclic Redundancy Check)循环冗余校验是一种根据数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。CRC算法可采用不同的生成多项式版本。
接口描述
csi_crc_initialize
crc_handle_t csi_crc_initialize(int32_t idx, crc_event_cb_t cb_event)
功能描述:
- 通过传入设备数初始化对应的crc实例,返回crc实例的句柄。
参数:
idx
: 设备号。cb_event
: crc实例的事件回调函数。回调函数原型定义见crc_event_cb_t。回调函数类型crc_event_cb_t定义如下:
typedef void (*crc_event_cb_t)(int32_t idx, crc_event_e event);
其中idx为设备号,event 为传给回调函数的事件类型,crc回调事件枚举类型 crc_event_e 。
返回值:
NULL: 初始化失败。
其它: 实例句柄。
crc_event_e:
名字 | 定义 | 备注 |
---|---|---|
CRC_EVENT_CALCULATE_COMPLETE | 计算完成事件 |
csi_crc_uninitialize
int32_t csi_crc_uninitialize(crc_handle_t handle)
功能描述:
- crc实例反初始化。该接口会停止crc 实例正在进行的工作(如果有),并且释放相关的软硬件资源。
参数:
handle
: 实例句柄。
返回值:
- 错误码。
csi_crc_power_control
int32_t csi_crc_power_control(crc_handle_t handle, csi_power_stat_e state)
功能描述:
- 配置设备实例的功耗模式。
参数:
handle
: 实例句柄。state
: 设备实例的功耗模式,参看 csi_power_stat_e的定义。
返回值:
- 错误码。
csi_power_stat_e:
| 名字 | 定义 | 备注 | | :---------------- | :----------- | :--- | | DRV_POWER_OFF | 关电源状态 | | | DRV_POWER_LOW | 低电平状态 | | | DRV_POWER_FULL | 全电源状态 | | | DRV_POWER_SUSPEND | 挂起电源状态 | |
csi_crc_get_capabilities
crc_capabilities_t csi_crc_get_capabilities(int32_t idx)
功能描述:
- 获取crc实例支持的能力。
参数:
idx
:
返回值:
- 描述crc 能力的结构体,crc 的能力定义见 crc_capabilities_t 。
crc_capabilities_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t ROHC :1 | 支持ROHC模式 | |
uint32_t MAXIM :1 | 支持MAXIM模式 | |
uint32_t X25 :1 | 支持X25模式 | |
uint32_t CCITT :1 | 支持CCITT模式 | |
uint32_t USB :1 | 支持USB模式 | |
uint32_t IBM :1 | 支持IBM模式 | |
uint32_t MODBUS :1 | 支持MODBUS模式 |
csi_crc_config
int32_t csi_crc_config(crc_handle_t handle, crc_mode_e mode, crc_standard_crc_e standard)
功能描述:
- 配置crc实例的工作模式。
参数:
handle
: 实例句柄。mode
: crc 模式,参看 crc_mode_e 定义。standard
: crc 的标准,参看 crc_standard_crc_e的定义。
返回值:
- 错误码。
crc_mode_e:
名字 | 定义 | 备注 |
---|---|---|
CRC_MODE_CRC8 | CRC8模式 | |
CRC_MODE_CRC16 | CRC16模式 | |
CRC_MODE_CRC32 | CRC32模式 |
crc_standard_crc_e:
名字 | 定义 | 备注 |
---|---|---|
CRC_STANDARD_CRC_ROHC | CRC标准RHOC | |
CRC_STANDARD_CRC_MAXIM | CRC标准MAXIM | |
CRC_STANDARD_CRC_X25 | CRC标准X25 | |
CRC_STANDARD_CRC_CCITT | CRC标准CCITT | |
CRC_STANDARD_CRC_USB | CRC标准USB | |
CRC_STANDARD_CRC_IBM | CRC标准IBM | |
CRC_STANDARD_CRC_MODBUS | CRC标准 MODBUS |
csi_crc_calculate
int32_t csi_crc_calculate(crc_handle_t handle, const void *in, void *out, uint32_t len)
功能描述:
- 计算crc,如果传入的数据长度不是字对齐,接口内部会以0填充。
参数:
handle
: 实例句柄。in
: 待传入数据的缓冲区地址。out
: 待接收数据的缓冲区地址。len
: 待传入的数据的长度。
返回值:
- 错误码。
csi_crc_get_status
crc_status_t csi_crc_get_status(crc_handle_t handle)
功能描述:
- 获取当前时刻CRC 的状态。
参数:
handle
: 实例句柄。
返回值:
- crc状态的结构体,crc的状态定义见 crc_status_t。
crc_status_t:
名字 | 定义 | 备注 |
---|---|---|
uint32_t busy :1 | 计算忙 |
示例
CRC示例1
static crc_handle_t crc= NULL;
void example_main(void)
{
int ret;
crc_status_t status;
crc_capabilities_t cap;
//get crccapabilities
cap = csi_crc_get_capabilities(0);
printf("crc %s ROHC standard \n",cap.ROHC==1 ? "support":"not support");
//initialize crc by idx
crc= csi_crc_initialize(0, NULL);
if (crc== NULL) {
//fail
return;
}
uint32_t crc_input[] = {0x44332211, 0x44332211, 0x44332211, 0x44332211};
uint32_t expect_out = 0x8efa;
uint32_t out;
//config crc mode and standard
ret = csi_crc_config(crc, CRC_MODE_CRC16, CRC_STANDARD_CRC_MODBUS);
if (ret < 0){
//fail
return;
}
ret = csi_crc_calculate(crc, &crc_input, &out, 4);
do {
status = csi_crc_get_status(crc);
} while (status.busy == 1);
ret = csi_crc_uninitialize(crc);
if (out != expect_out) {
printf("crc MODBUS mode calculate failed!!!\n");
} else {
printf("crc MODBUS mode calculate success!!!\n");
}
}