CAN: 차량용 버스의 원리
차동 두 선에서 ID가 낮은 메시지가 충돌 없이 먼저 나갑니다. 중재, 프레임 구조, 비트 타이밍, 에러 처리.
물리층
CAN_H, CAN_L 두 선의 차동 신호입니다. 차이가 약 2V면 우성(0), 거의 0V면 열성(1)입니다. 버스 양 끝에 120Ω 종단 저항을 둡니다(양 끝을 합쳐 60Ω이 측정되면 정상).
중재: 충돌 없이 순서 정하기
여러 노드가 동시에 보내기 시작하면, 비트를 보내면서 버스를 같이 읽습니다. 우성(0)이 열성(1)을 이기므로, 1을 보냈는데 0이 읽힌 노드는 즉시 물러납니다. 결과적으로 ID 숫자가 가장 작은 메시지가 손상 없이 먼저 나갑니다. 그래서 ID가 곧 우선순위입니다.
프레임 (표준)
| 필드 | 크기 |
|---|---|
| SOF | 1비트 |
| ID | 11비트 (확장 29비트) |
| 제어 (DLC) | 데이터 길이 0~8 |
| 데이터 | 0~8바이트 |
| CRC | 15비트 |
| ACK | 받은 노드 누구든 우성으로 응답 |
주소가 아니라 메시지 ID로 내용을 구분합니다. 받을 노드는 필터로 관심 있는 ID만 받습니다.
비트 타이밍
비트 하나를 시간 단위(TQ)로 나눠 동기 구간, 전파 구간, 위상 구간을 정하고 샘플링 포인트를 보통 75~87.5% 지점에 둡니다. 모든 노드의 샘플링 포인트가 비슷해야 안정됩니다.
에러 처리
에러를 낸 노드는 에러 카운터가 쌓여 Error Passive, 더 쌓이면 Bus Off로 스스로 버스에서 빠집니다. 고장 난 노드 하나가 버스 전체를 막지 않게 하는 장치입니다.