-
시작하기 전에
TSMaster를 사용하다보면 CAN 통신 에러가 발생한다. 아래 그림처럼 트레이스창에 에러의 종류가 표시된다. 에러를 감지한 제어기는, 즉시(현재 전송 중인 메시지의 전송 완료를 기다리지 않고) 에러 플래그를 전송한다. 버스 상의 모든 제어기들은 에러 발생을 통보받는다. 수신 제어기들은 현재 수신 중인 메시지를 버린다. 송신 제어기는 에러가 발생한 메시지를 재전송한다. 만일, 아래 그림의 예처럼 원인이 해결되지 않으면, 수신 제어기들은 메시지를 수신할 때마다 에러를 감지하여 즉시 에러 플래그를 전송하고, 송신 제어기는 즉시 재송신을 시도하기에 버스 로드가 급격히 증가한다. 증가된 버스 로드로 통신이 정상적으로 운영되지 않을 수 있다.

수신 제어기에서 ACK 신호를 전송하지 않는 경우, ACK Error가 발생한다. 송신 제어기는 즉시 메시지를 재전송한다. 다시 수신 제어기에서 ACK 신호를 전송하지 않는 경우, 송신 제어기는 즉시 메시지를 재전송한다. 이런 상태가 지속되면 버스 로드는 급격히 상승한다. 너무 높은 버스 로드로 통신이 정상적으로 운영되지 않을 수 있다. 이 포스트에서는 에러의 종류와 감지 방법을 설명한다.
개요
- Bit Stuffing
- CRC Error
- Error Flag와 Error Frame
- ACK Error
- Bit Monitoring
- Frame Check
- Error Active, Error Passive, Buf Off
비트 스터핑 (Bit Stuffing)
- 통신은 동기화 유지가 중요하다. 010101... 이런 식으로 매비트 값이 0에서 1로 혹은 1에서 0으로 상태를 바뀐다면 비트 전송 주기를 확인하기 좋다. 동기화 유지가 쉬울 것이다. 000000... 처럼 혹은 111111... 처럼 같은 상태의 비트가 연속해서 전송되는 경우, 비트 전송 주기 확인과 동기화 유지가 쉽지 않을 것이다.
- CAN은 같은 상태의 비트를 연속해서 최대 5개까지만 전송을 허용한다. 같은 상태의 비트가 연속해서 5개가 되면 반대 상태의 비트를 1개 끼워넣어야(stuff)한다. 이를 비트 스터핑이라고 한다.

CAN 통신의 비트 스터핑 CRC 에러
- CAN 메시지의 구조를 보면 아래 그림과 같다.

