CRC (Cyclic Redundancy Check) — 데이터를 생성 다항식(Generator Polynomial)으로 나눈 나머지를 에러 검출 값으로 사용하는 기법. 하드웨어 구현이 용이하고 채널 노이즈에 의한 에러 검출 능력이 탁월해 CAN, CAN FD, 차량 Ethernet, FlexRay 등 대부분의 차량 버스 프로토콜이 채택한다.
특징
- 송신 데이터 뒤에 CRC 값을 붙여 전송 (구조적으로 Checksum과 동일).
- 하드웨어 구현 용이 — 시프트 레지스터 + XOR로 직접 구현.
- 채널 노이즈 검출에 적합 — 버스트 에러(연속된 비트 오류) 검출력 높음.
- 데이터 길이가 동일한 경우 오류 검출 능력이 탁월.
- 데이터 길이가 변경되는 경우 검출 성능 저하 — 그래서 프로토콜별로 CRC 다항식이 데이터 길이 범위에 맞춰 설계된다.
계산 방법
원리
- 생성 다항식의 최대 차수 만큼 데이터 뒤에 0을 추가.
- 확장된 데이터를 다항식으로 나눗셈 — 단, 뺄셈이 아니라 Bitwise XOR로 수행.
- 나머지가 다항식 차수보다 작아질 때까지 반복.
- 최종 나머지 비트가 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 = 2 → 1비트 에러만 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를 전달:
- 수신 노드가 CRC 검증 성공 → ACK 슬롯에 dominant(0) 전송.
- 송신 노드는 ACK가 한 노드 이상에서 왔음을 확인 → 전송 완료.
- CRC 불일치 → ACK 전송 안 함 → Negative Acknowledgement (CAN 에러 처리 참조).
CRC 검사만 실패한 경우는 Error Flag가 아니라 NACK로 신호한다는 점에 주의 (데이터 프레임 보호 참조).