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

실험실

CAN 중재 시뮬레이션

여러 제어기가 같은 순간에 CAN 버스로 보내기 시작하면 누가 먼저 보내는지 비트 단위로 봅니다. ID가 작을수록 이기는 이유, 진 쪽이 프레임을 깨뜨리지 않고 물러나는 과정을 직접 확인합니다.

조작

버스 파형 ID 11비트

위 세 줄이 각 제어기가 낸 값, 맨 아래가 버스 값입니다. 빨간 표시가 진 순간입니다.

측정

이번에 이긴 제어기
-
승부가 난 비트
-
전송 순서
-
남은 제어기
3

이렇게 해 보세요

  1. 제어기 세 개가 선 두 가닥(CAN_H, CAN_L)을 같이 씁니다. 각 제어기 앞의 작은 칸 11개가 보내려는 메시지의 ID 비트입니다. 밝은 칸이 0, 어두운 칸이 1입니다.
  2. 동시에 전송을 누르세요. 세 제어기가 ID를 위 비트부터 한 비트씩 내보냅니다. 맨 아래 줄이 버스에 실제로 나타난 값입니다.
  3. 버스에서는 0이 1을 이깁니다. 한 제어기라도 0을 내면 버스는 0이 됩니다. 1을 냈는데 버스가 0이면 그 제어기는 졌다는 것을 알고 바로 보내기를 멈춥니다.
  4. 끝까지 남은 제어기가 데이터를 마저 보냅니다. 진 제어기들은 버스가 비면 자동으로 다시 겨룹니다. "전송 순서"에 ID가 작은 순서대로 쌓입니다.
  5. ID를 바꿔 보세요. 숫자가 작을수록 위쪽 비트에 0이 많아 먼저 이깁니다. 그래서 CAN에서는 급한 메시지에 작은 ID를 줍니다.
  6. 두 제어기에 같은 ID를 주면 중재가 끝나도 승부가 나지 않습니다. 실제 버스에서는 그 뒤 데이터에서 충돌해 오류가 납니다. 한 버스에서 ID가 겹치면 안 되는 이유입니다.

읽는 법

CAN 버스의 0을 도미넌트, 1을 리세시브라고 부릅니다. 도미넌트는 두 선의 전압을 벌려 놓고, 리세시브는 아무것도 하지 않습니다. 그래서 누군가 도미넌트를 내면 버스 전체가 도미넌트가 됩니다.

제어기는 보내면서 동시에 버스를 읽습니다. 자기가 낸 값과 버스 값이 다르면 물러납니다. 이긴 쪽의 프레임은 한 비트도 깨지지 않으므로 다시 보낼 필요가 없습니다.

이 실험실은 11비트 표준 ID의 중재 구간만 다룹니다. 비트 스터핑, CRC, ACK는 생략했습니다.

자세한 설명은 CAN 노트에 있습니다.

FREE PDF무료 전자책 3권 받기돌려 본 원리를 글로 정리해 두고 싶다면. BLDC 모터 제어, 직렬통신, 센서를 책 분량으로 묶었습니다. 이메일만 남기면 바로 받습니다.무료로 받기 →