Error의 종류 및 마무리
Error state
Error Active
- 고장을 감지하면 Active Error 프레임이라는 것을 네트워크 전체에 보내서 현재 고장이 발생했음을 알림
Error Passive
- 고장을 감지하면 Passive Error 프레임이라는 것을 보내서 네트워크 전체에 고장이 발생했음을 알리는데 Passive는 Active에 비해 고장이 발생했다는 알리는 파워가 약함
Bus off
동작 예시)
TEC: Transmitter Error Counter
REC: Receiver Error Counter
- 2번 제어기가 메세지를 보내고 있다고 가정하면, 이때 2번 제어기가 Transmitter가 됨
이 메세지를 보내고 있는 와중에 2번 제어기가 에러를 감지하면 본인의 TEC를 울림
이때 1번, 3번 제어기는 수신자가 되는데 이 수신 제어기가 수신하고 있는 와중에 에러를 감지하면 본인들의 REC를 울림.
메세지가 정상적으로 송수신 되면 이 에러 카운터를 낮춤
고장이 발생되면 에러 카운터가 올라가고 정상적으로 메세지가 송수신 되면 에러 카운터가 내려가는 형식으로 동작하다가 누적되어 TEC or REC가 128을 넘어가게 되면 초기 상태인 Error Active 상태에서 Error Passive 상태로 전환이됨
Error Passive상태에서 메세지가 정상적으로 송수신이 되면 에러 카운터가 다시 내려가게 되므로 REC < 128 and TEC < 128 상태를 만족하면 Error Active 상태로 돌아가게됨
하지만 Error Passive 상태에서 계속해서 고장이 발생하여 TEC > 255 가 되면 Bus off상태에 도달하게 됨
Bit Stuffing Rule
- 메세지에 담기는 값을 기준으로 하는 것이 아닌 버스 상에 출력되는 전압을 기준
- 예시) id 영역에 값이 000000이 있다고 가정
같은 값인 0이 6개 나옴 -> bitstuffing rule을 어긴것? -> 아님 -> 버스 상에 출력된 것을 기준으로 6개가 나오면 안 된다는 규칙
- 내가 000000을 보내야 한다면 bitstuffing룰때문에 0000010 이런식으로 보내야함
실제로 버스를 읽어봤는데 똑같은 값이 6개가 연속으로 나오면 에러라고 감지함(bitstuffingrule을 어겼기 때문)
Bit Error
- 내가 보낸 bit를 바로 읽어 봤을 때 bit가 다르면 에러로 감지하는 것
- 1을 보냈는데 0, 0을 보냈는데 1인 경우 에러로 감지
- 예외) arbitration 과정에서는 내가 1을 보냈지만 0이 나올 수 있다. 이건 에러가 아님
Stuff Error
- 6개 연속 같은 bit 나오는것 에러(Physically)
(수신인도 이 에러 확인함)
Acknowlege Error
- 참고, 리시버는 ack 보낼 때 bit error 체크도 함
sender가 1로 보냈는데 0으로 수신안되면 에러로 판단
- 예시) 1번 제어기가 메세지를 보내면 수신자인 2,3,4번 제어기들은 모두 전달 받은 값들과 CRC를 이용해 계산하여 데이터 변조가 일어났는지 여부를 판단함. 아무 문제가 없으면 ack 영역에 수신자들이 0이라고 적어서 답을 보냄
송신자들은 항상 ack를 1로 채워서 보내고, 수신자들이 CRC를 계산해서 정상이면 0을 씀
송신자는 그 0을 보면 내가 보낸 데이터에 아무 문제가 없구나 하고 정상으로 판단
하지만 CRC값이 이상하다고 판단되면 수신하는 제어기들이 ack를 1로 보냄
CRC (Cyclic Redundancy Code)
CRC
- 어떤 데이터를 통신을 통해서 보냈을 때 이 데이터에 대한 CRC 코드라는 걸 뒤에 붙여서 같이 보냄. 메세지를 수신 받은 사람은 수신받은 데이터와 뒤에 같이 온 CRC 코드를 사용해서 정해진 연산을 하면 그 결곽값을 보고 데이터가 전달되는 과정에서 변조가 됐는지 판단하는 것이 CRC
요약
- CAN프로토콜은 통신의 신뢰성을 확보하기 위하여 5가지 종류의 에러를 정의하고 있으며, 에러를 감지했을 때 어떻게 동작해야 하는지를 정의하고 있다.
- 3개의 State 존재 -> Error Active, Error Passive, Bus Off
- 2개의 카운터 존재
- 고장 감지하면 카운터 증가/정상적인 메세지 송수신 하면 카운터 감소
- 카운터 값에 의해 State 변환
- 5가지의 에러 : Bit 에러 / Stuffing 에러/ CRC 에러/ Ack 에러/ Form Error
CAN 에러 스테이트에 관해서 몰랐던 것을 배웠습니다. 감사합니다. :-)
저는 CAN 개발 툴 사용법에 관해 블로그를 쓰고 있습니다. 제 블로그가 도움이 되면 좋겠습니다. https://tsmaster.tistory.com/