cube crc 16
Dependents: CEBF746_Master CEBF746_Slave_withTPM CEBF746_Master_New
lib_crc.cpp
- Committer:
- gandol2
- Date:
- 2016-10-17
- Revision:
- 1:e30d6ab46e27
- Parent:
- 0:0fd8f2287db9
File content as of revision 1:e30d6ab46e27:
#include <stdint.h> /** @brief This function calculates a 16-bit CRC. * * @param[in] length number of bytes in data buffer * @param[in] data pointer to data * @param[out] 2byte crc pointer to calculated CRC (high byte at crc[0]) */ void cube_crc_16(uint16_t length, uint8_t *data, uint16_t *crc) { uint8_t counter; uint8_t crcLow = 0, crcHigh = 0, crcCarry; uint8_t polyLow = 0x05, polyHigh = 0x80; uint8_t shiftRegister; uint8_t dataBit, crcBit; for (counter = 0; counter < length; counter++) { for (shiftRegister = 0x80; shiftRegister > 0x00; shiftRegister >>= 1) { dataBit = (data[counter] & shiftRegister) ? 1 : 0; crcBit = crcHigh >> 7; // Shift CRC to the left by 1. crcCarry = crcLow >> 7; crcLow <<= 1; crcHigh <<= 1; crcHigh |= crcCarry; if ((dataBit ^ crcBit) != 0) { crcLow ^= polyLow; crcHigh ^= polyHigh; } } } *crc = (crcHigh << 8) | crcLow; //crc[0] = crcHigh; //crc[1] = crcLow; } /** @brief compare 2byte crc pointer * * @param[in] crc1 first 2byte crc pointer * @param[in] crc2 second 2byte crc pointer * @return same is true, other is false */ bool cube_crc_compare(uint16_t crc1, uint16_t crc2) { bool ret = false; if( crc1 == crc2 ) { ret = true; } return ret; } /** @brief cube_crc_16 test func() * * @return sucess is true, error is false */ bool test_cube_crc_16(void) { bool ret = false; uint8_t testData[] = {0x09, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00}; uint16_t validateCrc = 0xF960; uint16_t outCrc = 0; cube_crc_16(sizeof(testData), testData, &outCrc); if( validateCrc == outCrc ) { ret = true; } return ret; }