Controller Area Network. 이 시스템의 노드 간 주 통신 수단이다.
UART 와 결정적으로 다른 점
| UART | CAN | |
|---|---|---|
| 연결 | 점대점 (1:1) | 버스 (여러 노드) |
| 주소 | 없음 | 메시지 ID |
| 프레임 경계 | 직접 만들어야 함 | 하드웨어가 준다 |
| 오류 검출 | 직접 | CRC·ACK 내장 |
| 충돌 처리 | 없음 | 비파괴 아비트레이션 |
| 노이즈 | 약함 (단선 기준) | 강함 (차동 신호) |
차동 신호라 노이즈에 강하다
CAN_H 와 CAN_L 두 선의 전압 차이로 비트를 읽는다. 외부 노이즈는 두 선에 똑같이 실리므로 차이를 빼면 상쇄된다. 모터·인버터가 돌아가는 차량 환경에서 이게 결정적이다.
비파괴 아비트레이션
여러 노드가 동시에 송신하면 ID 를 비트 단위로 비교해 작은 쪽이 그대로 버스를 가져간다. 진 쪽은 물러났다가 다시 시도한다. 이더넷의 충돌 재전송과 달리 이긴 프레임은 손상되지 않는다.
그래서 ID 배정이 곧 우선순위 설계가 된다 — pinch_event 를 0x010 에 두는 이유(CAN ID 우선순위 참고).
이 프로젝트의 구성
Central ↔ Power Window / Function / Sensing CAN
Central ↔ ESP32 TBD-001 (CAN 후보)
Sensing ↔ Raspberry Pi UART/SPI (TBD-003)
버스 부하는 500 kbps 기준 약 2.8 % 로 대단히 여유롭다. CAN FD 가 필요 없다는 근거가 된다.
CRC 가 있는데 왜 E2E 를 또 하나
CAN CRC 는 버스 구간만 보호한다. 송신 앱 → 송신 버퍼, 수신 버퍼 → 수신 앱 구간의 메모리 손상·인코딩 실수는 못 잡는다. 그래서 E2E 보호를 애플리케이션 레벨에서 따로 얹는다.