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 Y V 30 Aug 2017

Hello 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) { }
}
posted by Zoltan Hudak 30 Aug 2017

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 Y V 30 Aug 2017

Hello Elisa,
Glad to be of help. Thank you for the table. I'll consider to extend the CRC16 library with it. Best regards, Zoltan.

posted by Zoltan Hudak 31 Aug 2017