Как мне реализовать CR C для HDL C? (CRC16-МККТТ) - PullRequest
0 голосов
/ 29 января 2020

Мне нужно реализовать CRC16-CCITT для HDL C, как часть разработки некоторой функции для управления внешним HW (некоторый тип антенны LTE). Проблема в том, что, хотя я нашел много онлайн-реализаций для CRC16-CCITT, выходные значения не соответствуют значениям CR C, которые отправил нам поставщик HW.

Например, это первый HDL C рама (под названием «устройство сканирования»), которые должны быть направлены на устройство, в шестнадцатеричном формате: 7EFFBF81F02A0113000000000000000000000000000000000000000313000000000000000000000000000000000000007F0F7E

1004 * Как можно видеть, 7E в начале и в конце являются разделителями, а последние 4 шестнадцатеричные символы - это CR C - это означает, что 0x7F0F - это результат CR C.

Однако многие онлайн-калькуляторы CR C выдают результат 0x6CC3 (посмотрите здесь, например: http://www.zorc.breitbandkatze.de/crc.html, https://www.lammertbies.nl/comm/info/crc-calculation)

То же самое относится и к другой команде, которая является соответствующей командой "receive" для вышеупомянутого. команда RCV: 7E00BF81F018010F4B4D4B3032313941303035335A585806024B4D040130F1ED7E

, что означает, что 0xF1ED - это CR C, и, опять же, это не то, что я вижу в других калькуляторах, которые выдают 0x7 * 101 *, у которых * 0 * 7 *, * 0 * * 8 *. поставщика для разъяснений, и он прислал нам эту справочную таблицу, которую они используют:

cr c таблица: {0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6 c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472 c, 0x75b7, 0x643e, 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, ​​0xe876, 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87 c, 0xd9f5, 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453 c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb, 0xce4 c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0 xab7a, 0xbaf3, 0x5285, 0x430 c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e0, 0x0x0x0x0x0x0x0x0b0x0x0x0xb0x0x0x0x0x0x0x0x0x15x0x0x0x5x0x0x0x15x0x0x0x030. между прочим , 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5 c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5011, 0x411 c, 0xx0x0x0x0 0x0 0a0x0 0x0 0a0x0 0a0x0 0a0x0 0a , 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22 c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff, 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6 * тысяче сорок-девять *, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03 c, 0xd1b5, 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0x3 0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x5x5x0x0x5x5x5x5x5x5x5x5x5x105105105105105105 0305x5 0405x5 0405x5 0506x5x5x5x5x5x5x600x0306106x5x6006006006b0e0e0 0x5 c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0 xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232, 0x5ac5, 0x4b4 c, 0x79d7, 0x685e, 0x1ce1, 0x0d68 , 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41 c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9, 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495 c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78}

Это не похоже на обычную таблицу CRC16-CCITT, найденную в Интернете, например, найденную онлайн CRC16-CCITT :

stati c const unsigned short CRC_CCITT_TABLE [256] = {0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18 C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F, 0x3D0 038B0 0 038B0 0 038B0 0D0 0D0 0D0 0D0 0 0 0 0 0 0 0 8 0 0 0 0 5 0 0 0 5 0 8 0 0 0 8 0 0 0 0 5 0 0 0 8 0 0 0 8 0 0 0 8 0 0 0 8 0 0 0 8 0 0 8 0 0 8 0 0 8 0 0 8 0 0 8 0 0 8 0 0 38 0 0 38 0 0 8 0 0 38 6 0 5 0 0 5 6 0 5 0 5 0 0 6 0 5 0 5 6 0 5 6 0 5 6 0 0 5 6 0 0 0 5 0 0 5 0 0 5 0 0 5 0 0 5 0 0 8 0 0 0 5 6 0 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5A C, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6 , 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7B C, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x78A0, 0x0x0x0x0x0x0x0x0x0x0x0. , 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBD C, 0x0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B0BBXBXBXXXXXXXXXXXXXXX 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDE C, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD , 0xCFF C, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, 0 x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10 C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0393x0x0x030B0x0x0x0x0x0x0x0x0x0x0x. 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52 C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447 , 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73 C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x6x0x0x0686x0x6x0x0686x0x6x0x0x0x6x0x0x6x0x0x6x0x068x0x068x0x068x10x060x64x10x06800x060x10x10650000 к ПОРЯДКАМ 0x6657, 0x6x0686x0686x060x10x070x070x10x1600 , 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5 C, 0xEB3F, 0xB0B0B0B0B0B0B0B0B0B0B0B0B0B0B0B5B0B0B0B0B0B0B0B0BBXF 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F, 0xDD6 C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D , 0xDF7 C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0 x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0};

Я пытался использовать их таблицу вместо моей, в нашей реализации CR C, но мы все равно получаем другие результаты, чем их.

Кто-нибудь понимает, что здесь происходит? какой CR C является действительно правильным HDL C CRC16-CCITT? Каков правильный результат CRC16-CCITT для вышеуказанных кадров?

Большое спасибо, ребята!

1 Ответ

0 голосов
/ 29 января 2020

Первоначально я думал, что значение poly было 0x1189, но вместо этого он немного изменил 0x1021 = 0x8408, что видно из таблицы [0x80]. С помощью онлайн-калькулятора CR C, связанного с приведенным ниже, это предопределенный CRC_X_25, poly = 0x1021, отраженные входные данные, отраженные результаты, начальное значение 0xFFFF, конечное значение xor 0xFFFF. Нажмите «Показать отраженную таблицу поиска», и вы получите ту же таблицу, что и таблица продавца, когда вычисляете CR C с помощью калькулятора.

При добавлении CR C к данным, CR C добавляется как младший байт, старший байт. Таким образом, CR C 0xEDF1 добавляется как: 0xF1, 0xED и CR C 0x0F7F, добавляется как: 0x7F, 0x0F.

Поскольку CR C пост-дополнен (xorout = 0xFFFF), если при проверке CR C путем его пересчета по данным + CR C, если ошибок нет, CR C будет ненулевой константой, 0x0F47.

http://www.sunshine2k.de/coding/javascript/crc/crc_js.html


Пример кода:

#include <iostream>
#include <iomanip>

uint16_t crctbl[256];

void gentbl()
{
uint16_t crc, i, j;
    for(j = 0; j < 0x100; j++){
        crc = j;
        for(i = 0; i < 8; i++)
            crc = (crc>>1)^((0-(crc&1))&0x8408);
        crctbl[j] = crc;
    }
}

uint16_t crc16(uint8_t * bfr, size_t size)
{
uint16_t crc = 0xffff;
    while (size--)
        crc = (crc>>8)^crctbl[(crc^*bfr++)&0xff];
    return(crc ^ 0xffff);
}

int main(int argc, char**argv)
{
uint16_t crc;
// bfr has 2 trailing zeroes to store crc into
uint8_t bfr[] = {0x00,0xBF,0x81,0xF0,0x18,0x01,0x0F,0x4B,
                 0x4D,0x4B,0x30,0x32,0x31,0x39,0x41,0x30,
                 0x30,0x35,0x33,0x5A,0x58,0x58,0x06,0x02,
                 0x4B,0x4D,0x04,0x01,0x30,0x00,0x00};
    gentbl();
    crc = crc16(bfr, sizeof(bfr)-2);
    std::cout << std::hex << crc << std::endl;
    bfr[sizeof(bfr)-2] = crc&0xff;
    bfr[sizeof(bfr)-1] = crc>>8;
    crc = crc16(bfr, sizeof(bfr));
    std::cout << std::hex << crc << std::endl;
    if(crc != 0xf47)
        std::cout << "error" << std::endl;
    return(0);
}
...