1 /* Includes ------------------------------------------------------------------*/ 2 #include "air32f10x_crc.h" 3 4 /** 5 * @brief Resets the CRC Data register (DR). 6 * @param None 7 * @retval None 8 */ CRC_ResetDR(void)9void CRC_ResetDR(void) 10 { 11 /* Reset CRC generator */ 12 CRC->CR = CRC_CR_RESET; 13 } 14 15 /** 16 * @brief Computes the 32-bit CRC of a given data word(32-bit). 17 * @param Data: data word(32-bit) to compute its CRC 18 * @retval 32-bit CRC 19 */ CRC_CalcCRC(uint32_t Data)20uint32_t CRC_CalcCRC(uint32_t Data) 21 { 22 CRC->DR = Data; 23 24 return (CRC->DR); 25 } 26 27 /** 28 * @brief Computes the 32-bit CRC of a given buffer of data word(32-bit). 29 * @param pBuffer: pointer to the buffer containing the data to be computed 30 * @param BufferLength: length of the buffer to be computed 31 * @retval 32-bit CRC 32 */ CRC_CalcBlockCRC(uint32_t Type,uint32_t pBuffer[],uint32_t BufferLength)33uint32_t CRC_CalcBlockCRC(uint32_t Type,uint32_t pBuffer[], uint32_t BufferLength) 34 { 35 uint32_t index = 0; 36 37 if (Type == CRC_16_IBM || Type == CRC_16_MAXIM || Type == CRC_16_USB || Type == CRC_16_MODBUS || \ 38 Type == CRC_16_CCITT || Type == CRC_16_CCITT_FALSE || Type == CRC_16_X25 || Type == CRC_16_XMODEM ) 39 { 40 switch (Type) 41 { 42 case CRC_16_IBM: 43 CRC->INI = CRC_INIT_VALUE_0; 44 CRC->CR = CRC_CR_RESET; 45 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET; 46 47 break; 48 49 case CRC_16_MAXIM: 50 CRC->INI = CRC_INIT_VALUE_0; 51 CRC->CR = CRC_CR_RESET; 52 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET; 53 break; 54 55 case CRC_16_USB: 56 CRC->INI = CRC16_INIT_VALUE_FF; 57 CRC->CR = CRC_CR_RESET; 58 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET; 59 break; 60 61 case CRC_16_MODBUS: 62 CRC->INI = CRC16_INIT_VALUE_FF; 63 CRC->CR = CRC_CR_RESET; 64 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET) & ~POLY_SEL_SET & ~TYPE_SEL_SET; 65 break; 66 67 case CRC_16_CCITT: 68 CRC->INI = CRC_INIT_VALUE_0; 69 CRC->CR = CRC_CR_RESET; 70 CRC->CSR = (((CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET) & (~XOR_OUT_SEL_SET)) | POLY_SEL_SET) & ~TYPE_SEL_SET; 71 break; 72 73 case CRC_16_CCITT_FALSE: 74 CRC->INI = CRC16_INIT_VALUE_FF; 75 CRC->CR = CRC_CR_RESET; 76 CRC->CSR = ((((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | POLY_SEL_SET) & ~TYPE_SEL_SET; 77 break; 78 79 case CRC_16_X25: 80 CRC->INI = CRC16_INIT_VALUE_FF; 81 CRC->CR = CRC_CR_RESET; 82 CRC->CSR = (CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET | POLY_SEL_SET) & ~TYPE_SEL_SET; 83 break; 84 85 case CRC_16_XMODEM: 86 CRC->INI = CRC_INIT_VALUE_0; 87 CRC->CR = CRC_CR_RESET; 88 CRC->CSR = ((((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | POLY_SEL_SET) & ~TYPE_SEL_SET; 89 break; 90 91 default: 92 break; 93 } 94 95 for(index = 0; index < BufferLength; index++) 96 { 97 CRC->DR = pBuffer[index]; 98 } 99 return (CRC->DR & 0xFFFF); 100 } 101 else if(Type == CRC_32 || Type == CRC_32_MPEG_2) 102 { 103 switch (Type) 104 { 105 case CRC_32: 106 CRC->INI = CRC32_INIT_VALUE_FF; 107 CRC->CR = CRC_CR_RESET; 108 CRC->CSR = CRC->CSR | REV_OUT_SEL_SET | REV_IN_SEL_SET | XOR_OUT_SEL_SET | TYPE_SEL_SET; 109 break; 110 111 case CRC_32_MPEG_2: 112 CRC->INI = CRC32_INIT_VALUE_FF; 113 CRC->CR = CRC_CR_RESET; 114 CRC->CSR = (((CRC->CSR & ~REV_OUT_SEL_SET) & ~REV_IN_SEL_SET) & ~XOR_OUT_SEL_SET) | TYPE_SEL_SET ; 115 break; 116 117 default: 118 break; 119 } 120 for(index = 0; index < BufferLength; index++) 121 { 122 CRC->DR = pBuffer[index]; 123 } 124 return (CRC->DR); 125 } 126 else 127 { 128 return 0; 129 } 130 } 131 132 /** 133 * @brief Returns the current CRC value. 134 * @param None 135 * @retval 32-bit CRC 136 */ CRC_GetCRC(void)137uint32_t CRC_GetCRC(void) 138 { 139 return (CRC->DR); 140 } 141 142 /** 143 * @brief Stores a 8-bit data in the Independent Data(ID) register. 144 * @param IDValue: 8-bit value to be stored in the ID register 145 * @retval None 146 */ CRC_SetIDRegister(uint8_t IDValue)147void CRC_SetIDRegister(uint8_t IDValue) 148 { 149 CRC->IDR = IDValue; 150 } 151 152 /** 153 * @brief Returns the 8-bit data stored in the Independent Data(ID) register 154 * @param None 155 * @retval 8-bit value of the ID register 156 */ CRC_GetIDRegister(void)157uint8_t CRC_GetIDRegister(void) 158 { 159 return (CRC->IDR); 160 } 161 162 /** 163 * @} 164 */ 165 166 /** 167 * @} 168 */ 169 170 /** 171 * @} 172 */ 173