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
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 //------------------------------------------------------------------------------
Generated on Wed Jul 13 2022 06:29:55 by
1.7.2