CRC:循环冗余校验码(Cyclic Redundancy Check)
CRC是数据通信领域中广泛采用的一种查错校验码,其独特之处在于信息字段和校验字段的长度具有灵活性,可以根据需要进行选取。
循环冗余检查(CRC)作为一项数据传输中常见的差错校验功能,通过多项式计算对数据进行处理,并将计算结果附加在数据帧的末尾。接收端同样执行类似的算法,以确保数据传输的准确性和完整性。
学习电子或计算机相关专业的同学都应该熟悉CRC的基本原理。尽管其原理看似简单,实际上却涉及复杂的数学运算。CRC的本质是一个公式,虽然表面上看起来简单,但其中蕴含的内容却相当复杂。
点击查看大图
网络上关于CRC基础原理的内容比较多,可以搜索关键词“循环冗余校验”进行查询。
今天结合瑞萨RA MCU自带硬件CRC计算单元给大家讲讲其原理及监听应用。
瑞萨RA单片机硬件CRC计算单元采用固定的多项式发生器来计算8位或者32位数据的CRC校验值,对数据传输或数据存储的一致性、完整性进行验证。这篇文章重点介绍RA MCU中的CRC模块和使用方法。
RA MCU中的CRC 计算单元规格如下:
点击查看大图
注1. 该函数不能划分CRC计算中使用的数据。以8位或32位为单位写入数据。
CRC 计算单元框图如下:
那么接下来就是如何使用了,打开工程中的configuration.xlm文件,在Stacks窗口中,可以通过“New Stack → Monitoring → CRC (r_crc)”添加该模块。该模块的属性窗口如下:
点击查看大图
在应用程序中使用CRC模块的基本例程如下:
void crc_example ()
{
uint32_t length;
uint32_t uint8_calculated_value;
length = sizeof(g_data_8bit) / sizeof(g_data_8bit[0]);
crc_input_t example_input =
{
.p_input_buffer = g_data_8bit,
.num_bytes = length,
.crc_seed = 0,
};
/* Open CRC module with 8 bit polynomial */
R_CRC_Open(&crc_ctrl, &g_crc_test_cfg);
/* 8-bit CRC calculation */
R_CRC_Calculate(&crc_ctrl, &example_input, &uint8_calculated_value);
}
● CRC监听功能
另外CRC单元还具有监听功能 ,可以监视指定 I/O 寄存器地址的读取和写入,并自动对寄存器地址读取和写入的数据进行CRC计算。不是对数据块调用 R_CRC_Calculate,而是调用 R_CRC_SnoopEnable 来开始监视读/写,并使用 R_CRC_CalculatedValueGet 来获取当前CRC。
请注意,监听模式仅适用于SCI上的发送/接收操作。
注:并非所有RA MCU的CRC单元都有监听功能,RA2A1、RA2L1、RA2E1、RA2E2、RA4M1
、RA4W1、RA6M1、RA6M2、RA6M3、RA6T1、RA6T2的CRC单元有监听功能,而RA4M2、RA4M3、RA4T1、RA4E1、RA4E2、RA6M4、RA6M5、RA6T3、RA6E1、RA6E2的CRC单元没有监听功能,具体请参考各MCU的硬件手册。
以下参考代码展示了CRC监听操作:
void crc_snoop_example ()
{
/* Open CRC module with 8 bit polynomial */
R_CRC_Open(&crc_ctrl, &g_crc_test_cfg);
/* Open SCI Driver */
/* Configure Snoop address and enable snoop mode */
R_CRC_SnoopEnable(&crc_ctrl, 0);
/* Perfrom SCI read/Write operation depending on the SCI snoop address configure */
/* Read CRC value */
R_CRC_CalculatedValueGet(&crc_ctrl, &g_crc_buff);
}
在使用CRC32多项式函数时,CRC模块会产生与流行的在线CRC32计算器相同的结果,但请务必记住一些要点:
● 在线CRC32计算器允许输入任意数量的字节。而FSP CRC32 API函数使用32位。这意味着在线计算时必须“填充”为32位。
● 在线CRC32计算器通常会先对输出取反,然后再将其呈现为结果。如果需要,由应用程序决定是否包含此步骤。
● 在线CRC32计算器和R_CRC模块API(CRC32 多项式)都需要使用种子值 0xFFFFFFFF。
● 确保R_CRC CRC32的位方向设置为LSB,并且选择了CRC32而不是CRC32C。
● 一些在线CRC工具将最终结果与0xFFFFFFFF进行异或。
瑞萨RA MCU全系列产品都具有CRC外设, 对CRC的计算提供硬件支持,为应用程序节省了代码空间。
最后,现在很多单片机都自带有硬件CRC单元,大家开发项目的时候,如果用到了CRC,记得使用硬件CRC哦!
以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !