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로 스스로 버스에서 빠집니다. 고장 난 노드 하나가 버스 전체를 막지 않게 하는 장치입니다.
그림으로 보기: 중재
CAN에서 0은 버스를 적극적으로 구동하는 상태(도미넌트), 1은 놓아둔 상태(리세시브)입니다. 각 노드는 보내면서 동시에 버스를 읽고, 자기가 1을 냈는데 0이 읽히면 다른 노드가 더 급한 메시지를 보내는 중이라고 판단해 즉시 멈춥니다. 그래서 충돌이 나도 데이터가 깨지지 않고, ID 숫자가 작을수록 우선순위가 높습니다.
프레임 구조
| 필드 | 길이 | 역할 |
|---|---|---|
| SOF | 1비트 | 시작 |
| ID | 11비트 (확장 29비트) | 메시지 종류이자 우선순위 |
| DLC | 4비트 | 데이터 길이 0~8 |
| 데이터 | 0~8바이트 | 내용 |
| CRC | 15비트 | 오류 검출 |
| ACK | 1비트 | 받은 노드 누구든 0으로 덮어 응답 |
ID는 받는 쪽 주소가 아니라 "이 메시지가 무엇인가"입니다. 엔진 회전수 메시지는 모든 노드가 듣고, 필요한 노드만 필터로 골라 받습니다.
3D 실험실여기까지 읽은 내용을 직접 돌려 볼 수 있습니다→배선: 양 끝에 120 Ω
CAN_H와 CAN_L 두 선의 전압 차이로 신호를 보냅니다. 버스의 양 끝에 120 Ω 종단 저항을 하나씩 달아야 신호가 반사되지 않습니다. 전원을 끄고 CAN_H와 CAN_L 사이 저항을 재서 약 60 Ω이면 정상(120 Ω 두 개가 병렬)입니다. 120 Ω이 나오면 한쪽이 빠졌고, 40 Ω이면 세 개가 달린 것입니다.
비트 타이밍
모든 노드가 같은 속도와 비슷한 샘플 지점을 써야 합니다. 500 kbps에 샘플 지점 80% 안팎이 흔한 설정입니다.
비트 시간 = (1 + TSEG1 + TSEG2) × tq
샘플 지점 = (1 + TSEG1) / (1 + TSEG1 + TSEG2)
예) tq 16개: TSEG1 = 12, TSEG2 = 3 → 13/16 = 81.25%
오류 처리와 버스 오프
송신에 실패할 때마다 송신 오류 카운터가 올라가고, 255를 넘으면 그 노드는 스스로 버스에서 빠집니다(버스 오프). 고장 난 노드 하나가 전체 통신을 막지 못하게 하는 장치입니다.
현업에서 자주 터지는 문제
- 혼자서는 송신이 안 됨: ACK를 줄 다른 노드가 없으면 같은 프레임을 계속 재전송합니다. 테스트할 때는 최소 두 노드가 필요하거나 루프백 모드를 씁니다.
- 한쪽만 속도가 다름: 오류 프레임이 쏟아지고 모든 노드의 통신이 느려집니다.
- 트랜시버 없이 MCU 핀을 직접 연결: CAN 컨트롤러의 TX/RX는 로직 신호입니다. 반드시 트랜시버 칩을 거쳐야 합니다.
- 그라운드 미연결: 차동 신호라도 공통 그라운드 기준은 필요합니다.
영상으로 이어 보기통신 시리즈 13편UART 통신 완벽정리 | 전기전자, 전자과, 임베디드 개발자 필수 시청PROJECT COURSEI2C로 MPU6050을, UART로 블루투스 모듈을 직접 붙여 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →