CAN 에러 처리(Data Protection) — CAN 프로토콜이 비트 오류를 감지·신호·대응하고, 결함이 있는 노드를 점진적으로 버스에서 격리하는 메커니즘. 3단계 전략으로 구성된다.
3단계 전략
| 단계 | 방법 | 수단 |
|---|---|---|
| 1 | Prevent Bit Errors | 물리 수단 (데이터 프레임 보호 L1) |
| 2 | Handle Bit Errors | 프로토콜 논리 수단 |
| 3 | Fault Confinement | TEC / REC 카운터 |
- 전자기 방해가 많은 차량 환경에서 물리/논리 대책으로 민감도 감소. 그래도 일부 에러는 남음.
- 남은 에러는 모든 수신자가 놓칠 수 없는 방식으로 표시 → 버스 전체 데이터 일관성 보장. 감지된 에러는 메시지 재전송으로 교정.
- 특정 노드가 비정상적으로 많은 에러를 발생시키면 누적 페널티 포인트로 제재 → 단계적 격리.
에러 정의
- 정의: 프로토콜 규칙 위반 또는 송신 비트 ≠ 수신 비트.
- Transmission Error: (중재 단계와 ACK 비트 예외).
- Receive Error: (수신자는 bit monitoring 불가 → CRC로 감지).
송신자는 Tx-Rx 비교로 직접 감지 가능. 수신자는 의도된 값을 모르므로 CRC의 중복성으로 간접 감지.
6가지 에러 감지 메커니즘
| # | 메커니즘 | 조건 |
|---|---|---|
| 1 | Bit Monitoring | (중재·ACK 비트 예외) |
| 2 | ACK Check | 송신자가 ACK 슬롯에서 dominant 확인 (ACK=0) |
| 3 | Stuff Check | 동일 값 5비트 후 반전 비트 확인 (비트 스터핑) |
| 4 | CRC Check | 확인 — 실패 시 Negative ACK (Error Flag 아님) |
| 5 | Form Check | 고정 recessive 비트(DEL, EOF, ITM)가 모두 1인지 확인 |
| 6 | ACK Bit Monitoring | 한 수신자만 recessive ACK(=1)를 보내고 다른 수신자들이 dominant(=0)일 때, 전자는 ACK DEL 끝까지 대기 후 Error Frame |
Bit Monitoring의 예외
중재 구간(Arbitration Phase):
- 1을 보냈는데 0이 읽히면 → 에러 아님. 해당 노드는 전송 중단·수신 모드 전환(중재 패배).
- 0을 보냈는데 1이 읽히면 → Transmission Error.
Error Frame
에러 감지 시 송신자/수신자가 메시지를 중단·파괴·오염 표시하기 위해 송출하는 프레임.
구조
| 부분 | 크기 | 값 |
|---|---|---|
| Error Flag | 6 bit | dominant (0) |
| Error Delimiter | 8 bit | recessive (1) |
- Error Flag 6개 dominant 비트는 어느 위치에 끼어들든 stuff 규칙이나 EOF 포맷 규칙 중 하나를 위반. 모든 노드가 이를 감지 → 로컬 에러가 글로벌화되고 데이터 일관성 확보.
- 모든 노드가 에러 없이 수신하거나, 어느 노드도 수신하지 못하거나 둘 중 하나.
Primary vs Secondary Error Flag
여러 노드가 에러를 감지할 때 동일한 Error Flag를 중첩해서 송신:
- Primary Error Flag: 최초로 에러를 감지한 노드가 즉시 송출.
- Secondary Error Flag: Primary의 stuff 규칙 위반을 보고 다른 노드들이 이어서 송출 → Primary보다 1~6 비트 지연.
CRC Check만은 예외 — Error Flag 대신 Negative Acknowledgement(recessive ACK)로 신호.
에러 시나리오 3가지
시나리오 A: 수신자 없음 (No Receiver, No ACK)
- 노드 A만 버스에 있음. B, C, D 모두 비활성.
- A가 프레임 송신 → 어떤 수신자도 positive ACK 불가 → ACK=recessive 유지.
- A가 ACK Check 실패 감지 → ACK 다음 비트에서 Error Flag 송출 → Error Delimiter 이어짐.
- A는 dominant Error Flag → recessive Error Delimiter 전환을 Bit Monitoring으로 관찰 → 수신 에러가 아니라 수신자 부재라고 판단 → Fault Confinement 제재 완화.
시나리오 B: 모든 수신자가 Negative ACK (Negative ACK from all Receivers)
- B, C, D 모두 CRC 실패.
- ACK 슬롯에서 B/C/D가 모두 recessive ACK → A의 ACK Check 실패.
- A가 ACK 다음 비트부터 Primary Error Flag (6 dominant) + Error Delimiter (8 recessive) 송출.
- A의 Primary Error Flag가 ACK DEL(고정 recessive) 규칙을 위반 → B/C/D가 Form Check 실패 감지 → Secondary Error Flag 송출 (A보다 1 비트 늦음).
- A는 dominant→recessive 전환 시점이 지연된 것으로 이를 인지.
- B/C/D는 자신의 첫 Error Delimiter 비트가 버스에서도 recessive인 것으로 자신이 Primary를 보내지 않았다는 사실 확인.
시나리오 C: 로컬 수신 에러 (Local Receive Error)
- A 송신, C·D CRC 통과 / B CRC 실패.
- C, D는 dominant ACK(=0) 송출.
- B는 recessive ACK(=1) 송출 → 그러나 wired-AND로 dominant가 우선 → 버스에서는 dominant ACK 관찰.
- A는 ACK가 dominant이므로 ACK Check 통과 → 자신은 정상으로 간주.
- B만 ACK DEL 비트 다음에 Error Flag 송출 → 프레임 파괴, 재전송 트리거.
Fault Confinement
결함이 있는 노드를 버스에서 점진적으로 격리하는 메커니즘. 각 CAN Controller는 8-bit 카운터 2개를 운용.
| 카운터 | 원어 | 용도 |
|---|---|---|
| TEC | Transmission Error Counter | 송신 에러 카운팅 |
| REC | Receive Error Counter | 수신 에러 카운팅 |
상태 전이
| 상태 | 조건 |
|---|---|
| Error Active | and |
| Error Passive | or |
| Bus Off |
복귀 조건:
- Error Passive → Error Active: and
- Bus Off → Error Active: Software Reset + 128 × 11 recessive 비트 관찰
카운터 증감 규칙
TEC:
- 송신자가 Error Flag 송출 →
- 상태에서 Error Flag를 보냈으나 수신자가 없어 Error Flag가 recessive로 남으면 → 추가 증가 없음 (수신자 부재 상황 보호).
- 성공적인 전송 →
REC:
- Error Flag 송출 →
- 수신자가 원인 제공(Primary Error Flag 송출) →
- 성공적인 수신 →
Error Passive 노드의 SOF 지연
Error Passive 상태의 불이익:
- recessive Error Flag만 송출 가능 (버스 파괴력 약화).
- 버스 접근 지연: ITM 끝이 아니라 추가 8비트 지연 후 SOF 가능.
즉, Error Passive 노드는 Error Active 노드가 전송할 의사가 없는 경우에만 버스 접근 가능. Bus Off 노드는 버스 접근권 완전 박탈.
| 구간 | Error Active | Error Passive | Bus Off |
|---|---|---|---|
| ITM 직후 (idle 시작) | SOF 가능 | 대기 | 접근 불가 |
| 8 bit 추가 지연 후 | — | SOF 가능 | 접근 불가 |
ESI 비트 (CAN FD)
고전 CAN에서는 송신자가 자신의 에러 상태를 프레임 내에서 알릴 수단이 없었다. CAN FD는 ESI (Error State Indicator) 비트를 추가하여 모든 노드가 현재 송신자의 Fault Confinement 상태를 인지할 수 있게 한다.
| ESI 값 | 송신자 상태 |
|---|---|
| Dominant (0) | Error Active |
| Recessive (1) | Error Passive |