기록
[GPT가 알려주는] CAN 통신에서의 에러 처리 메커니즘 본문
좋은 질문이에요 👍
CAN 통신에서는 노드(ECU)가 오류를 얼마나 자주 발생시키느냐에 따라 3가지 에러 상태(Error States) 를 정의합니다. 이름은 정확히 말씀하신 대로 Error Active, Error Passive, Bus-Off 가 맞습니다. 각각 설명드릴게요:
1. Error Active 상태
- 정상 상태라고 보면 됩니다.
- 노드가 에러 카운터(Transmit Error Counter, Receive Error Counter) 를 관리하는데, 이 값이 아직 작을 때 유지됩니다.
- 이 상태에서는 노드가 오류를 감지하면 Error Frame(에러 플래그) 를 적극적으로(Active Error Flag, dominant level) 버스에 내보내서 다른 노드들이 인지할 수 있도록 합니다.
- 즉, "내가 오류를 봤다!" 하고 큰소리치는 단계예요.
2. Error Passive 상태
- 노드가 오류를 너무 많이 발생시켰다는 의미입니다.
- 에러 카운터가 임계값을 넘어가면 Error Passive 로 전환됩니다.
- 이 상태에서는 노드가 오류를 감지해도, Passive Error Flag (recessive level) 를 사용합니다.
- Passive Error Flag 는 dominant 신호보다 힘이 약해서, 버스에 크게 영향을 주지 못합니다.
- 즉, "나 또 오류 봤는데… 그냥 조용히 표시만 할게" 라는 느낌이에요.
3. Bus-Off 상태
- 가장 심각한 단계입니다.
- 노드의 Transmit Error Counter 가 255 이상이 되면 Bus-Off 로 진입합니다.
- Bus-Off 가 되면 그 노드는 CAN 버스에서 완전히 단절됩니다. (더 이상 프레임을 송수신하지 않음)
- 보통 소프트웨어나 하드웨어에서 Bus-Off 복구 절차(예: 128개의 연속된 버스 idle 상태 감지 후 자동 복귀, 혹은 재초기화)가 필요합니다.
- 즉, "얘는 너무 문제 많으니까 버스에서 퇴출!" 되는 상태예요.
✅ 정리
- Error Active: 정상, 에러시 적극적으로 플래그 전송 (dominant)
- Error Passive: 에러 많음, 조용히 플래그 전송 (recessive)
- Bus-Off: 버스에서 퇴출, 통신 불가
혹시 원하시면, 제가 에러 카운터 변화 규칙(전송 성공/실패할 때 TEC, REC 어떻게 변하는지)도 도표로 정리해드릴까요?
좋습니다 👍 이번에는 CAN 통신에서의 에러 처리 메커니즘을 “실무자 관점”에서 아주 상세히 풀어드릴게요. 강의에서 들으셨던 “Error Active / Error Passive / Bus-Off” 개념이 실제로 어떻게 동작하고, 개발자가 어떤 부분을 신경써야 하는지를 정리해드리겠습니다.
🔹 1. 기본 전제 – CAN의 에러 검출과 카운터
CAN 컨트롤러(하드웨어)는 프레임 전송/수신 중 오류를 스스로 검출합니다. 검출 방식은 다음과 같습니다:
- 비트 오류 (Bit Error): 송신한 비트와 버스에서 실제 감지한 비트가 다를 때
- CRC 오류: 수신한 CRC와 계산된 CRC가 다를 때
- 폼 오류 (Form Error): 프레임 형식이 규격에 맞지 않을 때
- ACK 오류: 송신자가 ACK 슬롯에서 dominant 신호를 받지 못했을 때
- 스텁 오류/비트 스터핑 오류: 5개 이상 같은 비트 연속 등
이때마다 에러 카운터를 올리거나 내리는데:
- TEC (Transmit Error Counter) : 송신 관련 오류에 반응
- REC (Receive Error Counter) : 수신 관련 오류에 반응
이 TEC/REC 값에 따라 상태가 자동으로 바뀝니다.
⚠️ 중요: 이 모든 과정은 CAN Controller가 알아서 합니다. CPU(소프트웨어)는 간섭 불가.
🔹 2. 상태 전이 (State Machine)
CAN 표준에서 정의한 상태 변화는 아래와 같습니다:
- Error Active
- 초기 상태. TEC < 128, REC < 128
- 오류 발생 시 Active Error Flag (dominant) 전송 → 버스 전체에 강력히 알림
- 정상 노드로 간주, 송신 우선순위도 그대로 유지
- Error Passive
- TEC ≥ 128 또는 REC ≥ 128 → Error Passive 진입
- 이 상태에서는 Passive Error Flag (recessive) 만 전송 가능
→ 다른 노드가 dominant 신호를 내보내면 가려져서 버스에 거의 영향 없음 - 송신 우선순위도 불리해짐 (최대한 방해 안 하도록)
- 즉, “문제 많은 노드 → 가능하면 조용히 해라” 상태
- Bus-Off
- TEC ≥ 256 → Bus-Off 진입
- 이 상태가 되면:
- 해당 노드는 버스에서 완전히 제외됨
- 송신 금지, 수신도 불가 (사실상 네트워크에서 격리됨)
- 컨트롤러 내부적으로 송신 회로를 차단해버림
🔹 3. 복구 메커니즘
- CAN 표준은 Bus-Off 복귀에 대해 크게 두 가지 방법을 정의/허용합니다:
- 자동 복귀: 일부 컨트롤러는 128개의 연속된 bus idle(버스가 조용한 상태)을 감지하면 자동으로 Active 상태로 복귀
- 소프트웨어 제어 복귀: 실무에서 더 많이 씀.
- 컨트롤러가 Bus-Off 상태를 CPU에게 인터럽트 등으로 알려줌
- CPU가 이를 인지 → 일정 시간(Recovery time) 대기 후
- CAN Controller를 Software Reset (레지스터 초기화, 모드 전환 등)
- 다시 초기화 & 정상 통신 참여
👉 강의에서 들으셨던 “실무자 입장에선 Bus-Off가 중요하다”는 말이 바로 이거예요.
Error Active/Passive는 컨트롤러 내부에서 알아서 왔다갔다 하기 때문에 크게 신경 안 써도 됩니다. Bus-Off → CPU가 대응해야 하는 상태니까 중요하게 다뤄야 합니다.
🔹 4. 개발자가 해야 할 일
- Bus-Off 인터럽트 처리
- CAN 컨트롤러는 Bus-Off 진입 시 이를 알리는 상태 플래그나 인터럽트를 발생시킴
- 소프트웨어는 반드시 이 이벤트를 캐치해야 함
- 복구 정책 구현
- 바로 Reset하지 않고, 일정 시간 기다린 뒤 Reset → 재통신 시도
- 이유: 고장난 배선/하드웨어 문제라면 즉시 재참여해도 또 에러가 나기 때문
- 흔히 “Bus-Off Recovery Timer” 를 두고, 수 초 단위 대기
- CAN Controller Reset & 재초기화
- 드라이버 레벨에서 CAN 컨트롤러를 SW Reset
- 비트 타이밍, 필터, 마스크 등 초기 설정 다시 적용
- 정상 모드(Normal Mode)로 전환 후 재참여
🔹 5. 실무적 관점 요약
- Error Active / Passive: 내부적으로 컨트롤러가 알아서 조정, CPU는 크게 개입할 필요 없음
- Bus-Off: 노드가 네트워크에서 쫓겨난 상태.
- CPU가 “Bus-Off 됐다”는 사실을 인지
- 대응 전략(대기 후 Reset, 재시도 횟수 제한, 로그 남기기 등)을 소프트웨어에서 구현해야 함
- 중요성: Bus-Off를 무시하면 → 특정 ECU가 죽어버리고, 통신 전체가 마비될 수 있음.
✅ 한 문장 요약:
CAN 컨트롤러는 에러 카운터에 따라 상태를 자동 관리하고, 개발자가 개입해야 하는 지점은 오직 Bus-Off 이후의 복구 로직이다.
혹시 제가 TEC/REC의 증가·감소 규칙 (예: 송신 성공 시 TEC 감소, 오류 시 증가) 도 표로 정리해드릴까요? 이 부분까지 알면 Bus-Off 발생 과정을 더 직관적으로 이해하실 수 있어요.
'잡동사니 > GPT가 알려주는' 카테고리의 다른 글
| [GPT가 알려주는] adb shell sync (0) | 2025.09.17 |
|---|---|
| [GPT가 알려주는] 사이드 로브와 백 로브 (0) | 2025.09.17 |
| [GPT가 알려주는] 다형성 (0) | 2025.09.16 |
| [GPT가 알려주는] 다형성과 C++ virtual 키워드 (0) | 2025.09.16 |
| [GPT가 알려주는] gcc/g++ 컴파일러 설치 (0) | 2025.09.16 |