강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

지루한 꼴뚜기님의 프로필 이미지
지루한 꼴뚜기

작성한 질문수

CAN 통신 - 자동차 신입이 알아야 할 모든 것

Bus Off(버스 오프) 상태가 흔히 발생되는 상태인가요?

해결된 질문

작성

·

40

0

흔히라는 표현이 이상하긴 한데요. 물론 Bus Off 상태는 겪지 않는 게 이상적인 것 같긴 하나

이 상태에 대한 처리(리액션)을 언급하신 걸로 보아 엄격하게 절대 있어서는 안 되는 상태인 것처럼 묘사하시지는 않은 것 같아서요.

예를 들어 없는 게 좋지만 간혹 발생되도 그거에 대한 처리만 잘하면 어느정도 용인되는 상태인가 해서요.

 

그리고 자세히 몰라도 상관 없다고 하시기는 하셨으나 "CAN 에러 처리" 섹션을 수강하면서 몇 가지 궁금한 게 있어서 추가로 질의합니다.

  1. 동일 CAN Bus 에 묶여 있는 시스템에서 일부 제어기들만 Error를 감지하는 게 일반적인가요?


    그런 상황을 묘사해주셔서 궁금합니다.


    Error의 종류 설명해주신 게 Bit Error, Stuff Error, CRC, Acknowledge Error, Form Error 인데요.
    이 중에서 Bit Error, Acknowledge Error 정도를 제외하고
    (송신자가 확인하니까? 그리고 Form Error도 감지 시점이 잘 모르겠으나 일부에서만 감지될 수 있어보이긴 합니다)
    broadcast 되는 CAN 특성상 Error를 묶여 있는 제어기들이 다 같이 감지할 것 같은데 그렇지는 않나요?

  2. Acknowledge Error 를 설명해주실 때, 송신 측에서 반드시 Acknowledge Slot Bit 를 1로 세팅하고 수신측에서 잘 받았다면 Ack에 0을 출력한다고 하셨고 Bus 상에 Ack Bit가 0이 된다고 묘사하셨는데요.


    a. Bus 상에 CAN Message 가 유지되다는 건 이해되지 않고 수신측에서 수신한 메세지를 그대로 Ack Bit만 0으로 변경해서 응답한다는 걸까요? CAN Protocol이 항상 그런 식인 건가요?


    b. 그리고 송신 측이 보낸 메세지에서 Ack Bit를 0으로 업데이트를 할만한 제어기가 없는 상황
    즉, 개발/테스트 환경 같이 제어기가 하나만 있는 상황이라면 송신하는 족족 Error Count가 올라가게 될까요? 최종적으로는 Bus Off?

  3. 제어기가 에러를 감지하면 Stuff Error를 유도하는 Error Frame 를 전파한다고 하셨는데요.
    그러면 이 Error Frame을 수신한 제어기도 이 Error Frame에 의해서 Error를 감지하고 또 Error Frame을 전파하는 상태가 순환되는 거 아닌가요?
    당연히 이렇게 에러가 순환되는 상태가 되도록 CAN이 설계되어 있을 것 같진 않지만 설명을 듣는 순간 떠올라서 질문 추가합니다.

 

 

 

답변 1

0

존버매니아님의 프로필 이미지
존버매니아
지식공유자

안녕하세요. 버스 오프가 흔히 일어나는 증상이냐고 물으셨는데 딱 잘라서 대답하기가 힘든 질문이네요.
그냥 제 개인적 경험으로는 실제 차량에서 버스 오프 에러가 발생하는 경우를 본적은 없습니다.

그래서 제품 개발 과정 중에 버스 오프 처리 로직을 검증할 때도,
일부러 CAN High, CAN LOW 전선을 서로 접촉시켜서 신호를 강제로 캔 스펙을 벗어나도록 만들어서 강제로 캔 버스 오프 상태를 만들어서 테스트합니다.
실제 차량에서도 물리적으로 제어기나 통신wire에 뭔가 문제가 생기지 않는다면 발생할 일은 없을거 같습니다.

1.
일부 제어기만 에러를 "감지" 한다는 표현은 제가 설명을 애매하게 한 거 같습니다.
일부 제어기만 에러를 "유발" 한다고 표현하는게 나을거 같습니다.

예를 들어 스터핑룰을 어기는 상황이라면, 네트워크에 연결된 어떤 제어기든
그 상황을 인식할 수 있을테니 일부만 인식하는게 아니라 모든 제어기가 인식 할겁니다.
제가 설명하려고 했던건, 특정 제어기 1개가 맛이 가서 계속 스터핑 룰을 어기는 형태로 신호를 내보낸다면, 해당 제어기는 버스 오프 상태에 진입해서 더 이상 통신에 참여 못하게 해서
다른 제어기들 끼리라도 통신을 할 수 있게 한다는 의미였습니다.

