CRC-15-CAN을 계산하는 프로그램을 작성했습니다.

11626 단어 crc15Ccrc

소개



직장에서 CAN 통신 프로그램을 쓰고 있지만 CRC 오류 표시가 나온다.
디버깅을 위해 CRC 변환 프로그램이 필요했습니다.
CAN의 CRC는 CRC-15라는 특수한 형식으로 인터넷에 자료가 적다.
소스나 조사한 것을 정리해 두기로 했다.

구현 예



언어는 c를 사용.
(추기) 코멘트에서 int_to_binstr()의 종단 처리등의 기술이 빠져 있었다고 하는 지적이 있어, 수정했다.

#include <stdio.h>
#include <stdint.h>

//  int to bin
char* int_to_binstr(char buff[], int bin, int len)
{
    int i;

    for (i = 0; i < len; i++) {
        if (bin & (1UL << (len - i - 1))) {
            buff[i] = '1';
        }
        else {
            buff[i] = '0';
        }
    }
    buff[len] = '\0';
    return buff;
}

uint16_t can_crc_next(uint16_t crc, uint8_t data)
{
    uint8_t i;
    crc ^= (uint16_t)data << 7;

    for (i = 0; i < 8; i++) {
        crc <<= 1;
        if (crc & 0x8000) {
            crc ^= 0xc599;
        }
    }
    return crc & 0x7fff;
}

void cal_crc15(unsigned char* buff, int len) {
    uint16_t crc;
    crc = 0;

    printf("crc15 0x");
    for (int i = 0; i < len; i++) {
        printf("%02X ", buff[i]);
    }

    printf("\n-> "); 

    for (int i = 0; i < len; i++) {
        crc = can_crc_next(crc, buff[i]);
    }
    char binstr[16];
    printf("0x%04X(%s)\n", crc, int_to_binstr(binstr, (int)crc, 15));
}

int main()
{
    uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    cal_crc15(data, 11);
}


CRC 원본 데이터 정보



CRC의 원래 데이터는 SOF에서 데이터까지. 직원 조금은 제외한다.
바이너리는 HEX로 만든다.
SOF측이 반단인 비트가 되도록 한다.


uint8_t data[] = { 0x00, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }

프로그램 동작



CRC의 초기값은 0.

crc = 0;

데이터를 HEX마다 꺼내고 7비트 왼쪽 시프트하여 CRC와 배타적 논리합을 취한다.

crc ^= (uint16_t)data << 7;

CRC를 1비트 왼쪽 시프트

crc <<= 1;

CRC의 최상위 비트가 1이면 CRC15 생성 다항식 x^15 + x^14 + x^10 + x^8 + x^7 + x^4 + x^3 + 1(=0xc599)과의 배타적 논리합을 취한다.

        if (crc & 0x8000) {
            crc ^= 0xc599;
        }

15비트이므로 16비트의 최상위 비트를 생략한다.

return crc & 0x7fff;

주의



CAN 컨트롤러(MCP2515)의 토출된 값과 일치하는 것은 확인되지만, CAN15의 사양과 정확히 일치하는지는 확인할 수 없다.
아마 괜찮다고 생각하지만.

참고 URL



ht tp // // 흠 m. 에아시ぇぇct로 cs. 루/ゔぃ에 w와 피 c. php? f=49&t=34508
htps : // 이 m /에 Q 죄 / ms / 5bf1d8d9 음 16d83951
htps : // m / da rb / ms / 669 2 2 5 57 f1 90
htps : // 그럼.ぃきぺぢ아. 오 rg / 우키 / % 5 % B7 % 1 % 5 % 9B % 9 % 5 % 86 % 97 % 9 % 95 % B7 % 6 % 4 % 9C % 6 % 9F % b
htps : // / ゔょ g. 그렇게 r세후레. 이오/crc-타타구에/1-15. htm#crc. 또는 tbi ts. 15

좋은 웹페이지 즐겨찾기