CAN-FD
AVS300 은 CAN 채널 2개(can0·can1)를 장비 후면 COM 단자로 내보냅니다.
단자로 나오는 두 채널에는 TI TCAN1044(CAN FD 지원) 트랜시버가 실장되어 있고,
종단 저항 120Ω 은 딥스위치로 채널별로 켤 수 있습니다.
단자 위치 — 후면 COM 블록
후면에는 단자 블록이 두 개 있습니다. CAN 은 위쪽 COM 블록의 오른쪽 열입니다
(아래쪽 IN/OUT 블록은 카메라 외부 동기 입력·디지털 IO 용입니다).
| 테두리 | 단자 | 신호 |
|---|---|---|
| 🔴 빨강 | CAN0L · CAN0H | can0 차동 한 쌍 |
| 🟢 초록 | GND | 접지 기준 (아래 참고) |
| 🔵 파랑 | CAN1L · CAN1H | can1 차동 한 쌍 |
같은 COM 블록의 왼쪽 열(232R·232T·GND·485A·485B)은 RS-232 / RS-485 이며 CAN 과 무관합니다.
CAN 은 차동 신호라 짧은 배선에서는 두 가닥(H·L)만으로도 통신됩니다. 다만 노드끼리 접지 전위가
크게 다르면 공통모드 범위를 벗어나므로, 서로 다른 전원을 쓰는 장비와 연결할 때는 GND 를 함께 잇는 것을 권장합니다.
종단 저항 — 딥스위치 SW6
| 딥스위치 | 종단되는 채널 |
|---|---|
| 1번 | can1 |
| 2번 | can0 |
can0 을 종단하려면 2번을 켜야 합니다. OFF 면 그 채널에는 종단 저항이 없습니다.
종단은 버스의 물리적 양 끝에 정확히 2개만 있어야 합니다.
- AVS300 이 버스의 끝단이면 → 해당 채널 스위치 ON
- AVS300 이 중간 노드면 → OFF (켜면 세 번째 종단이 되어 버스를 망칩니다)
- 장비 두 대만 케이블로 직결해 시험할 때는 → 양쪽 ON
링크 올리기
# 인터페이스 확인
ip -brief link show can0 can1
# 500 kbit/s 로 올리기 (클래식 CAN)
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 loopback off fd off berr-reporting on restart-ms 0
sudo ip link set can0 up
sudo ip link set can1 down
sudo ip link set can1 type can bitrate 500000 loopback off fd off berr-reporting on restart-ms 0
sudo ip link set can1 up
# 상태 확인 — ERROR-ACTIVE 이고 LOOPBACK 플래그가 없어야 정상입니다
ip -details link show can0
loopback off fd off 를 반드시 명시하십시오SocketCAN 의 loopback·fd 플래그는 링크를 내리고 다시 설정해도 남습니다.
loopback 이 켜진 채로 cansend 하면 프레임이 컨트롤러 내부에서 그대로 돌아와 에러 0으로 보입니다 —
케이블이 빠져 있어도, 버스가 죽어 있어도 정상처럼 보입니다.
판정은 ip -details link show can0 출력의 can <...> 플래그로 하십시오. 여기에 LOOPBACK 이 있으면
그 시험 결과는 버스에 대해 아무것도 증명하지 않습니다.
CAN FD — 데이터 구간 비트율
CAN FD 는 중재 구간(ID·중재)과 데이터 구간을 서로 다른 비트율로 보냅니다.
데이터 구간 비트율은 dbitrate 로 지정하고, 배선·종단 요구사항은 클래식 CAN 과 같습니다.
sudo ip link set can0 down
sudo ip link set can0 type can bitrate 500000 dbitrate 2000000 fd on berr-reporting on restart-ms 0
sudo ip link set can0 up
# 확인 — 플래그에 FD 가 있고 dbitrate 가 지정한 값이어야 합니다
ip -details link show can0
dbitrate 를 설정해 두어도, BRS(Bit Rate Switch) 비트가 없는 프레임은 데이터 구간까지 중재 비트율로
나갑니다. cangen 에서는 -b, 응용 프로그램에서는 CANFD_BRS 플래그입니다.
받은 프레임에 BRS 가 실제로 섰는지는 candump -x 로 봅니다 — 플래그 칸의 B 가 BRS 입니다.
can1 RX B - 123 [64] ... ← BRS 켜짐 (데이터 구간이 dbitrate 로 전환됨)
can1 RX - - 123 [64] ... ← BRS 없음 (64바이트를 중재 비트율로 보냈다)
🔴 BRS 가 없어도 통신은 성공합니다 — 느려지기만 합니다. 그래서 "잘 되는데 느리다" 는 증상이 나오면 에러를 찾기 전에 이 플래그부터 확인하십시오.
실측값
can0↔can1 직결, 64바이트 FD 프레임(BRS 켬), 각 방향 100 프레임:
| 데이터 구간 | dsample-point | 결과 | 프레임당 버스 시간 |
|---|---|---|---|
| 2 Mbit/s | 0.750 | 100 / 100 양방향 · 에러 0 | 340 µs |
| 5 Mbit/s | 0.750 | 100 / 100 양방향 · 에러 0 | — |
| 8 Mbit/s | 0.600 | 100 / 100 양방향 · 에러 0 | 127 µs |
| 8 Mbit/s (BRS 끔) | — | 100 / 100 · 에러 0 | 1,188 µs |
마지막 두 줄이 BRS 의 효과입니다 — 같은 설정·같은 64바이트인데 9배 차이가 납니다 (BRS 가 없으면 데이터 512비트를 500 kbit/s 로 보내기 때문입니다).
dsample-point 는 ip 가 자동으로 고른 값입니다(8 Mbit/s 에서 0.600). 위 값은 짧은 케이블 2노드
기준이며, 실제 버스에서 쓸 수 있는 최고 데이터 비트율은 케이블 길이·분기·종단이 정합니다 —
길이가 늘면 8 Mbit/s 는 통하지 않을 수 있습니다. 프레임당 시간은 수신측 프레임 간격으로 측정했습니다.
통신 확인
두 채널을 케이블로 서로 연결하면 장비 한 대로 확인할 수 있습니다
(CAN0H↔CAN1H, CAN0L↔CAN1L, 딥스위치 1·2번 모두 ON).
# 수신 쪽 (터미널 1)
candump can1
# 송신 쪽 (터미널 2) — 100 프레임
cangen can0 -I 123 -L 8 -n 100 -g 2
# 또는 한 프레임만
cansend can0 123#DEADBEEF
아래는 사내 실측값입니다 — can0↔can1 을 짧은 케이블로 직결하고 클래식 CAN(fd off)으로 시험했습니다.
CAN FD 쪽 실측은 CAN FD — 데이터 구간 비트율에 있습니다.
| 비트율 | 방향 | 결과 |
|---|---|---|
| 500 kbit/s | can0 → can1 | 100 / 100 수신 · 에러 0 |
| 500 kbit/s | can1 → can0 | 100 / 100 수신 · 에러 0 |
| 1 Mbit/s | can0 → can1 | 100 / 100 수신 · 에러 0 |
| 1 Mbit/s | can1 → can0 | 100 / 100 수신 · 에러 0 |
200 프레임을 연속 전송했을 때 에러 프레임 0건, berr-counter tx 0 rx 0, 상태 ERROR-ACTIVE 였습니다.
에러를 읽는 법
에러 프레임을 보려면 마스크를 붙여야 합니다. -e can0 만으로는 잡히지 않습니다.
아래 상태값은 restart-ms 0(자동 재시작 없음) 기준입니다. restart-ms 를 주면 컨트롤러가
스스로 복구를 반복하므로 상태가 한곳에 머물지 않습니다 — 진단할 때는 0 으로 두십시오.
candump -e can0,0:0,'#FFFFFFFF'
| 나오는 것 | 뜻 | 조치 |
|---|---|---|
| 에러 프레임 없음 · 수신됨 | 정상 | — |
protocol-violation{{}{acknowledge-delimiter}} + bus-error→ ERROR-PASSIVE | 정상입니다. 프레임은 제대로 나갔고 응답할 상대가 버스에 없을 뿐입니다 | 상대 노드를 연결하십시오 |
tx-dominant-bit-error | 🔴 물리단 고장. 보낸 신호가 트랜시버를 통해 되돌아오지 않습니다 | 아래 참조 |
tx-dominant-bit-error 가 나오면배선(H·L 반대로 연결·단선·단락)을 먼저 확인하고, 배선이 맞다면 장비의 이미지 판을 확인하십시오.
. /etc/avs-release && echo "$AVS_RELEASE"
r39.2.1-20260916 이상이면 정상입니다. 그보다 이전 이미지를 쓰는 장비에서는 can0 이 이 증상을
보일 수 있습니다. 이 문제의 수정은 부트로더 영역에 있어 운영체제에서 고칠 수 없습니다 —
최신 이미지로 다시 플래시해야 반영됩니다.
문제 해결
| 증상 | 확인할 것 |
|---|---|
| 에러 없이 너무 잘 된다 | ip -details link show 에 LOOPBACK 플래그가 남아 있지 않은지 |
| CAN FD 인데 기대만큼 안 빠르다 | 보내는 프레임에 BRS 가 켜져 있는지 — candump -x 의 플래그 칸에 B 가 있어야 합니다. 없으면 데이터 구간도 중재 비트율로 나갑니다 |
| FD 프레임을 받는 쪽이 못 읽는다 | 양쪽 dbitrate 와 fd on 이 같은지. 한쪽만 FD 면 통신되지 않습니다 |
| 통신은 되는데 에러가 간간이 난다 | 종단 저항 개수 — 버스 전체에 정확히 2개인지 (SW6 번호가 채널과 어긋납니다) |
| 비트율을 바꿨는데 반영이 안 된다 | 링크를 내린 뒤 type can 설정을 다시 주고 올려야 합니다 |
ERROR-PASSIVE 에서 안 돌아온다 | 링크를 내렸다 올리십시오. restart-ms 100 을 주면 자동 복구합니다 |