그라운드 임베디드 EN 유튜브 구독

노트 / 통신 프로토콜

CAN: 차량용 버스의 원리

차동 두 선에서 ID가 낮은 메시지가 충돌 없이 먼저 나갑니다. 중재, 프레임 구조, 비트 타이밍, 에러 처리.

GROUND EMBEDDED · 정리 노트통신 06CAN 1비트 시간 = (1 + TSEG1 + TSEG2) × tq 2샘플 지점 = (1 + TSEG1) / (1 + TSEG1 + TSEG… 3예) tq 16개: TSEG1 = 12, TSEG2 = 3 → 13…

물리층

CAN_HCAN_L읽는 비트1001011001
우성(0)일 때는 두 선의 전압이 벌어지고, 열성(1)일 때는 같아집니다. 수신기는 두 선의 차이만 봅니다.

CAN_H, CAN_L 두 선의 차동 신호입니다. 차이가 약 2V면 우성(0), 거의 0V면 열성(1)입니다. 버스 양 끝에 120Ω 종단 저항을 둡니다(양 끝을 합쳐 60Ω이 측정되면 정상).

중재: 충돌 없이 순서 정하기

여러 노드가 동시에 보내기 시작하면, 비트를 보내면서 버스를 같이 읽습니다. 우성(0)이 열성(1)을 이기므로, 1을 보냈는데 0이 읽힌 노드는 즉시 물러납니다. 결과적으로 ID 숫자가 가장 작은 메시지가 손상 없이 먼저 나갑니다. 그래서 ID가 곧 우선순위입니다.

프레임 (표준)

SOFID11비트 · 중재제어DLC데이터0 ~ 8바이트CRC15비트ACKEOF
표준 데이터 프레임. 앞쪽 ID 구간에서 중재가 일어납니다.
필드 크기
SOF 1비트
ID 11비트 (확장 29비트)
제어 (DLC) 데이터 길이 0~8
데이터 0~8바이트
CRC 15비트
ACK 받은 노드 누구든 우성으로 응답

주소가 아니라 메시지 ID로 내용을 구분합니다. 받을 노드는 필터로 관심 있는 ID만 받습니다.

비트 타이밍

비트 하나를 시간 단위(TQ)로 나눠 동기 구간, 전파 구간, 위상 구간을 정하고 샘플링 포인트를 보통 75~87.5% 지점에 둡니다. 모든 노드의 샘플링 포인트가 비슷해야 안정됩니다.

에러 처리

에러를 낸 노드는 에러 카운터가 쌓여 Error Passive, 더 쌓이면 Bus Off로 스스로 버스에서 빠집니다. 고장 난 노드 하나가 버스 전체를 막지 않게 하는 장치입니다.

그림으로 보기: 중재

노드 A노드 B버스SOFID10ID9ID8ID7ID6ID5 갈림B 물러남
두 노드가 동시에 보내기 시작합니다. 0(도미넌트)이 1(리세시브)을 이기므로, ID5에서 0을 낸 A(ID가 더 작은 쪽)가 버스를 차지하고 B는 물러나 다음 기회를 기다립니다.

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는 로직 신호입니다. 반드시 트랜시버 칩을 거쳐야 합니다.
  • 그라운드 미연결: 차동 신호라도 공통 그라운드 기준은 필요합니다.
3D 실험실에서 직접 돌려 보기값을 바꾸며 이 노트의 원리를 확인합니다→영상으로 이어 보기통신 시리즈 13편UART 통신 완벽정리 | 전기전자, 전자과, 임베디드 개발자 필수 시청PROJECT COURSEI2C로 MPU6050을, UART로 블루투스 모듈을 직접 붙여 보고 싶다면밸런싱 로봇 하나를 요구사항, 회로와 PCB, 펌웨어, 앱까지 실무 순서대로 만드는 강의입니다. 10파트 165강.강의 살펴보기 →FREE PDF무료 전자책 3권 받기이 주제를 한 권으로 이어서 읽고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →