본문 바로가기

조금은 전문적인 이야기/자동차 통신

CAN(Controller Area Network) #Part 1 - Physical Layer


 이번에는 이 시대의 자동차 프로토콜의 대부분을 차지하고 있는 CAN(Controller Area Network) 에 대해서 알아볼 예정이다. 사실 ISO 9141 -2 를 먼저 할까 생각을 해봤지만, 아무래도 KWP 2000과 더불어 거의 대부분을 차지하고 있는 이 녀석이 좀 더 유용할 거라 생각을 해서 먼저 포스팅을 하기로 했다. 



 먼저 이야기를 하자면 이 녀석의 1번은 매우 어렵다. 솔직히 필요 없는 부분 치고는 너무 어려워서 설명을 하지 않을까 했는데, 그래도 내가 알고 있는 범위에서만이라도 설명을 하고 넘어가는 편이 좋을 것 같아 포스팅을 한다. 전에도 이야기를 했던 것 처럼, 저가형 아날라이져가 범람(까지는 아닌가?)하고 있는 이 상황에서 각 프로토콜들의 1번 부분은 정확하게 이해를 하고 있을 필요는 없다. 단순히 이러이런 식이구나 정도만 이해해도 충분한 상황이긴 한데...그래도 알아두면 피가되고 살이되는 부분이다. 


 일단 CAN(Controller Area Network) 이 녀석에 대해 간략하게 설명을 하자면, Bosch 에서 만든 통신용 프로토콜이다. 많은 시간과 테스트를 통해 신뢰성을 인정 받았으며, 현재 대부분의 차량에서 사용하고 있는 프로토콜이다. 거슬러 올라가자면 상용 트럭에서 부터 쓰이기 시작했는데, 이후 승용차량까지 범위가 확장이 된 녀석이다. 그렇다고 오해는 하지 말자, 트럭용과 승용은 엄연히 다르다. 



 실제 차량의 회로도의 일부인데, 이 전에도 잠깐 보여줬었지만, 굉장히 단순하면서도 복잡하게(?) 배선이 얽혀 있다. CAN을 사용하는 차량의 경우는 Gateway를 통해 대부분의 ECU가 연결이 되어 항상 통신을 주고 받는데, 일부 메이커에서는 기본적인 통신 라인은 감춰 놓는 경우도 있다. 감추어져 있지 않은 경우 간단하게 CAN 모니터링 툴을 연결하는 것만으로도 주고 받는 데이터를 엿볼 수가 있다. 다만 스펙을 모른다면 대부분이 쓰레기 데이터이기 때문에 솔직히 감추어진 차량 측이 공부하기엔 더 좋다. 



 일반적으로는 이 그림 하나면 모든게 설명이 된다. 이 녀석은 "주로" 두개의 라인으로 Sync가 되고 있는 데이터를 보내고 받는 형식의 프로토콜이다. "주로"라고 한 이유는 선이 한 가닥 뿐인 Single wired CAN 이라는 녀석이 존재하기 때문이다. 싱글의 경우는 간단하게 말하면 속도가 빠른 시리얼 통신이라고도 보일 수 있는데, 실제로는 그렇게 간단한 녀석은 아니다. 


 그림을 보며 간단하게 말을 하면, 두개의 회선은 저항으로 연결이 되어 있으며, 캐패시터를 통해 출력되는 전압을 일정하게 유지시켜 주는 것이다. 



 스펙상의 저항 값과 캐패시터의 값이다. 일반적으로 시판되고 있는 Passthru 장비나 아날라이져의 경우 대부분 이 규격을 유지하고 있으나, 일부 중국산 고물단지들은 이 규격을 벗어나는 경우가 왕왕 있다. 그럴경우 차량측에 연결을 해서 통신을 시도하면, CAN Line에 손상을 입힐 수가 있으니, 주의를 해야 한다. 



 이런 식으로 제조사에서 전압이나 속도등의 스펙은 정해져 있는데, 대부분 사용하는 통신 속도는 500 Kbps 이다. 정의상으로는 1K ~ 1M 까지의 속도가 가능하니 항상 500 K라는 생각은 버려야 한다. 대부분의 메이커에서 500 K를 주로 사용하기는 하지만, 33K, 50Km 125K, 250K 등의 속도를 사용하는 경우가 왕왕 있으니, 주의해야 한다. 속도를 잘못 맞춰서 CAN 통신을 시도하게 되면 CAN Line에 손상을 입힐 수가 있다. 사실 그렇게 쉽게 망가지지는 않지만(위에 써진 것처럼 오랜시간 신뢰성과 안정성이 검증된 프로토콜이다.) 골치아픈 상황에 처할 수도 있다. 


 쉽게 속도를 찾는 방법은 스코프를 찍는 방법이 제일 편하긴 한데, 사실 500K 짜리의 파형을 찍는 것은 쉬운 일이 아니다. 게다가 대부분의 스코프로는 파형이 제대로 보이지도 않기 때문이다. 대략적으로 파형을 보여주자면 이런식으로 찍힌다. 


