crc.c 956 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include "crc.h"
  2. uint16_t ComputeCrc( uint16_t crc, uint8_t dataByte, uint16_t polynomial )
  3. {
  4. uint8_t i;
  5. for( i = 0; i < 8; i++ )
  6. {
  7. if( ( ( ( crc & 0x8000 ) >> 8 ) ^ ( dataByte & 0x80 ) ) != 0 )
  8. {
  9. crc <<= 1; // shift left once
  10. crc ^= polynomial; // XOR with polynomial
  11. }
  12. else
  13. {
  14. crc <<= 1; // shift left once
  15. }
  16. dataByte <<= 1; // Next data bit
  17. }
  18. return crc;
  19. }
  20. uint16_t RadioComputeCRC( uint8_t *buffer, uint8_t length, uint8_t crcType )
  21. {
  22. uint8_t i = 0;
  23. uint16_t crc = 0;
  24. uint16_t polynomial = 0;
  25. polynomial = ( crcType == CRC_TYPE_IBM ) ? POLYNOMIAL_IBM : POLYNOMIAL_CCITT;
  26. crc = ( crcType == CRC_TYPE_IBM ) ? CRC_IBM_SEED : CRC_CCITT_SEED;
  27. for( i = 0; i < length; i++ )
  28. {
  29. crc = ComputeCrc( crc, buffer[i], polynomial );
  30. }
  31. if( crcType == CRC_TYPE_IBM )
  32. {
  33. return crc;
  34. }
  35. else
  36. {
  37. return( ( uint16_t ) ( ~crc ));
  38. }
  39. }