CAN 2.0A의 메시지(프레임) 구조 SOF (1 bit): 메시지 시작
ID (11 bit): 메시지 식별자 + 우선순위
Control (6 bit): 데이터 길이 등
Data (0~8 bytes): 실제 데이터
CRC (15 bit): 오류 검출
ACK (2 bit): 수신 확인
EOF (7 bit): 메시지 종료- CRC 부분이 있다. CRC는 수신 측에서 수신된 메시지의 무결성을 확인하는 방법이다.
- 송신 제어기는 전송할 데이터에 계산한 CRC를 추가한다.
- 수신 제어기는 수신된 데이터에서 CRC를 계산하고, 이 값이 메시지와 함께 온 CRC와 일치하는지 확인한다.
- 일치하지 않을 경우, 수신 제어기는 에러 플래그를 전송한다. 송신 제어기는 에러 플래그를 보고, 재전송을 한다.
에러 플래그와 에러 프레임 (Error Flag and Error Frame)
- 비트 스터핑 규칙에 따르면 동일 상태의 비트는 연속해서 최대 5개를 전송할 수 있다.
- 에러를 발견한 제어기는 0을 6개 연속해서 전송하여 일부러 에러를 발생시킨다. 이를 에러 플래그라고 부른다.
- 000000
- CAN 통신에서 0은 Dominant, 1은 Recessive 이다.
- 0 일때 전기적으로 하이 상태이고, 1 일때 로우 상태이다.
- 서로 다른 제어기들이 동시에 버스를 하이와 로우 상태를 만들려고 하면 버스 상태는 하이가 된다.
- 에러 플래그로 버스의 모든 제어기들은 현재 전송 중인 메시지에 이상이 있다는 것을 알게된다.
- 송신 제어기는 재송신을 준비한다.
- 에러 플래그와 재송신 메시지 사이에 간극이 필요하다. 이를 에러 딜리미터 (Error Delimiter. 에러 간극)이라고 부른다. 8개의 Recessive 비트들이다. (11111111)
- 에러 플래그와 에러 딜리미터는 연속적으로 전송된다. 에러 플래그와 에러 딜리미터를 합쳐서 에러 프레임이라고 한다.
Error Frame Error Flag
000000Error Delimiter
11111111Error Frame은 Error Flag와 Error Delimiter로 구성된다.
- 제어기는 적극적 (에러 플래그: 000000) 으로 에러 검출을 알릴 수도 있고 소극적(에러 플래그: 111111) 으로 알릴 수도 있다. 이는 각 제어기의 에러 상태에 따라에 따른다. 아래에 설명한다.
ACK 에러
- 통신에는 송신측과 수신측이 필요하다.
- 송신측에서 수신측이 메시지를 잘 수신하였는 지 확인할 수 있다면, 그리고 필요에 따라 재송신을 한다면, 메시지 전달의 확실성을 높일 수 있다. 수신측은 ACK 신호를 통해서 메시지 수신 여부를 송신측에 확인시켜 준다.

ACK는 메시지 수신 여부를 송신측에 확인시켜 준다. ACK 부분의 2 비트는 1 비트 ACK와 1 비트 ACK delimiter로 구성된다. - 전송 제어기는 ACK 신호 부분을 1 (Recessive)로 설정한다. 송신 제어기들 중 어느 한 제어기라도 ACK 신호 부분을 0 (Dominent)으로 설정하면, 전송 제어기는 수신 성공으로 판정한다. ACK 신호가 1인 상태로 유지된다면, 송신 제어기는 수신 실패로 판정한다. ACK 에러로 감지한다.
- TSMaster로 여러 제어기들이 연결된 CAN 버스를 모니터링 할 때, TSMaster의 ACK를 On 상태 (= Normal 상태)로 설정한다면, 제어기들은 ACK 신호를 보내지 않는데 TSMaster가 ACK 신호를 보내서 송신 제어기는 수신에 문제가 없다고 판정할 수 있는 가능성이 있다. 이는 TSMaster를 버스에서 제거하면 통신 문제가 발생하고, 연결하면 통신 문제가 해결되는 현상으로 나타날 수 있다.
- TSMaster가 제어기를 대상으로 상대 제어기를 시뮬레이션 하는 경우 (이런 경우를 RBS라고 한다. Remaining Bus Simulation), ACK Off로 설정하면, 제어기는 ACK 비트를 받지 못해서 송신 에러가 발생한 것으로 착각하고 반복해서 재송신을 하게된다. 따라서 이 경우, Normal 상태 (= ACK On)로 설정해야 한다.

