AceCRC  1.1.1
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_nibble.cpp
Go to the documentation of this file.
1 
20 #if defined(ARDUINO_ARCH_AVR) || defined(ARDUINO_ARCH_SAMD)
21  #include <avr/pgmspace.h>
22 #else
23  #include <pgmspace.h>
24 #endif
25 #include "crc16modbus_nibble.hpp" // header file converted by AceCRC
26 #include <stdlib.h>
27 #include <stdint.h>
28 
29 namespace ace_crc {
30 namespace crc16modbus_nibble {
31 
32 
33 
37 static const crc_t crc_table[16] PROGMEM = {
38  0x0000, 0xcc01, 0xd801, 0x1400, 0xf001, 0x3c00, 0x2800, 0xe401,
39  0xa001, 0x6c00, 0x7800, 0xb401, 0x5000, 0x9c01, 0x8801, 0x4400
40 };
41 
42 
43 crc_t crc_reflect(crc_t data, size_t data_len)
44 {
45  unsigned int i;
46  crc_t ret;
47 
48  ret = data & 0x01;
49  for (i = 1; i < data_len; i++) {
50  data >>= 1;
51  ret = (ret << 1) | (data & 0x01);
52  }
53  return ret;
54 }
55 
56 
57 crc_t crc_update(crc_t crc, const void *data, size_t data_len)
58 {
59  const unsigned char *d = (const unsigned char *)data;
60  uint8_t tbl_idx;
61 
62  while (data_len--) {
63  tbl_idx = crc ^ *d;
64  crc = (pgm_read_word(crc_table + (tbl_idx & 0x0f))) ^ (crc >> 4);
65  tbl_idx = crc ^ (*d >> 4);
66  crc = (pgm_read_word(crc_table + (tbl_idx & 0x0f))) ^ (crc >> 4);
67  d++;
68  }
69  return crc & 0xffff;
70 }
71 
72 } // crc16modbus_nibble
73 } // 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.