一起学CC3200之
CRC校验
小阿汤哥
序:
能力有限,难免有错,有问题请联系我,请留言或者邮件联系
QQ群交流:482729453 邮件联系hytga@163.com
资料共享链接http://pan.baidu.com/s/1hqiWB56
版本:20160323
CRC简介
百度百科:CRC即循环冗余校验码(Cyclic Redundancy Check[1] ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。
目前找不到有关CRC模块的介绍,只能从官方例程找到怎么用这个CRC,可能是官方觉得这个太简单了,没必要写了吧。
但是我告诉你CRC其实是有bug的。为什么说是有bug,请继续看。当然如果对于懂的人来说可能不是bug。对于不懂的人来说,想了老半天,不知道是啥意思?毕竟没有中文文档,除非你去问官方。
Ploy
多项式
Init
初始值
Refin==false refou==false
数据反转:MSB first
Refin==True refou==true
数据反转:LSB first
Xorout
异或值
uint32_t ui32DataLength, uint32_t ui32Config);
这上面序号为 1 , 2 ,5 比较常用,另外两个没啥作用,CRCDataProcess这个函数就是包含了CRCDataWrite和CRCResultRead这两个功能。
什么是种子?假设你要上传10000T的数据到网盘,怎么办?只能注册10000个账号,一个账号传1T,哈哈,撑死百度。
这种子也是这个作用,你检验1000个数据,分批校验,第一次检验100,得到结果假设为90,那么90就作为种子,进行下一次的校验。就这样一直循环,直到校验完成。
什么是数据宽度?数据宽度就是你输入的数据的最小宽度是8bit 或者是32bit。
MAP_PRCMPeripheralClkEnable(PRCM_DTHE, PRCM_RUN_MODE_CLK);
unsigned long retVal;
//配置 1
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P8005 | CRC_CFG_SIZE_8BIT);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "11111111111111",
sizeof("11111111111111") - 1, CRC_CFG_SIZE_8BIT);
UART_PRINT("标志 :CRC_CFG_TYPE_P8005 | CRC_CFG_SIZE_8BIT ");
UART_PRINT("初始值:0 ");
UART_PRINT("数据 :11111111111111 ");
UART_PRINT("校验码: %x ", retVal);
//配置 2
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P8005 | CRC_CFG_SIZE_8BIT|CRC_CFG_OBR|CRC_CFG_IBR);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "11111111111111",
sizeof("11111111111111") - 1, CRC_CFG_SIZE_8BIT);
UART_PRINT("标志 : CRC_CFG_TYPE_P8005 | CRC_CFG_SIZE_8BIT|CRC_CFG_OBR|CRC_CFG_IBR ");
UART_PRINT("初始值:0 ");
UART_PRINT("数据 :11111111111111 ");
UART_PRINT("校验码: %x ", retVal);
//配置 3
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT|CRC_CFG_OBR|CRC_CFG_IBR);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "12345678",
2, CRC_CFG_SIZE_32BIT);
UART_PRINT("标志 : CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT|CRC_CFG_OBR|CRC_CFG_IBR ");
UART_PRINT("初始值:0 ");
UART_PRINT("数据 :12345678 ");
UART_PRINT("校验码: %x ", retVal);
//配置 4
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "12345678",
2, CRC_CFG_SIZE_32BIT);
UART_PRINT("标志 : CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT ");
UART_PRINT("初始值:0 ");
UART_PRINT("数据 :12345678 ");
UART_PRINT("校验码: %x ", retVal);
//配置 5
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0x222);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "12345678",
2, CRC_CFG_SIZE_32BIT);
UART_PRINT("标志 : CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT ");
UART_PRINT("初始值:0x222 ");
UART_PRINT("数据 :12345678 ");
UART_PRINT("校验码: %x ", retVal);
//配置 6
MAP_CRCConfigSet(CCM0_BASE, CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT|CRC_CFG_RESINV);
//种子
MAP_CRCSeedSet(CCM0_BASE, 0x222);
//数据输入,得到结果
retVal= MAP_CRCDataProcess(CCM0_BASE, (void*) "12345678",
2, CRC_CFG_SIZE_32BIT);
UART_PRINT("标志 : CRC_CFG_TYPE_P4C11DB7 | CRC_CFG_SIZE_32BIT|CRC_CFG_RESINV ");
UART_PRINT("初始值:0x222 ");
UART_PRINT("数据 :12345678 ");
UART_PRINT("校验码: %x ", retVal);