diff --git a/lib/Hoymiles/src/crc.cpp b/lib/Hoymiles/src/crc.cpp new file mode 100644 index 00000000..6f7a9913 --- /dev/null +++ b/lib/Hoymiles/src/crc.cpp @@ -0,0 +1,46 @@ +#include "crc.h" + +uint8_t crc8(uint8_t buf[], uint8_t len) +{ + uint8_t crc = CRC8_INIT; + for (uint8_t i = 0; i < len; i++) { + crc ^= buf[i]; + for (uint8_t b = 0; b < 8; b++) { + crc = (crc << 1) ^ ((crc & 0x80) ? CRC8_POLY : 0x00); + } + } + return crc; +} + +uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start) +{ + uint16_t crc = start; + uint8_t shift = 0; + + for (uint8_t i = 0; i < len; i++) { + crc = crc ^ buf[i]; + for (uint8_t bit = 0; bit < 8; bit++) { + shift = (crc & 0x0001); + crc = crc >> 1; + if (shift != 0) + crc = crc ^ 0xA001; + } + } + return crc; +} + +uint16_t crc16nrf24(uint8_t buf[], uint16_t lenBits, uint16_t startBit, uint16_t crcIn) +{ + uint16_t crc = crcIn; + uint8_t idx, val = buf[(startBit >> 3)]; + + for (uint16_t bit = startBit; bit < lenBits; bit++) { + idx = bit & 0x07; + if (0 == idx) + val = buf[(bit >> 3)]; + crc ^= 0x8000 & (val << (8 + idx)); + crc = (crc & 0x8000) ? ((crc << 1) ^ CRC16_NRF24_POLYNOM) : (crc << 1); + } + + return crc; +} \ No newline at end of file diff --git a/lib/Hoymiles/src/crc.h b/lib/Hoymiles/src/crc.h new file mode 100644 index 00000000..eaa7299f --- /dev/null +++ b/lib/Hoymiles/src/crc.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#define CRC8_INIT 0x00 +#define CRC8_POLY 0x01 + +#define CRC16_MODBUS_POLYNOM 0xA001 +#define CRC16_NRF24_POLYNOM 0x1021 + +uint8_t crc8(uint8_t buf[], uint8_t len); +uint16_t crc16(uint8_t buf[], uint8_t len, uint16_t start = 0xffff); +uint16_t crc16nrf24(uint8_t buf[], uint16_t lenBits, uint16_t startBit = 0, uint16_t crcIn = 0xffff);