TSMaster의 Hardware Configuration에서 Controller Mode를 실험 환경과 목적에 따라 적절하게 선택해야 한다. 비트 모니터링 (Bit Monitoring)
- Bit Monitoring은 송신 제어기가 자신이 버스에 전송한 비트 값을 실시간으로 다시 읽어 전송 오류를 검출하는 방법이다.
- 정상: 송신 노드가 Dominant (0) 비트를 전송한다. 버스에서 읽은 비트도 Dominant (0) 이다.
- 에러: 송신 노드가 Dominant (0)를 보냈는데, 버스에서 Recessive (1) 를 읽는다면, 이는 다른 노드의 간섭 (경쟁)이나 외부 노이즈 등으로 인해 전송 에러가 발생했음을 의미한다. 송신 제어기는 에러를 발생시킨다.
- 예외: 중재(Arbitration) 필드에서는 낮은 우선 순위의 아이디를 가진 제어기가 Recessive를 보낸 후 Dominant를 읽는 것은 정상적인 상황이므로 에러로 처리되지 않는다.
프레임 체크 (Frame Check)
- 프레임 체크는 CAN 메시지 프레임 형식(Format)이 프로토콜을 준수하고 있는지 확인하는 방법이다.
- 메시지 포맷에 정의된 영역에서 고정된 비트 값(Fixed Form Bit)이 제대로 유지되는지 검사한다.
- 예
- ACK delimiter는 항상 Recessive (1) 비트가 와야 한다.
- EOF (End of Frame) 필드는 항상 7개의 Recessive (1) 비트로 구성되어야 한다.
- 예
- 아래의 경우 프레임 체크 에러를 발생시킨다.
- ACK delimiter 필드에서 Recessive (1) 가 아닌 다른 값을 감지한다.
- EOF 필드에서 1111101과 같이 Dominant (0) 비트를 감지한다.
- 이것을 Form Check(폼 체크)라고 하는 것 같다. 프레임 체크와 폼 체크가 같은 것을 의미하는 다른 용어인지, 다른 것을 의미하는 다른 용어인지 정확히 모르겠다.
Error Active, Error Passive, Bus Off
- 에러 플래그를 설명하면서 에러 플래그의 값이 모두 0인 경우 (000000)와 모두 1인 경우(111111)가 있을 수 있다는 점을 지적했다. 각각 Active Error Flag와 Passive Error Flag라고 한다.
- 제어기는 언제 액티브 에러 플래그를 언제 패시브 에러 플래그를 전송할까?
- CAN 컨트롤러는 에러를 감지할 때마다 송신 에러 카운터(TEC: Tx Error Counter)와 수신 에러 카운터(REC: Rx Error Counter)를 사용하여 자신의 상태를 관리한다.
- Error Active (에러 활성): TEC 또는 REC가 127 이하인 상태이다. 제어기 스스로를 정상 상태라고 볼 수 있다. 이 상태에서는 액티브 에러 플래그를 전송한다.
- Error Passive (에러 수동): TEC 또는 REC가 128 이상 255 이하인 상태이다. 제어기 스스로 통신 신뢰성이 낮아진 상태이다. 즉, 내 에러 감지에 문제가 있을 수 있다고 의심할 수 있는 상태이다. 버스에 영향을 덜 주는 패시브 에러 플래그만 전송한다.
- Bus Off (버스 오프): TEC가 256 이상인 상태이다. 제어기가 자신의 에러 감지에 문제가 있다고 판단할 수 있는 상태이다. 통신을 중지하여 스스로를 버스에서 격리한다. 어떠한 메시지도 전송하거나 수신할 수 없다. 통신을 재개하려면 마이크로콘트롤러가 CAN 콘트롤러를 리셋하는 것 같은 시스템의 개입이 필요하다.
결론
- CAN은 CRC 점검, ACK 점검, 비트 모니터링, 비트 스터핑, 프레임 점검으로 송신과 수신 에러를 점검한다.
- 연속한 상태의 비트를 5개까지만 허용하는 비트 스터핑을 영리하게 이용하여, 에러 감지를 표시하는 에러 플래그로 송수신 에러를 상대 제어기들에게 알린다.
- 위 간단한 방법들 만으로 자동차에 적용할 수 있는 높은 수준의 에러 감지와 처리 성능을 보유하고 있다.
- 에러 감지/처리 방식을 개발한 일머리 좋은 CAN 창시자들에게 경의를 표한다.
'analysis' 카테고리의 다른 글
LIN RBS (Remaining Bus Simulation) - 3/3 (0) 2025.12.15 LIN RBS (Remaining Bus Simulation) - 1/3 (0) 2025.12.14 blf --> csv --> 리샘플 --> xlsx (1) 2025.09.05 트레이스창에서 메시지 필터 걸기 (0) 2025.08.19 판넬에서 이미지로 차의 주행 방향을 표시하는 방법 (5) 2025.07.27