CRC (Cyclic Redundancy Check) — 데이터를 생성 다항식(Generator Polynomial)으로 나눈 나머지를 에러 검출 값으로 사용하는 기법. 하드웨어 구현이 용이하고 채널 노이즈에 의한 에러 검출 능력이 탁월해 CAN, CAN FD, 차량 Ethernet, FlexRay대부분의 차량 버스 프로토콜이 채택한다.

특징

  • 송신 데이터 뒤에 CRC 값을 붙여 전송 (구조적으로 Checksum과 동일).
  • 하드웨어 구현 용이 — 시프트 레지스터 + XOR로 직접 구현.
  • 채널 노이즈 검출에 적합 — 버스트 에러(연속된 비트 오류) 검출력 높음.
  • 데이터 길이가 동일한 경우 오류 검출 능력이 탁월.
  • 데이터 길이가 변경되는 경우 검출 성능 저하 — 그래서 프로토콜별로 CRC 다항식이 데이터 길이 범위에 맞춰 설계된다.

계산 방법

원리

  1. 생성 다항식의 최대 차수 만큼 데이터 뒤에 0을 추가.
  2. 확장된 데이터를 다항식으로 나눗셈 — 단, 뺄셈이 아니라 Bitwise XOR로 수행.
  3. 나머지가 다항식 차수보다 작아질 때까지 반복.
  4. 최종 나머지 비트가 CRC 값.

간단한 예시 — 다항식 (1001), Data = 11111010 (0xFA)

  • 확장 데이터: 11111010000 (뒤에 0 3개 추가).
  • 다항식 1001로 XOR 나눗셈.
  • 나머지 3비트가 CRC.

검증 방법

수신측에 두 가지 등가 방식:

방식 A — 전체 데이터 나눗셈

  • 수신한 (데이터 + CRC) 전체를 동일 다항식으로 나눔.
  • 나머지가 0이면 정상, 0이 아니면 에러.

방식 B — CRC 재계산 후 비교

  • 수신한 데이터로 CRC를 다시 계산한 뒤 수신한 CRC와 XOR.
  • 결과가 0이면 정상, 아니면 에러.

차량 네트워크 CRC 파라미터

CAN (Standard/Classical)

  • 15 bit CRC.
  • 생성 다항식:
  • 비트 표현: 1100010110011001 = 0xC599.
  • 연산 범위: SOF부터 Data 필드 끝까지.
  • 목표 최소 해밍 거리 = 6 → 최대 5비트 에러 100% 검출 가능.
  • 실제 성능: 스터프 비트를 고려하면 HD = 21비트 에러만 100% 검출, 최악의 경우 2비트 에러가 정상 메시지로 인식 가능.
  • 에러 정정 기능 없음, 검출만.
  • 계산 예: ID=0x003, DLC=1, Data=0xDB → CRC = 0x0F4C.

CAN FD

  • CRC17 — ≤16 Byte 데이터, 다항식 0x3685B.
  • CRC21 — >16 Byte 데이터, 다항식 0x302899.
  • 수신자는 CRC15/17/21을 병렬 계산 후 FDF + DLC로 선택.

차량 Ethernet

  • 32 bit CRC.
  • 생성 다항식: = 0x4C11DB7.
  • Initial Value = 0xFFFFFF, Verify Value = 0x38FB2284.
  • 연산 범위: DA + SA + (802.1Q tag) + LEN + DATA + PAD 항목.
  • 성능:
    • HD = 4 (91,639 bit ~ 4,294,967,295 bit 범위).
    • HD = 5 (3,006 bit 이하 전송 시).

FlexRay

  • CRC24(프레임 보호), CRC11 (헤더 보호).
  • 다중 CRC로 페이로드·헤더·동기화를 별개로 보호.

CAN에서의 CRC와 ACK

CAN의 에러 검출은 CRC 검증 성공을 전제로 ACK를 전달:

  1. 수신 노드가 CRC 검증 성공 → ACK 슬롯에 dominant(0) 전송.
  2. 송신 노드는 ACK가 한 노드 이상에서 왔음을 확인 → 전송 완료.
  3. CRC 불일치 → ACK 전송 안 함 → Negative Acknowledgement (CAN 에러 처리 참조).

CRC 검사만 실패한 경우는 Error Flag가 아니라 NACK로 신호한다는 점에 주의 (데이터 프레임 보호 참조).

같이 보기