maxim_crc.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include "maxim_crc.h"
  2. uint8_t maxim_crc8(const uint8_t* data, const uint8_t data_size, const uint8_t crc_init) {
  3. uint8_t crc = crc_init;
  4. for(uint8_t index = 0; index < data_size; ++index) {
  5. uint8_t input_byte = data[index];
  6. for(uint8_t bit_position = 0; bit_position < 8; ++bit_position) {
  7. const uint8_t mix = (crc ^ input_byte) & static_cast<uint8_t>(0x01);
  8. crc >>= 1;
  9. if(mix != 0) crc ^= 0x8C;
  10. input_byte >>= 1;
  11. }
  12. }
  13. return crc;
  14. }
  15. uint16_t maxim_crc16(const uint8_t* address, const uint8_t length, const uint16_t init) {
  16. uint16_t crc = init;
  17. static const uint8_t odd_parity[16] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};
  18. for(uint8_t i = 0; i < length; ++i) {
  19. uint16_t cdata = address[i];
  20. cdata = (cdata ^ crc) & static_cast<uint16_t>(0xff);
  21. crc >>= 8;
  22. if((odd_parity[cdata & 0x0F] ^ odd_parity[cdata >> 4]) != 0) crc ^= 0xC001;
  23. cdata <<= 6;
  24. crc ^= cdata;
  25. cdata <<= 1;
  26. crc ^= cdata;
  27. }
  28. return crc;
  29. }
  30. uint16_t maxim_crc16(uint8_t value, uint16_t crc) {
  31. static const uint8_t odd_parity[16] = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0};
  32. value = (value ^ static_cast<uint8_t>(crc));
  33. crc >>= 8;
  34. if((odd_parity[value & 0x0F] ^ odd_parity[value >> 4]) != 0) crc ^= 0xC001;
  35. uint16_t cdata = (static_cast<uint16_t>(value) << 6);
  36. crc ^= cdata;
  37. crc ^= (static_cast<uint16_t>(cdata) << 1);
  38. return crc;
  39. }