해결된 질문
작성
·
597
0
안녕하세요 CAN 통신 스터디를 하는 중에 아래와 같은 질문 이있어서 확인 부탁 드립니다.
NODE 1, NODE 2가 같은 CAN ID로
메시지를 전송하게 될 때 우선 순위는 어떻게 되나요?
제가 STM32를 이용해서 CAN 통신 공부를 하고 있는데
STM32에서 CAN 에러가 발생 되서 확인해보니
Form Error와 Bit Stuffing 에러가 확인 됐습니다.
이 에러가 같은 CAN ID로 동시에 메시지를 보낼 경우
발생 될 수가 있나요?
위 에러는 보통 어떤 경우에 발생되는지 설명 부탁 드립니다.
답변 1
0
안녕하세요.
우선 1번 질문의 경우는 음.. 캔 프로토콜상에 그런 부분에 대해서 정의된 내용은 없고 결론만 말씀드리면 어떻게 동작할지 예측 불가. 잘 모르겠다가 결론입니다.
그래서 일반적으로 하나의 캔 네트워크에서 여러 개의 제어기가 같은 ID의 메세지를 송신하지 않도록 설계합니다.
2번 질문의 경우 저도 정확하게 답변 드리기는 어렵습니다만
같은 제어기가 같은 메세지의 ID를 송신하면 말씀하신 에러가 발생하는 상황은 있을 수 있겠습니다.
2개의 제어기가 같은 ID의 메세지를 동시에 송신한다면 버스상에 CAN ID를 Write하는 부분 즉 Arbitration 구간 동안에 두 개의 제어기 모두 자신이 버스상에 가장 우선순위가 높은 메세지를 송신하고 있다고 판단을 할 것이고, 그래서 계속해서 메세지의 남은 영역들을 버스상에 출력하려고 할 겁니다.
(DLC, Data, CRC 등등)
근데 만약 제어기1과 제어기2가 송신하는 메세지 속에 DLC나, Data 영역의 값이 다르다면
어떤 제어기는 값을 1을 쓰고, 어떤 제어기는 값을 0을 쓰는 순간이 생길텐데
이 경우 0이 우선순위가 높으므로 버스상에는 0이 출력이 될 것이고,
그러면 값1을 쓰려고 시도했던 제어기 입장에서는 본인은 1을 출력했는데 다른 제어기에 의해 값이0 이므로
Bit Error로 인식할겁니다.
그리고 만약 제어기1번이 00000 이라는 값을 출력하는 경우, 비트 스터핑 룰에 의해 그 뒤에는 값 1을 써야 합니다. 근데 만약에 하필 다른 제어기2번이 그때 값 0을 write 하고 있다면 결과적으로 버스상에는 0이 출력될거고
이 경우에는 제어기1번 입장에서는 비트스터핑이 되지 않았으므로 비트스터핑 에러로 인식이 될 겁니다.
결론적으로, 같은 ID의 메세지를 2개의 제어기가 송신하는데 , 송신되는 2개의 메세지가 데이터의 값이나 DLC 값 등이 서로 다르다면 위와 같은 이슈로 인해 에러들이 발생할 수 있을 겁니다.
그리고 만약, ID도 같고 다른 값들도 전부 같다고 하더라도
제어기1번,제어기2번이 한치의 오차도 없이 정확하게 똑같은 타이밍에 메세지를 보낸다면 문제될게 없지만
메세지를 송신하는 과정에서 약간의 딜레이가 생겨서 둘중 하나가 1을 쓸 때, 다른 하나가 0을 쓰는 case가 발생해서 또 문제가 발생할 수도 있을 것 같습니다.