The NSL01 library contains all functions for controlling the NSL01 LoRaWAN shield from mCloud System GmbH. The NSL01 is a professional plug & play LoRaWAN shield for a wide range of STM32 Nucleo-64 boards with Arduino Uno Rev 3 connectivity. For more information about the NSL01 LoRaWAN shield: http://www.mcloud-systems.com/nsl01-lorawan-nucleo-arduino-shield

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers CRC16.cpp Source File

CRC16.cpp

00001 /*******************************************************************************
00002  *  Functions for NSL01 class to calculate and check CRC16.
00003  *
00004  *  For more information about the NSL01 LoRaWAN shield:
00005  *      http://www.mcloud-systems.com/nsl01-lorawan-nucleo-arduino-shield
00006  *
00007  *  @note The CRC16 files are included in the dependencies directory of the
00008  *        project and these files are necessary for the NSL01 class!
00009  *
00010  *  @author  -
00011  *  @version 1.0
00012  *  @date    20-June-2018
00013 *******************************************************************************/
00014 
00015 //------------------------------------------------------------------------------
00016 //
00017 //  Include Files
00018 //
00019 //------------------------------------------------------------------------------
00020 
00021 #include "./dependencies/CRC16.h"
00022 
00023 //------------------------------------------------------------------------------
00024 //
00025 //  Section Defines
00026 //
00027 //------------------------------------------------------------------------------
00028 
00029 //--Use fast table algorithm
00030 #define __CRC16_TABLE__
00031 
00032 //------------------------------------------------------------------------------
00033 //
00034 //  Section CONST
00035 //
00036 //------------------------------------------------------------------------------
00037 
00038 #ifdef    __CRC16_TABLE__
00039 
00040 //------------------------------------------------------------------------------
00041 //
00042 //  Lookup table for fast CRC16 calculation
00043 //
00044 //------------------------------------------------------------------------------
00045 
00046 const UINT16 CRC16_Table[] =
00047 {
00048     0x0000, 0x1189, 0x2312, 0x329B, 0x4624, 0x57AD, 0x6536, 0x74BF,
00049     0x8C48, 0x9DC1, 0xAF5A, 0xBED3, 0xCA6C, 0xDBE5, 0xE97E, 0xF8F7,
00050     0x1081, 0x0108, 0x3393, 0x221A, 0x56A5, 0x472C, 0x75B7, 0x643E,
00051     0x9CC9, 0x8D40, 0xBFDB, 0xAE52, 0xDAED, 0xCB64, 0xF9FF, 0xE876,
00052     0x2102, 0x308B, 0x0210, 0x1399, 0x6726, 0x76AF, 0x4434, 0x55BD,
00053     0xAD4A, 0xBCC3, 0x8E58, 0x9FD1, 0xEB6E, 0xFAE7, 0xC87C, 0xD9F5,
00054     0x3183, 0x200A, 0x1291, 0x0318, 0x77A7, 0x662E, 0x54B5, 0x453C,
00055     0xBDCB, 0xAC42, 0x9ED9, 0x8F50, 0xFBEF, 0xEA66, 0xD8FD, 0xC974,
00056     0x4204, 0x538D, 0x6116, 0x709F, 0x0420, 0x15A9, 0x2732, 0x36BB,
00057     0xCE4C, 0xDFC5, 0xED5E, 0xFCD7, 0x8868, 0x99E1, 0xAB7A, 0xBAF3,
00058     0x5285, 0x430C, 0x7197, 0x601E, 0x14A1, 0x0528, 0x37B3, 0x263A,
00059     0xDECD, 0xCF44, 0xFDDF, 0xEC56, 0x98E9, 0x8960, 0xBBFB, 0xAA72,
00060     0x6306, 0x728F, 0x4014, 0x519D, 0x2522, 0x34AB, 0x0630, 0x17B9,
00061     0xEF4E, 0xFEC7, 0xCC5C, 0xDDD5, 0xA96A, 0xB8E3, 0x8A78, 0x9BF1,
00062     0x7387, 0x620E, 0x5095, 0x411C, 0x35A3, 0x242A, 0x16B1, 0x0738,
00063     0xFFCF, 0xEE46, 0xDCDD, 0xCD54, 0xB9EB, 0xA862, 0x9AF9, 0x8B70,
00064     0x8408, 0x9581, 0xA71A, 0xB693, 0xC22C, 0xD3A5, 0xE13E, 0xF0B7,
00065     0x0840, 0x19C9, 0x2B52, 0x3ADB, 0x4E64, 0x5FED, 0x6D76, 0x7CFF,
00066     0x9489, 0x8500, 0xB79B, 0xA612, 0xD2AD, 0xC324, 0xF1BF, 0xE036,
00067     0x18C1, 0x0948, 0x3BD3, 0x2A5A, 0x5EE5, 0x4F6C, 0x7DF7, 0x6C7E,
00068     0xA50A, 0xB483, 0x8618, 0x9791, 0xE32E, 0xF2A7, 0xC03C, 0xD1B5,
00069     0x2942, 0x38CB, 0x0A50, 0x1BD9, 0x6F66, 0x7EEF, 0x4C74, 0x5DFD,
00070     0xB58B, 0xA402, 0x9699, 0x8710, 0xF3AF, 0xE226, 0xD0BD, 0xC134,
00071     0x39C3, 0x284A, 0x1AD1, 0x0B58, 0x7FE7, 0x6E6E, 0x5CF5, 0x4D7C,
00072     0xC60C, 0xD785, 0xE51E, 0xF497, 0x8028, 0x91A1, 0xA33A, 0xB2B3,
00073     0x4A44, 0x5BCD, 0x6956, 0x78DF, 0x0C60, 0x1DE9, 0x2F72, 0x3EFB,
00074     0xD68D, 0xC704, 0xF59F, 0xE416, 0x90A9, 0x8120, 0xB3BB, 0xA232,
00075     0x5AC5, 0x4B4C, 0x79D7, 0x685E, 0x1CE1, 0x0D68, 0x3FF3, 0x2E7A,
00076     0xE70E, 0xF687, 0xC41C, 0xD595, 0xA12A, 0xB0A3, 0x8238, 0x93B1,
00077     0x6B46, 0x7ACF, 0x4854, 0x59DD, 0x2D62, 0x3CEB, 0x0E70, 0x1FF9,
00078     0xF78F, 0xE606, 0xD49D, 0xC514, 0xB1AB, 0xA022, 0x92B9, 0x8330,
00079     0x7BC7, 0x6A4E, 0x58D5, 0x495C, 0x3DE3, 0x2C6A, 0x1EF1, 0x0F78,
00080 };
00081 #endif
00082 
00083 //------------------------------------------------------------------------------
00084 //
00085 //  Function: CRC16_Calc
00086 //
00087 //  @brief Function to calculate CRC16.
00088 //
00089 //  @note This function calculates the one's complement of the standard 16-BIT
00090 //        CRC CCITT polynomial G(x) = 1 + x^5 + x^12 + x^16.
00091 //
00092 //  @param data     : Input sequency
00093 //  @param length   : Length of input sequence
00094 //  @param initVal  : Inital value
00095 //
00096 //  @returns calculated checksum.
00097 //
00098 //------------------------------------------------------------------------------
00099 
00100 #ifdef    __CRC16_TABLE__
00101 
00102     UINT16 CRC16_Calc  (UINT8*  data,
00103                         UINT16  length,
00104                         UINT16  initVal)
00105     {
00106         //--Init CRC
00107         UINT16 crc = initVal;
00108 
00109         //--Iterate over all bytes
00110         while(length--)
00111         {
00112             //--Calc new CRC
00113             crc = (crc >> 8) ^ CRC16_Table[(crc ^ *data++) & 0x00FF];
00114         }
00115 
00116         //--Return result
00117         return crc;
00118     }
00119 
00120 #else
00121 
00122     UINT16 CRC16_Calc  (UINT8*  data,
00123                         UINT16  length,
00124                         UINT16  initVal)
00125     {
00126         //--Init CRC
00127         UINT16 crc = initVal;
00128     
00129         //--Iterate over all bytes
00130         while(length--)
00131         {
00132             int     bits    = 8;
00133             UINT8   byte    = *data++;
00134     
00135             //--Iterate over all bits per byte
00136             while (bits--)
00137             {
00138                 if ((byte & 1) ^ (crc & 1))
00139                 {
00140                     crc = (crc >> 1) ^ CRC16_POLYNOM;
00141                 }
00142                 else
00143                 {
00144                     crc >>= 1;
00145                 }
00146     
00147                 byte >>= 1;
00148             }
00149         }
00150 
00151         //--Return result
00152         return crc;
00153     }
00154 
00155 #endif
00156 
00157 //------------------------------------------------------------------------------
00158 //
00159 //  Function: CRC16_Check
00160 //
00161 //  @brief Function to check CRC16.
00162 //
00163 //  @note This function checks a data block with attached CRC16.
00164 //
00165 //  @param data     : Input sequency
00166 //  @param length   : Length of input sequence
00167 //  @param initVal  : Inital value
00168 //
00169 //  @returns true on success, false on error
00170 //
00171 //------------------------------------------------------------------------------
00172 
00173 bool CRC16_Check (UINT8*    data,
00174                  UINT16     length,
00175                  UINT16     initVal)
00176 {
00177     //--Calculate ones complement of CRC16
00178     UINT16 crc = ~CRC16_Calc(data, length, initVal);
00179 
00180     //--Check if CRC is okay
00181     return (bool)(crc == CRC16_GOOD_VALUE);
00182 }
00183 
00184 //------------------------------------------------------------------------------
00185 // end of file
00186 //------------------------------------------------------------------------------