딱 봐도 알 수 있는 것 처럼 두 라인이 정확하게 Sync를 이루며 나오고 있다. 한 라인이라도 단선이 되면 망가진다는 이야기다. 이런 저런 이유로 CAN에는 다른 프로토콜 처럼 Initial 을 할 필요가 없다. 항상 Initial 이 되어 있는 상태이기 때문이다. 


 여기까지가 일반적으로 이해를 하고 있으면 좋은 부분이다. 이 정도만 이해를 하고 있으면, 다음의 Network 나 Data link, Application 부분에서도 무리없이 진행을 할 수 있는데, 궁금하지 않은가? 하드웨어 적으로 어떤식으로 컨트롤을 해서 Sync를 맞추는지....



 복잡하다. 딱 봐도 KWP 2000과는 아주 많이 다르다. CAN의 경우는 전용 Bit 컨트롤러가 두개의 라인의 Sync를 담당한다. 위에서 본 것 처럼 두개의 라인이 Sync가 되지 않으면 통신이 되질 않는다. 



 이 내용이 컨트롤러가 하는 일을 간략하게 설명한 그림인데, 잘 이해가 되지 않는다. CAN의 Bit timing은 순간순간의 Sync 용 딜레이가 있어 그 딜레이에 맞춰서 두개의 라인을 Sync 시키는 것이다. 이 Sync용 딜레이가 하나가 아니라 총 4 단계로 나누어져 있어 순서에 맞추어 Sync를 시켜준다는 이야기다. 각 딜레이 타임은 표에 정의가 된 것 처럼 Tq라는 녀석으로 정의가 되어 있는데, 이 녀석은 스펙문서에 통신 Bps당 정해진 값이 있다. 즉 두 라인이 그 시간 안에 값이 들어와야 한다는 소리다. 



 이 그림을 보면 좀더 쉽게 이해가 될 것이다. Node A 와 B를 Sync 시키는 과정이 보인다. Sync seg를 기준으로 두개의 라인의 차이를 Sync 시켜 주는데, 이해를 위한 그림이라 두개의 간격이 아주 넓어 보이지만 사실 ns 단위이다.(ms도 아니고 ns이다.) 거의 동시라고 볼정도로 두 라인을 Sync 시켜 준다는 이야기다. 



 이런식으로 CAN Controller 가 Sync를 시켜준 데이터로 통신을 하게 된다는 이야기 인데, 그렇다면 싱크를 하지 않는 Single의 경우는 어쩌란 말인가? 사실 파형을 찍어보면 Single의 경우는 거의 시리얼 통신과 동일하다. 즉 한 라인으로 통신을 하기에 두 라인의 Sync가 이루어 지지는 않지만 그 한 라인에 위에 설명이 된 Bit timing이 적용된 시리얼통신 이라는 소리다. 다만 이 타이밍에 대한 부분이 굉장히 민감해서(ns 단위이니...) 일반 시리얼 통신상의 마진 값으로는 동작하기가 어렵다. (사실 이 부분 보다는 메세지 포멧에 대한 부분이 더 크긴 하지만...) 결국 저 타이밍 컨트롤을 해주는 Controller 가 없으면 제대로 된 신호를 보낼 수가 없다는 말이다. 


 포스팅을 하고는 있지만 굉장히 허무한 내용이다. 결국 전용 컨트롤러를 사용하라는 이야기 이니 말이다. 다만 이 내용을 알고 있다면, 하드웨어 적인 부분에서 어떤 부분이 문제가 있는지를 알아 차릴 수는 있으니 설명을 했다. 아래의 Bit timing 부분은 몰라도 크게 상관이 있는 부분은 아니며, 위에 말한 것 처럼 두 개의 라인은 저항과 캐패시터로 연결이 되어 있다는 부분만 이해를 하고 넘어가도 충분하다.