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