其他分享
首页 > 其他分享> > S32K144(15)CRC

S32K144(15)CRC

作者:互联网

1、简介

CRC的软件算法用过很多次,但是切换成硬件,还是第一次使用,但是速度和可配置的简单程序都要好很多

但是软件和硬件的使用方法都是一样的,计算传入参数的结果

2、CRC寄存器

2.1、DATA:CRC Data register

其中CRC的输出结果可以设置为8位、16位、32位,所以S32K144的官方例程的寄存器定义为:

定义为联合体,其中可以根据用户自己设置使用8位、16位、32位

2.2、GPOLY:CRC Polynomial register

该寄存器控制CRC模块的配置和工作。必须在开始新的CRC计算前设置。初始化一个新的CRC计算通过断言CTRL[WAS],然后将种子写入CRC数据寄存器。

24

TCRC

CRC的协议宽度

0-16bit

1-32bit

25

WAS

写入CRC数据寄存器作为种子

  1. 写入
  2. 种子值

26

FXOR

CRC数据寄存器的补读

  1. 读取时没有异或
  2. 反转或者补充CRC数据寄存器读取的值

28-29

TOTR

读取时的转置类型

  1. 不转置
  2. 字节的位转置,字节不转
  3. 字节和字节的位都转置
  4. 只有字节转置,字节的位转置

30-31

TOT

写时的转置类型

0- 不转置

1- 字节的位转置,字节不转

2- 字节和字节的位都转置

3- 只有字节转置,字节的位转置

 3、代码

#define POLY (0x04C11DB7)
uint32_t CRC_32bits_calculate(uint8_t *data, uint32_t size)
{
	/*! CRC-32 Algorithm: \n
	 * polynomial = 0x04C11DB7 \n
	 * seed = 0xFFFFFFFF \n
	 * Bits in a byte are transposed for writes. \n
	 * Both bits in bytes and bytes are transposed for read. \n
	 * XOR on reading. \n
	*/

	PCC->PCCn[PCC_CRC_INDEX] |= PCC_PCCn_CGC_MASK;	/* enable CRC clock */

	CRC->CTRL |= CRC_CTRL_TCRC(1);	/* enable 32-bit CRC protocol */
	CRC->CTRL |= CRC_CTRL_TOT(1);	/* Bits in a byte are transposed, while bytes are not transposed. */
	CRC->CTRL |= CRC_CTRL_TOTR(2);	/* Both bits in bytes and bytes are transposed. */
	CRC->CTRL |= CRC_CTRL_FXOR(1);	/* XOR on reading. */

		CRC->GPOLY = POLY;

	CRC->CTRL |= CRC_CTRL_WAS_MASK;	/* Set CRC_CTRL[WAS] to program the seed value. */
	CRC->DATAu.DATA = 0xFFFFFFFF;	/* seed value */

	CRC->CTRL &= ~CRC_CTRL_WAS_MASK;	/* Clear CRC_CTRL[WAS] to start writing data values. */
	for(;size--;)
	CRC->DATAu.DATA = *data++;	/* write data values */

return (uint32_t) CRC->DATAu.DATA;
}

int main(void)
{
	uint8_t test = 0x41;
	uint32_t crc = 0x00000000;
	WDOG_disable();        /* Disable WDOG */
	SOSC_init_8MHz();      /* Initialize system oscilator for 8 MHz xtal */
	SPLL_init_160MHz();    /* Initialize SPLL to 160 MHz with 8 MHz SOSC */
	NormalRUNmode_80MHz(); /* Init clocks: 80 MHz sysclk & core, 40 MHz bus, 20 MHz flash */
	crc = CRC_32bits_calculate(&test, 1);				/* Calculate 32-bit CRC */
	while(1){

	}
    return 0;
}

 

GPOLY:CRC Polynomial register

 

标签:15,字节,CTRL,转置,CRC,S32K144,MHz,寄存器
来源: https://blog.csdn.net/qq_41399894/article/details/116086539