AceCRC  1.1.0
Cyclic Redundancy Check (CRC) algorithms (e.g. crc16ccitt, crc32) programmatically converted from C99 code generated by pycrc (https://pycrc.org) to Arduino C++ using namespaces and PROGMEM flash memory.
crc16modbus_nibblem.cpp
Go to the documentation of this file.
1 
20 #include "crc16modbus_nibblem.hpp" // header file converted by AceCRC
21 #include <stdlib.h>
22 #include <stdint.h>
23 
24 namespace ace_crc {
25 namespace crc16modbus_nibblem {
26 
27 
28 
32 static const crc_t crc_table[16] = {
33  0x0000, 0xcc01, 0xd801, 0x1400, 0xf001, 0x3c00, 0x2800, 0xe401,
34  0xa001, 0x6c00, 0x7800, 0xb401, 0x5000, 0x9c01, 0x8801, 0x4400
35 };
36 
37 
38 crc_t crc_reflect(crc_t data, size_t data_len)
39 {
40  unsigned int i;
41  crc_t ret;
42 
43  ret = data & 0x01;
44  for (i = 1; i < data_len; i++) {
45  data >>= 1;
46  ret = (ret << 1) | (data & 0x01);
47  }
48  return ret;
49 }
50 
51 
52 crc_t crc_update(crc_t crc, const void *data, size_t data_len)
53 {
54  const unsigned char *d = (const unsigned char *)data;
55  uint8_t tbl_idx;
56 
57  while (data_len--) {
58  tbl_idx = crc ^ *d;
59  crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);
60  tbl_idx = crc ^ (*d >> 4);
61  crc = crc_table[tbl_idx & 0x0f] ^ (crc >> 4);
62  d++;
63  }
64  return crc & 0xffff;
65 }
66 
67 } // crc16modbus_nibblem
68 } // ace_crc
uint16_t crc_t
The type of the CRC values.
Functions and types for CRC checks.
uint16_t crc_t
The type of the CRC values.