ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CAN 통신 ( Controller Area Network )
    Network & Hacking/Network 2020. 2. 3. 23:20

    CAN(Controller Area Network)은 호스트 컴퓨터 없이 마이크로 컨트롤러나

    장치들이 서로 통신하기위해 설계된 표준 통신 규격을 의미하며

    일반적으로 자동차에 존재하는 ECU(Electronic Control Unit)라는

    모듈끼리 통신하는 기술이다. ( But, 최근엔 다양한 산업에서 사용됨)

    dominant와 recessive 비트를 이용해서 통신한다. 쉽게말해 0과 1이다.

    * 정확한 내용은 여기를 참조하자 *

    * ECU : 자동차에 사용되는 전자 제어 장치를 의미 *




    이러한 CAN통신은 초창기에는 비동기 직렬통신

    UART(Universal Asynchronous Receiver/Transmitter)를

    이용해서 통신을 하였다. 하지만 UART 통신의 경우 각각의

    모듈이 1:1로 통신을 한다는 단점이 있었고 때문에 통신을

    위해서는 각각의 모듈을 모두 연결해야했기에 연결선이 많이 필요했다.



    이를 해결하게되는 통신이 바로 CAN 통신이다. CAN 인터페이스 하나로

    여러 개의 모듈을 제어할 수 있었기 때문에 연결선을 감소시킬 수 있었고

    효율적으로 통신을 주고 받을 수 있었다. 추가적으로 ECU를 장착 하더라도

    더욱 쉽게 확장할 수 있다는 장점을 가졌다. CAN 통신은 병렬형 방식을 이용했다.





    < UART : 직렬 방식, Point-To-Point 방식 >



    < CAN : 병렬 방식, Multi Master 방식 >





    < CAN 통신의 장점 >


    1. Multi Master 통신방식을 이용하기 떄문에 네트워크의 버스를 점유하는

    버스 마스터(감독자 노드)가 필요없다. 모든 노드가 버스 마스터이며

    버스마스터가 비어있을 떄는 어떤 노드라도 언제든 메시지 전송이 가능하다.

    모든 노드는 버스가 비워지는 즉시 메시지를 전송하는데 만약 여러 노드에서

    동시에 메시지를 전송하려고 하더라도 우선순위 ID에 따라 전송된다.

    ID가 낮을 수록 높은 우선순위임을 뜻한다.



    2. CAN이 경우 버스의 상태를 실시간으로 모니터링하며 결함 발생 시,

    해당 노드를 감지해 비활성화 시킨다. 즉, 네트워크 신뢰성을 보장한다.



    3. Twist Pair Wire을 사용하여 전기적 노이즈에 강하며 전기적으로 차별화된 

    통신으로 메시지를 안전하게 보호할 수 있다. Twist Pair Wire를 사용한다는 것은

    CAN_High, CAN_Low 두 개의 신호로 통신을 이용한다는 의미이며 때문에

    많은 모듈이 추가되더라도 선의 양의 적다는 장점을 가지고 있다.

    * CAN_High와 CAN_Low는 서로다른 전압을 사용하여 노이즈를 줄인다 *



    4. CAN 통신은 상호보완적인 에러감지를 하기 떄문에 안정성이 높다.

    메시지 전송 시에 에러가 감지되면 자동적으로 해당 메시지를 바로 재전송하는

    기능이 있어서 타 프로토콜에 비해 에러에 대한 회복 시간이 짧다.



    5. 메시지 지향성 프로토콜이다. CAN 통신은 노드의 주소에 의해 데이터가

    교환되는 것이 아닌 할당된 메시지 우선순위 ID를 통해 메시지를 구별한다.

    각 노드들은 자신이 받은 메시지가 자신에게 온 메시지인지 ID를 보고

    구별하며 만약 자신에게 날아온 메시지라면 받아들이고 아니면 무시한다.




    CAN 통신의 경우 보통 세 가지 형태가 존재한다.

    통합형, 독립형, 단일 칩형




    1. MCU 내부에 CAN Controller가 존재 (통합형)




    2. MCU 내부에 CAN Controller가 존재X (독립형)

    CAN 프로토콜 환경 구성은 CAN Controller CAN Transceiver로 구현되어있다.

    Controller는 내부 버퍼를 가지며 Transceiver의 수신 메시지에 대해

    ID 값을 기반으로 유효데이터인지를 판별하여 MCU로 전송한다.




    Controller가 하는 일은 중앙처리 장치역할의 Processor(MCU)의 명령을 받는다. 


    < 수신의 경우 > 

    메시지를 사용할 수 있을 때까지

    Bus로부터 수신된 직렬(시리얼) 비트를 저장하며 

    이 데이터는 MCU를 통해 다시 가져올 수 있다.


    < 전송의 경우 >

    MCU가 전송 메시지를 CAN 컨트롤러로 전송한다. 

    CAN 컨트롤러는 Bus가 비어있을 때 직렬(시리얼) 비트로 Bus에 전송한다.




    * 참     고 *

    직렬(시리얼 비트) : 한번에 하나의 비트단위를 사용함을 의미

    즉, 하나의 채널을 이용한다는 의미이다. 병렬과 비교해서 보자




    Transcevier가 하는 일은 MCU가 CAN Bus로 데이터를 송신하거나

    수신하는 데이터를 전기적 신호로 변환해주는 역할을 한다.

    MCU -> CAN Bus일 경우 : MCU용 데이터를 CAN Bus용 데이터로 변환

    CAN Bus -> MCU일 경우 : CAN Bus용 데이터를 MCU용 데이터로 변환



    * 단일 칩형의 경우 MCU에 CAN Controller와 Transceiver가 모두 내장되어 있다 *







    CAN 통신은 Multi Master Network로 구성되었으며 CSMA/CD + AMP 방식을 사용한다.

    CAN 통신을 하는 노드들에게 메시지를 보내기전 Bus라인을 사용중인지와

    메시지 간에 발생하는 충돌을 확인힌다. 위에서 설명한대로 메시지에는 

    출발지와 목적지에 대한 주소정보가 없고 단지 노드의 고유 식별자 ID만을 가진다.

    ID는 11bits or 29bits의 크기를 가지고 있다.


    이 우선 순위는 낮을 수록 우선순위가 높은 것이며 우선적인 

    Bus 사용 권한을 부여받게 된다. 전송이 끝난 후에는 다음 우선순위

    ID를 가진 노드가 자동으로 재전송을 진행하게 된다.

    ( 재전송인 이유는 여러 노드가 동시에 전송하려한 상황에서

    우선순위에서 밀린 메시지가 전송되지 않고 기다리고 있는 것이

    아니기 때문에 자신의 차례에 다시 전송하는 것이다.) 



    CAN의 구조를 보면 보다 쉽게 이해할 수 있다.

    구조상 제일 처음에 ID가 있기 때문에 효율적으로

    위의 역할을 수행할 수 있는 것이다.  ID값이 제일 앞에 존재해서

    비교를 하게되면 뒤의 내용을 볼 필요가 없기 때문이다.





    * ISO 규격에 따라 메시지 포맷이 구분되며 통신속도에 차이가 있다 *

    표준 CAN : 11비트 식별자 (2.0A ver) , 1Mbps 이상 고속 통신 가능

    확장 CAN : 29비트 식별자 (2.0B ver), 125Kbps 까지 통신이 가능

    => A가 B로 메시지를 송신하는 것에 대해서는 B가 A의 메시지를 받아들이지만

    B가 A로 송신하는것은 A가 거부한다. 또한 같은 버전끼리는 서로 송수신이 가능하다.



    CAN 통신에는 4가지 Frame이 존재한다.


    1. Data Frame : 데이터 송수신에 사용

    2. Remote Frame : 수신노드가 원하는 메시지를 송신할 수 있는 노드에게 전송 요청할 떄 사용

    3. Error Frame : 메시지의 에러가 감지되었을 떄 사용

    4. Overload Frame :  메시지 동기화할 떄 사용


    이 중에서 데이터의 송수신에 사용되는 Data Frame 구조를 살펴보자




    < CAN Data 프레임 구조 >

    * SOF ( Start Of Frame ) *

    메시지의 처음을 지시하며 모든 노드의 동기화를 위해 사용함


    * Arbitration Field *

    11비트 또는 29비트의 크기를 갖는 식별자와 1비트의 

    RTR(Remote Transmission Request) 비트로 구성

    -> 둘이 상의 노드에서 메시지 전송이 일어날 시, 메시지간의 충돌을 조정함


    * Control Field *

    IDE(2bit) + DLC(Data Length Code)로 구성됨

    r0는 Reserved 비트 ( Extended의 경우 CAN 2.0B R0, R1 )


    * Data Field * 

    특정한 노드에서 다른 노드로 전송하는 데이터 포함하며

    8Bytes까지 사용, 데이터를 저장하는데 사용함 


    * CRC Field *

    메시지 상의 에러 유무를 검사한다 Checksum이라고 생각


    * ACK Field *

    한 비트의 ACK 슬롯과 하나의 ACK 델리미터('d')로 구성.

    임의의 노드에서 올바른 메시지를 수신하게 되면 ACK 필드를

    받는 순간 ACK 슬롯의 값을 'd'로 설정해 Bus 상에서 계속 전송


    * EOF *

    7비트로 구성되어 있으며 프레임 종료를 의미(메시지의 끝남을 의미)





    < CAN 계층 구조 >





    참고 및 그림 출처 : https://www.fescaro.com/ko/archives/249

    http://www.eskorea.net/html/data/technique/ESUpdate200811.pdf

    https://ssoonidev.tistory.com/14

    https://en.wikipedia.org/wiki/CAN_bus

    https://www.ni.com/ko-kr/innovations/white-papers/06/controller-area-network--can--overview.html

    https://m.blog.naver.com/PostView.nhn?blogId=windowsub0406&logNo=220525347316&proxyReferer=https%3A%2F%2Fwww.google.com%2F

    댓글 0

Designed by Tistory.