null
vuild_
Nodes
Flows
Hubs
Login
MENU
GO
Notifications
Login
⌂
CAN 통신 실전 입문 — 이론부터 Vector 드라이버 설정까지
Structure
can-basics
•
CAN 통신이란 — 탄생 배경과 버스 구조
bit-timing
•
CAN Bit Timing — Prescaler·SJW·BS1·BS2 계산법
transceiver
•
CAN 트랜시버 — TLE9251V로 보는 핀, 모드, 설계 포인트
vector-driver-choice
•
Vector 드라이버 선택 — XL-Driver vs PassThru
xl-driver-setup
•
Vector XL-Driver 실전 설정 — 포트, 이더넷 모드, 주의사항
troubleshooting
•
Vector 드라이버 트러블슈팅 — 버전 미스매치와 Network 모드 불가
can-hw-filter
•
CAN 하드웨어 메시지 필터 — 원하는 ID만 골라받기
dbc-file
•
DBC 파일과 CANdb++ — CAN 메시지 데이터베이스 읽기
uds-on-can
•
UDS 진단 프로토콜 — CAN 위에서 ECU를 제어하는 방법
Flow Structure
CAN 통신이란 — 탄생 배경과 버스 구조
2 / 9
CAN 트랜시버 — TLE9251V로 보는 핀, 모드, 설계 포인트
☆ Star
↗ Full
CAN Bit Timing — Prescaler·SJW·BS1·BS2 계산법
#can
#bit-timing
#prescaler
#sjw
#bs1
@devpc
|
2026-05-06 05:25:45
|
GET /api/v1/flows/28/nodes/555?fv=1&nv=1
Context:
Flow v1
→
Node v1
0
Views
1
Calls
# CAN Bit Timing — Prescaler·SJW·BS1·BS2 계산법 ## Bit Timing이 왜 필요한가 CAN 버스에 연결된 노드들은 서로 다른 클럭 소스를 쓸 수 있다. 클럭이 조금씩 달라도 같은 순간에 같은 비트를 읽어야 통신이 가능하다. **Bit Timing**은 이 "언제 샘플링할지"를 정의하는 규칙이다. CAN 컨트롤러는 한 비트를 여러 개의 **Time Quantum(Tq)**으로 잘게 쪼갠다. 그리고 그 Tq들을 세 구간으로 나눈다. ``` ┌────────┬─────────────┬─────────┐ │ SYNC │ Bit Seg 1 │ Bit Seg2│ │ (1Tq) │ (BS1 Tqs) │(BS2 Tqs)│ └────────┴─────────────┴─────────┘ ↑ Sample Point (BS1 끝) ``` ## 네 가지 파라미터 MCU의 CAN 레지스터를 설정할 때 반드시 정해야 하는 값이 네 개다. | 파라미터 | 역할 | |---------|------| | **Prescaler** | 시스템 클럭을 몇 분주해서 Tq를 만들지 | | **SJW** (Synchronization Jump Width) | 클럭 오차 허용 범위. 값이 클수록 더 큰 오차 허용 | | **BS1** (Bit Segment 1) | Sync 이후 샘플링까지의 Tq 수 | | **BS2** (Bit Segment 2) | 샘플링 이후 다음 비트 시작까지의 Tq 수 | SJW 설정 가이드: - `SJW = 1` → 같은 레이어, 고속, 유사한 발진기끼리 - `SJW = 4` → 혼합 레이어, 저속, 서로 다른 발진기 ## 실제 계산 예시 (42MHz MCU, 500kbps 목표) ``` PHB1 클럭: 42 MHz 클럭 디바이더 (Prescaler): 7 → Tq 시간 = 1 / (42 MHz / 7) = 166.67 ns 목표 BPS: 500 kbps → 1 Bit Time = 1 / 500 kbps = 2 μs → 최대 Tq 개수 = 2 μs / 166.67 ns = 12 Tq Sample Point 목표: 75% → BS2 = 12 × (1 - 0.75) = 3 Tq → BS1 = 12 - 1 (SYNC) - 3 (BS2) = 8 Tq → SJW = 1 Tq (전달 지연이 크지 않은 환경) ``` 결과값: `Prescaler=7, BS1=8, BS2=3, SJW=1` Sample Point는 **75%~87.5%** 구간을 목표로 잡는 경우가 많다. 버스 길이가 길거나 노드가 많을수록 낮은 쪽(75% 부근)이 안전하다. ## 직접 계산보다 사이트 활용 Bit Timing 계산은 이해가 중요하지 매번 손으로 풀 필요는 없다. 아래 사이트에 클럭과 목표 속도만 입력하면 자동으로 권장값을 준다. **[http://www.bittiming.can-wiki.info/](http://www.bittiming.can-wiki.info/)** MCU 종류별로 필드가 구분되어 있어 바로 적용 가능한 레지스터 값을 얻을 수 있다. ## STM32 HAL 코드로 적용하는 방법 STM32CubeHAL에서는 CAN 초기화 구조체에 파라미터를 직접 넣는다. ```c CAN_HandleTypeDef hcan1; hcan1.Instance = CAN1; hcan1.Init.Prescaler = 7; /* 시스템 클럭 분주비 */ hcan1.Init.Mode = CAN_MODE_NORMAL; hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; /* SJW = 1 Tq */ hcan1.Init.TimeSeg1 = CAN_BS1_8TQ; /* BS1 = 8 Tq */ hcan1.Init.TimeSeg2 = CAN_BS2_3TQ; /* BS2 = 3 Tq */ hcan1.Init.TimeTriggeredMode = DISABLE; hcan1.Init.AutoBusOff = ENABLE; hcan1.Init.AutoWakeUp = DISABLE; hcan1.Init.AutoRetransmission = ENABLE; hcan1.Init.ReceiveFifoLocked = DISABLE; hcan1.Init.TransmitFifoPriority = DISABLE; if (HAL_CAN_Init(&hcan1) != HAL_OK) { Error_Handler(); } ``` `AutoBusOff = ENABLE` 설정은 중요하다. Bus Off 상태가 되었을 때 자동으로 복구 절차를 시작한다. 이를 꺼두면 소프트웨어에서 명시적으로 복구해야 한다. ## CAN FD의 이중 Bit Timing CAN FD는 **Arbitration Phase**와 **Data Phase**에서 서로 다른 속도를 쓴다. 그 결과 Bit Timing도 두 세트를 설정해야 한다. ``` Arbitration Phase: 느린 속도 (예: 500 kbps) → 표준 CAN과 동일하게 Prescaler·BS1·BS2·SJW 설정 Data Phase: 빠른 속도 (예: 2 Mbps) → FD 전용 레지스터: DataPrescaler·DataSyncJumpWidth·DataTimeSeg1·DataTimeSeg2 ``` STM32H7 기준 예: ```c FDCAN_InitTypeDef fdcanConfig; fdcanConfig.NominalPrescaler = 5; /* Arbitration Phase */ fdcanConfig.NominalSyncJumpWidth = 1; fdcanConfig.NominalTimeSeg1 = 14; fdcanConfig.NominalTimeSeg2 = 4; fdcanConfig.DataPrescaler = 1; /* Data Phase */ fdcanConfig.DataSyncJumpWidth = 4; fdcanConfig.DataTimeSeg1 = 13; fdcanConfig.DataTimeSeg2 = 2; ``` Data Phase의 Sample Point는 Arbitration Phase보다 높게(80~85%) 잡는 경우가 많다. 전파 지연이 짧은 구간이기 때문이다. ## 흔한 실수 — Sample Point 불일치 버스에 연결된 두 노드가 서로 다른 Sample Point를 사용하면 가끔씩 메시지가 깨지는 증상이 나타난다. 비트레이트는 같아도 샘플링 타이밍이 달라 가장자리 비트를 엉뚱하게 읽는 것이다. 예방법은 간단하다: **같은 버스에 연결된 모든 노드의 Bit Timing 설정을 통일**한다. CANoe나 CANalyzer로 버스를 모니터링할 때도 동일한 Bit Timing을 잡아야 정상적으로 보인다. ## 다음 챕터에서는 소프트웨어에서 Bit Timing을 맞췄다면, 이번엔 버스 라인에 직접 연결되는 하드웨어 — **CAN 트랜시버**를 살펴본다.
CAN 통신이란 — 탄생 배경과 버스 구조
CAN 트랜시버 — TLE9251V로 보는 핀, 모드, 설계 포인트
// COMMENTS
Newest First
ON THIS PAGE
No content selected.