[CAN] Cyclic redundancy check(CRC)
목차
CRC
Cyclic redundancy check입니다. CRC 는 네트워크 등을 통하여 데이터를 전송할 때 전송된 데이터에 오류가 있는지를 확인하기 위한 체크값을 결정하는 방식을 입니다.
CAN은 CRC를 사용하는 대표적인 통신입니다. CAN에서 사용하는 CRC를 기준으로 CRC의 계산방법과 개념에 대해 알아보겠습니다.
CRC (in CAN) Tx
CAN에서 사용하는 CRC 다항식입니다. 어렵게 생각할 필요없습니다. +를 or로 생각한다면 이진법으로 나타낸 숫자를 쉽게 이해하실 수 있습니다.
위 다항식을 사용하여 어떻게 CRC Sequence를 만들어 내는지 알아봅시다.
위와 같은 Data가 있다고 가정합시다. CAN의 Data Frame입니다. 해당 형식은 아래 글에서 정리된 내용을 보실 수 있습니다.
2024.11.09 - [Knowledge/Protocol] - [CAN 2.0A] Data Frame과 Remote Frame
CRC는 일종의 나머지를 계산하는 개념이기 때문에, Verilog에서 표현하면 기존 DATA를 {DATA, 15{1’b0}} 이와 같이 바꿔줘야 합니다. 원래의 데이터에 여분의 비트(다항식의 최고승수만큼 0)를 붙여줘야 합니다.
위 Data에 15개의 0를 붙여주었습니다.
MSB부터 DATA가 1이면 XOR하고 0을 만나면 다음 bit로 넘어갑니다.
- 처음 Data에서 15bit의 0를 붙여준다.
- 1를 만나면 다항식과 XOR연산을 한다.
- XOR연산을 한 결과에서 다시 0을 만나면 넘어가고 1를 만나서 다항식과 XOR연산을 한다.
- 위 과정을 마지막 붙여준 여분의 15bit전까지 반복합니다.
마지막 15bit전까지 반복합니다. 마지막 남은 15bit가 위 Data의 CRC Sequence가 됩니다.
정리하면, Transmitter(발신기)가 보낼 데이터와 주어진 다항식으로 CRC 연산을 진행 하고 나온 CRC Sequence를 Data Frame의 CRC Field에 Data와 함께 보냅니다.
CRC (in CAN) Rx
Transmitter(발신기)가 보내준 Data와 CRC Sequence를 가지고 Receiver(수신기)는 어떻게 받은 Data가 문제 없는지 판단할까요?
두가지 방법으로 확인 할 수 있습니다. 하드웨어 입장에서는 연산을 줄이고, 송수신 중 더 빠른 시점에 시작할 수 있는 첫번째 방법을 선호할것 같습니다.
첫번째 방법
CRC의 다항식은 같습니다. 어느 node든 Transmitter(발신기), Receiver(수신기)가 될 수 있습니다. 따라 아래 다항식을 활용하여 Data를 받은 후 CRC연산을 진행하고 받은 CRC Sequence와 같은지 비교하는 방법입니다.
똑같습니다.
연산 후 나온 결과값과 Transmitter(발신기)가 보내준 CRC Sequence가 같다면, Data가 문제 없다고 판단할 수 있습니다.
두번째 방법
CRC Sequence까지 받은 Receiver(수신기)가 CRC Sequence를 포함하여 같은 다항식으로 CRC 연산을 합니다.
위 그림과 같이 다항식의 최고승수 만큼 0을 붙여주고,
다음과 같이 연산을 진행합니다.
송수신상 문제가 없었다면, Receiver에서 Frame를 받아 같은 CRC 연산을 수행하면 마지막 15bit는 모두 0이 됩니다.
References
- CAN Specification, Version 2.0 (Robert Bosch GmbH)
위 글이 CRC를 이해하시는데 많은 도움이 되셨길 바랍니다. Specifcation과 앞서 정리된 website들을 참고해 정리하였습니다.
출처를 표기했으나, 저작권 관련 문제시 해당 글은 언제든지 삭제될 수 있습니다.