[BG96] Getting the CRC16 CCITT of a file

Hi,

I’m comparing the CRC16 CCITT calculated by the BG96 module of a file stored in the file system with an CRC16 CCITT algorithm running on a microcontroller.

I’m creating a test file like so:

fs_file crc16_test;
BG96_fs_file_init(&crc16_test, test_name);
BG96_fs_open(&crc16_test, FS_MODE_CREATE_AND_OPEN);

uint16_t crc16 = CRC16_START_VAL;
uint32_t written_len = 0;
uint32_t total_len = 0;
const uint8_t bin_data[] = {
0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88,
0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF
};

fs_error_code err = BG96_fs_write(&crc16_test, bin_data, sizeof bin_data,
FS_WRITE_TIMEOUT_DEFAULT_S, &written_len, &total_len);

if (FS_ERR_OK == err) {
printf(“Written: %d bytes to file, total len: %d\r\n”, written_len, total_len);
uint16_t file_crc = 0;
BG96_fs_get_crc16_ccitt(&crc16_test, &file_crc);
printf(“CRC16 CCITT from fs: 0x%X\r\n”, file_crc);
} else {
printf(“Error while trying to write to file, written bytes: %d, total len: %d\r\n”, written_len, total_len);
}

BG96_fs_close(&crc16_test);

crc16 = crc16_ccitt(bin_data, sizeof bin_data, crc16);
printf(“CRC16 CCITT: 0x%X\r\n”, crc16);

These are the replies from the module to the commands, so I know the file is being created successfully:

According to the BG96 module, the CRC16 CCITT of the bin_data array is 0x1CF6 but my code gives 0xD5A4.

I’m also comparing it with the results of the following page, as you can see it gives the same output as my microcontroller: sunshine2k.de

The code running on the microcontroller:

crc16.h

#ifndef CRC16_H_
#define CRC16_H_

#include <stdint.h>
#include <stddef.h>

/* start value which is used by SRecord tool for -CRC16_Big_Endian */
#define CRC16_START_VAL  0x1D0F

uint16_t crc16_ccitt(const void *buf, size_t len, uint16_t start);

#endif /* _CRC16_H_ */

crc16.c

#include "CRC16.h"

/* CRC16 implementation according to CCITT standards */

static const uint16_t crc16tab[256]= {
    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
};

uint16_t crc16_ccitt(const void *buf, size_t len, uint16_t start)
{
    uint16_t crc = start;
    uint8_t *buf_data = (uint8_t *) buf;

    for(size_t counter = 0; counter < len; counter++) {
        crc = (crc << 8) ^ crc16tab[((crc >> 8) ^ *(uint8_t *) buf_data++) & 0x00FF];
    }

    return crc;
}

Is the BG96 module running an special variation of the CRC16 CCITT algorithm?

Regards

BG96 have two CRC16
poly: 0x8408 table ???
poly: 0x1021 as your table

Hi,

Thanks for the reply, the module reported two CRC16s, 0xA374 and 0x1C76 as neither is similar to the CRC16 I got, can I assume I’m calculating the CRC16 with poly 0x1021 wrong?

no idea - ask Quectel…

1 Like

Hi MTX_ing6,

As you said , with ATcmd “AT+QFCRC=”,
the return value is nor correct ,right?

pls send email to : support@quectel.com , we will submit one ticket to R&D to check this .

thanks

@Stephen.Li-Q,

The result doesn’t matches with the software implementation of CRC16 CCITT I have, so I would like to know if the algorithm runnin on the BG96 module differs with mine.

I will email the support team, thanks for the email.

Regards

Just solved this issue, the CRC16 CCITT used in the module isn’t the same as the one i used, the lookup table is different.

Regards.

?? or is not CCITT
CCITT

other table is XMODEM

It might be another CRC16, i checked the sunshine2k.de site and none of the CRC16 stored there have the same lookup table.

Hi,

NAME

crc16 - Perform a 16bit Cyclic Redundancy Check

SYNOPSIS

package require Tcl 8.2

package require crc16 ?1.1.1?

::crc::crc16 ?-format format ? ?-seed value ? ?-implementation procname ? message

::crc::crc16 ?-format format ? ?-seed value ? ?-implementation procname ? -filename file

::crc::crc-ccitt ?-format format ? ?-seed value ? ?-implementation procname ? message

::crc::crc-ccitt ?-format format ? ?-seed value ? ?-implementation procname ? -filename file

::crc::xmodem ?-format format ? ?-seed value ? ?-implementation procname ? message

::crc::xmodem ?-format format ? ?-seed value ? ?-implementation procname ? -filename file

If You Are Interested to Learn JavaScript Training? Yoy Can Shedule and Attend a Free Demo Here [JavaScript Online Certification Training](https://mindmajix.com/javascript-training) 

Thanks And Regards,
Lavanya Sreepada.

Could you post Quectel’s CRC16 table here for anyone else who might be facing this same issue?

Thank you,
Peter