본문 바로가기
IT & 코딩

CAN통신 CRC 계산하기

by 에일라거 2013. 10. 26.

CRC가 무엇인가? 하는 것은 위키를 참조하면 되고, (http://en.wikipedia.org/wiki/Cyclic_redundancy_check)

여기서는 CAN통신으로 한정해서, CRC가 어떻게 계산되는지 써보려고 한다.


우선 일반적인 CRC 계산법은 또 다른 위키 링크를 참조하자. (http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks)

XOR gate/flipflop에서의 작동을 애니메이션까지 이용해서 자세히 설명하고 있다.


CRC가 재밌는 게, 처음에 CRC를 생성할 때나 생성된 CRC를 다시 검증할 때나 똑같은 회로를 쓰면 된다는 점...

전자과 아해들에게는 당연한 얘기일 지도 모르겠는데, 기계과인 나한테는 알아도 신기하다. 

CRC라는 이름의 유래가 거기서 오긴 했지만... 참 잘 만든 듯. 천재들 많아 ㅋㅋ


어디서부터 써야 하나...

일단 두번째 위키 링크를 간단히 설명하는 거부터 해보면,



위 예제는 위키피디아에 있는 예제를 그대로 따온 것이다. 8 bit CRC이고, polynomial은 이다.

데이터랑 polynomial이랑 비트 별 xor 연산을 해서 아래에 적는데, 데이터의 첫 비트가 0이면 아무 연산도 하지 않고 그대로 내린다.

그래서 그냥 데이터의 첫 비트가 1인 지점을 쭉 찾아가서 거기다 polynomial 연산해서 내려 쓰고,

다음 1을 찾아서 쭉 가서 거기서 연산해서 내려 쓰고 해서 마지막까지 연산하면 CRC가 나온다. 

위 예제에서는 10100010 이 CRC가 되는 거고... 이 CRC를 다시 데이터에 붙여서 0101011110100010 이라는 데이터로

똑같이 연산하면 CRC영역이 00000000 이 나와서 체크가 완료됨.


CAN 통신의 경우는... CRC가 15비트이다. 

일단 CAN 통신의 데이터 프레임이 어떻게 되어 있는지 등 기본적인 내용은 

또 다른 위키 링크 (http://en.wikipedia.org/wiki/CAN_bus를 참조해서 보면 된다.

그리고 구체적인 CAN spec은 보쉬에서 만든 사양서를 보면 된다. 아래 첨부 참조


can2spec.pdf


CRC를 만들기 위한 데이터는 CRC앞의 모든 데이터를 사용하므로 SOF에서 데이터 끝까지 몽땅 붙여놓은 놈을 쓰면 된다.

예를 하나만 들면...


ID: 00001000100

Data: 00100100


이라고 하면, DLC는 0001 이 되고, SOF 0, RTR 0, IDE 0, reserved bit 0 이런 식으로 써서 전송되는 데이터는 아래와 같다.


000001000100000000100100100


와... 눈 빠지겠네 ㅋㅋ 

일단 CRC 만들 때는 stuffing bit는 고려하지 않으니까 destuffed data고 첫 비트가 SOF, 다음 11bit가 ID, 다음 비트가 RTR ...

마지막 8자리가 1 byte 데이터이다. 여기에다가 0을 15개 붙여서 CRC 만드는 데이터로 쓴다.


000001000100000000100100100000000000000000


까만게 CRC 앞, 빨간게 CRC... 이걸로 연산에 들어간다.

그래서 이번에도 플래시를 하나 만들어 봤다. ID랑 Data를 넣으면 CRC를 계산해주고, XOR gate에서의 연산을 보여주는 플래시임.

머 RTR도 무조건 0이고 그런 제한적인 놈이지만 어쨌든 CRC 연산 원리 알기는 좋을 듯


플래시 버전




자바스크립트 버전


댓글