전자기적으로 열악한 차량 환경에서 CAN 버스는 잡음에 상시 노출된다. Differential Signaling 같은 물리적 대책이 비트 오류의 발생 확률을 낮추지만 완전히 없애지는 못하므로, 남는 오류는 검출된 즉시 버스의 모든 노드가 놓치지 않고 알아야 한다 — 그래야 어떤 노드는 프레임을 정상으로, 다른 노드는 오류로 받아들이는 불일치가 생기지 않는다. 이를 위해 CAN은 다섯 가지 오류 검출 메커니즘과, 검출된 오류를 즉시 버스 전체에 통지하는 Error Frame을 규정한다[1].

다섯 가지 오류 검출 메커니즘

Bit Monitoring은 송신 노드가 자신이 실은 비트값과 버스에서 되읽은 값을 매 비트 비교하는 검사다 — 두 값이 다르면 bit error로 판정한다. 단 Bitwise Arbitration이 벌어지는 Arbitration Field와 ACK 슬롯에서는 recessive로 보낸 비트가 dominant로 되읽히는 상황이 정상 동작이므로 이 두 구간은 예외로 둔다[1].

Stuff CheckBit Stuffing 규칙 — 같은 값의 비트가 5개 연속되면 반대 값 비트를 삽입하는 규칙 — 이 지켜지는지 보는 검사다. 이 규칙을 어기고 같은 값이 6개 연속되면 stuff error로 판정한다[1].

Form Check는 CRC Delimiter·ACK Delimiter·EOF처럼 값이 고정된(fixed-form) 필드가 실제로 정해진 값(recessive)을 유지하는지 보는 검사다. 이 필드 중 하나라도 다른 값이 관측되면 form error로 판정한다[1].

CRC CheckCAN Frame의 CRC Field에서 다뤘듯, 수신 노드가 독립적으로 계산한 CRC 값을 송신된 값과 대조하는 검사다. 값이 다르면 CRC error지만, 이 시점에는 Error Flag를 곧바로 보내지 않는다 — 대신 ACK 슬롯에서 dominant 비트를 싣지 않는 것으로만 오류를 알린다(negative acknowledgement)[1].

ACK CheckCAN Frame의 ACK Field에서 다뤘듯, 송신 노드가 ACK 슬롯에서 dominant 비트를 되읽는지 보는 검사다. 되읽지 못하면 acknowledgement error로 판정한다 — 수신 노드가 CRC error로 negative acknowledgement를 보낸 경우도 송신 노드 입장에서는 이 검사의 실패로 나타난다[1].

Error Frame

다섯 메커니즘 중 하나로 오류를 검출한 노드는 그 즉시 진행 중이던 프레임을 깨고 Error Frame을 싣는다. Error Frame은 6비트의 Error Flag와 그 뒤를 잇는 8비트의 Error Delimiter로 구성된다.

Error Flag 0 0 0 0 0 0 6비트 검출 노드가 Error Active면 전부 dominant Error Delimiter 1 1 1 1 1 1 1 1 8비트, 항상 recessive

검출 노드가 Error Active 상태면 Error Flag를 6개의 dominant 비트로 싣는다(active error flag). Active Error Flag는 프레임의 어느 위치에 끼어들든 스터핑 규칙이나 고정 필드 규칙을 위반하게 되므로, 아직 오류를 모르던 다른 노드들도 이를 감지하고 곧바로 자신의 Error Flag를 잇따라 보낸다 — 이런 식으로 국소적으로 검출된 오류가 버스 전체에 알려진다. 반대로 Error Passive 상태인 노드는 6개의 recessive 비트로 된 passive error flag만 보낼 수 있어, 다른 노드의 전송을 실제로 방해하지는 못한다. 두 상태의 차이는 Fault Confinement에서 다룬다. Error Flag 뒤에는 8비트의 recessive Error Delimiter가 붙어 Error Frame을 마무리한다[1].

Error Frame으로 무효화된 프레임은 폐기되고, 송신 노드가 자동으로 재전송해 복구한다[1].

참고문헌

[1]
Robert Bosch GmbH, “CAN Specification, Version 2.0”, 1991.