마찬가지로 예를들어 CRC 에러의 경우에도, 값이 틀린 CRC가 메세지에 담겨있다면
모든 제어기가 CRC에러를 감지할 겁니다.
말씀하신 것처럼 캔통신에서는 모든 제어기가 똑같은 통신선을 사용하니까 에러 상황이 발생하면
보통은 모두가 감지할 겁니다.

 

2.a 메세지를 보내고 받는다 라고 표현을 해서 좀 혼동하실 수 있는데
송신측이 하나의 메세지를 보내는 행위를 끝내면, 그 메세지가 수신측에 전달되는게 아니고
캔 통신에서 메세지를 보내는 행위는 사실 메세지를 통째로 보내고 받는게 아니고
송신측은 1또는 0의 데이터를 1bit씩 차례차례 쓰는거고, 수신측은 버스를 읽어서 송신측이 보낸 1 또는 0의 데이터를 실시간으로 1비트씩 계속 수신하는겁니다.

그러다가 송신측이 앞에서 ID,DLC,Data,CRC에 해당하는 값을 출력한 후에 ack bit 값을 write하는 타이밍일 때, 이때 수신측이 버스에 값 0을 write 한다는 의미입니다..
설명이 이해가 돼셨을지 모르겠네요 .. ㅠㅠ

2.b 이 부분은 강의에서 잠깐 추가 설명했던 부분인데
네트워크에 수신측 제어기가 없는 상태일 때는, ack에러에 의해 에러 카운트가 지속적으로 증가하지만
에러 passive 상태까지만 가고 버스오프 상태에 진입하지는 않습니다.
ack에러가 발생한 상황이랑, 수신제어기가 없을때의 상황이랑.. 버스에 출력되는 신호의 형태가 달라서
이게 구분이 되는데,,, 그 내부 메커니즘 까지 설명하기가 어려워서 설명을 생략했씁니다.
아무튼 결론은 네트워크에 수신 제어기가 없을때는, passive 에러 state 상태를 유지하다가,
그 네트워크에 수신 제어기가 새롭게 연결되서 , ack bit를 0으로 보내주면
다시 에러카운트가 내려가서 정상동작하게 됩니다.

  1. 이 부분도.. 너무 자세히 설명하기에는 내용이 너무 복잡해서 제가 설명 생략한 부분이 있어서
    혼란스러울거 같습니다.

    근데 결론을 말하면
    제어기가 에러를 감지하면, 에러 프레임을 전파하게 되고. 그러면 다른 제어기도 에러프레임에 의해 에러를 감지해서 또 에러프레임을 전파하는게 맞습니다.
    근데 그렇다고 해서 에러가 계속 무한히 전파되는건 아니고..

    이게 캔통신을 메세지 하나하나 단위로 주고 받는다고 생각하면 이해가 어려운데
    앞에서 말했듯이 캔 통신은 실제로는 비트상에 0,1을 쓰면서 비트단위로 실시간으로 송수신이 이뤄지는거라는걸 알아야 좀 더 정확한 동작을 이해할 수 있습니다.

    이거까지 설명하기에 복잡해서 설명을 생략했는데 그래도 글로 써보자면
    누군가 에러 프레임을 네트워크에 보내면,
    그걸 수신한 다른 제어기도 하나의 새로운 에러 프레임을 보내는게 아니라

    실제 버스상에 출력되는 신호 형태로만 얘기하면
    처음에 누군가가 보낸 에러플래그의 길이가 추가로 더 길어지는 형태인데..
    보쉬에서 제공하는 실제 캔통신 스펙 문서에 아래 그림과 함께 자세한 설명이 적혀있습니다.

    image.png

    좀 더 구체적인 캔통신의 동작과정을 이해하려면
    실제로 캔하이, 캔로우에 어떤식으로 신호가 출력되는지
    그리고 Start of Frame, End of Frame, Delimeter 이런 개념까지 다 알아야되는데
    이것들을 다 설명하기가 어렵네요.. 이렇게 글로 주절주절 적은 답변이 이해가 될지 모르겠습니다 ㅠㅠ





우려하시는 바와 다르게 제가 봤을 때는 틈이 없을 정도로 완전히 설명해주신 것 같습니다. 감사합니다. BUS OFF 를 유도하는 요령도 알려 주셔서 감사합니다.
질문을 위해 완독 후 다시 해당 섹션을 발췌해서 부분부분 봐서 강사님께서 설명해주셨음에도 놓친 부분이 있었나보네요. 이 답변과 함께 강의를 다시 한번 보도록 하겠습니다.
감사합니다.

지루한 꼴뚜기님의 프로필 이미지
지루한 꼴뚜기

작성한 질문수

질문하기