CAN 중재 시뮬레이션
여러 제어기가 같은 순간에 CAN 버스로 보내기 시작하면 누가 먼저 보내는지 비트 단위로 봅니다. ID가 작을수록 이기는 이유, 진 쪽이 프레임을 깨뜨리지 않고 물러나는 과정을 직접 확인합니다.
CAN BUS비어 있음동시에 전송을 누르세요
0 (도미넌트)지금 겨루는 비트진 제어기
3D 장면을 불러오는 중입니다
조작
버스 파형 ID 11비트
위 세 줄이 각 제어기가 낸 값, 맨 아래가 버스 값입니다. 빨간 표시가 진 순간입니다.
측정
- 이번에 이긴 제어기
- -
- 승부가 난 비트
- -
- 전송 순서
- -
- 남은 제어기
- 3
이렇게 해 보세요
- 제어기 세 개가 선 두 가닥(CAN_H, CAN_L)을 같이 씁니다. 각 제어기 앞의 작은 칸 11개가 보내려는 메시지의 ID 비트입니다. 밝은 칸이 0, 어두운 칸이 1입니다.
- 동시에 전송을 누르세요. 세 제어기가 ID를 위 비트부터 한 비트씩 내보냅니다. 맨 아래 줄이 버스에 실제로 나타난 값입니다.
- 버스에서는 0이 1을 이깁니다. 한 제어기라도 0을 내면 버스는 0이 됩니다. 1을 냈는데 버스가 0이면 그 제어기는 졌다는 것을 알고 바로 보내기를 멈춥니다.
- 끝까지 남은 제어기가 데이터를 마저 보냅니다. 진 제어기들은 버스가 비면 자동으로 다시 겨룹니다. "전송 순서"에 ID가 작은 순서대로 쌓입니다.
- ID를 바꿔 보세요. 숫자가 작을수록 위쪽 비트에 0이 많아 먼저 이깁니다. 그래서 CAN에서는 급한 메시지에 작은 ID를 줍니다.
- 두 제어기에 같은 ID를 주면 중재가 끝나도 승부가 나지 않습니다. 실제 버스에서는 그 뒤 데이터에서 충돌해 오류가 납니다. 한 버스에서 ID가 겹치면 안 되는 이유입니다.
읽는 법
CAN 버스의 0을 도미넌트, 1을 리세시브라고 부릅니다. 도미넌트는 두 선의 전압을 벌려 놓고, 리세시브는 아무것도 하지 않습니다. 그래서 누군가 도미넌트를 내면 버스 전체가 도미넌트가 됩니다.
제어기는 보내면서 동시에 버스를 읽습니다. 자기가 낸 값과 버스 값이 다르면 물러납니다. 이긴 쪽의 프레임은 한 비트도 깨지지 않으므로 다시 보낼 필요가 없습니다.
이 실험실은 11비트 표준 ID의 중재 구간만 다룹니다. 비트 스터핑, CRC, ACK는 생략했습니다.
자세한 설명은 CAN 노트에 있습니다.