Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
7 years, 4 months ago.
crc16 lsb and msb
Hi i’m trying to use the CRC-16 lib and I need the CRC16 LSB and the CRC16 MSB from a range of numbers. the range is in an array numbers[x] fe [10, 244, 20, 30] each number is a byte (0-254) how can i have the LSB and MSB in a number format from 0-254 ?
1 Answer
7 years, 4 months ago.
Hello Elisa,
When using for example this CRC16 library then CRC16 can be calculated as follows:
main.cpp
#include "mbed.h" #include "CRC16.h" uint8_t numbers[] = {10, 244, 20, 30}; // array of numbers [0-254] CRC16 crc16; // CRC16 instance uint16_t crc_calc; // calculated CRC16 uint8_t crc_lsb; // LSB of calculated CRC16 uint8_t crc_msb; // MSB of calculated CRC16 int main(void) { crc_calc = crc16.calc((char*)numbers, sizeof(numbers)/sizeof(numbers[0])); crc_lsb = crc_calc & 0xff; crc_msb = (crc_calc >> 8) & 0xff; printf("CRC = %d\r\n", crc_calc); printf("CRC LSB = %d\r\n", crc_lsb); printf("CRC MSB = %d\r\n", crc_msb); while(1) {} }
Hi,
Thanks so much for you answer. I tried this code but the lsb and msb are not what's expected
For example if I have {40,0,1} the CRC16 shoud be 3F46, TX crc_lsb = 46 hex, 70 dec TX crc_msb = 3F hex, 63 dec
I need to use CRC-CCITT with Polynomial = x^16 + x^12 + x^5 + 1 & Initial crc register = 0x0000
with your script I have 37 & 130 ...
posted by 30 Aug 2017Hello Elisa,
That's because the library above is using the polynomial = X^16 + X^15 + X^2 +1. But it seems that you are looking for the one below:
#include "mbed.h" Serial pc(USBTX, USBRX); uint8_t data[] = { 40, 0, 1 }; uint16_t crc_calc; // calculated CRC16 uint8_t crc_lsb; // LSB of calculated CRC16 uint8_t crc_msb; // MSB of calculated CRC16 /** * @brief Calculates CRC-CCITT with Polynomial = x^16 + x^12 + x^5 + 1 * @note * @param data Array of bytes * @param len Length of the array * @retval Calculated CRC-CCITT */ uint16_t crc_ccitt(uint8_t* data, size_t len) { uint16_t result = 0x0000; // Initial crc register = 0x0000 bool bit; bool c15; for (size_t i = 0; i < len; i++) { for (uint8_t j = 0; j < 8; j++) { bit = data[i] >> (7 - j) & 0x01; c15 = result >> 15 & 0x01; result <<= 1; if (c15 ^ bit) result ^= 0x1021; } } return result; } /** * @brief * @note * @param * @retval */ int main(void) { crc_calc = crc_ccitt(data, sizeof(data) / sizeof(data[0])); crc_lsb = crc_calc & 0xff; crc_msb = (crc_calc >> 8) & 0xff; printf("CRC = %d\r\n", crc_calc); printf("CRC LSB = %d\r\n", crc_lsb); printf("CRC MSB = %d\r\n", crc_msb); while (1) { } }
Hi Zoltan,
you are correct, this one is working fine.
I also found this table to replace the one in the CRC16 library you are using: When you replace the table the polynomial is working fine (and faster)
Thank you so much for your help!
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
posted by 30 Aug 2017