CAN 버스의 전송률(baudrate)은 모든 노드에 동일하게 설정되지만, 개별 노드의 오실레이터에는 미세한 오차가 있어 시간이 지날수록 송신 노드와 수신 노드의 비트 경계가 어긋난다. 이를 방치하면 수신 노드가 엉뚱한 시점에 버스 값을 읽어 비트를 잘못 해석하게 되므로, CAN 컨트롤러는 프레임이 시작되는 시점과 각 비트를 읽어야 할 시점을 계속 다시 맞춰야 한다[1]. 이 절차의 정본은 ISO 11898 Part 1이 규정하는 비트 타이밍 규칙이다.
Nominal Bit Time의 세그먼트 구성
명목 비트 시간(Nominal Bit Time)은 SYNC_SEG·PROP_SEG·PHASE_SEG1·PHASE_SEG2 네 세그먼트로 나뉘고, 각 세그먼트의 길이는 오실레이터 주기에서 파생되는 최소 시간 단위인 time quantum(tq)의 정수 배로 설정된다. 버스 값을 읽어 비트 값을 확정하는 Sample Point는 PHASE_SEG1이 끝나는 지점에 있다[1].
- SYNC_SEG: 길이가 항상 1tq로 고정되며, 버스가 동기 상태라면 신호 edge가 이 구간 안에 있어야 한다[1].
- PROP_SEG: 노드 간 신호 전파와 트랜시버 응답 지연을 보상하는 구간이다(다음 절 참고)[1].
- PHASE_SEG1·PHASE_SEG2: edge의 위상 오차를 흡수하는 구간으로, 재동기화에 따라 늘어나거나 줄어든다[1].
실제 CAN 컨트롤러는 이 네 세그먼트를 그대로 노출하지 않고, PROP_SEG와 PHASE_SEG1을 합친 TSEG1, PHASE_SEG2에 대응하는 TSEG2 두 레지스터 필드로 값을 받는다 — 예컨대 Philips(현 NXP) SJA1000 컨트롤러는 Bus Timing Register 1에 TSEG1·TSEG2 필드를 둔다[2].
PROP_SEG와 버스 전파 지연
PROP_SEG의 최소 길이는 버스 양 끝에 있는 두 노드 사이의 왕복 지연을 덮도록 정해진다. 이 지연은 버스 배선의 신호 전파 시간과 양쪽 트랜시버의 송수신 지연을 합한 값의 두 배다[3]:
는 PROP_SEG에 필요한 최소 시간, 는 버스 배선의 신호 전파 지연, ·는 송신·수신 트랜시버의 지연이다. 구리 배선의 신호 전파 지연은 미터당 약 5ns로 잡는 것이 일반적이다[3].
Example
1 Mbit/s, 버스 길이 20m, 트랜시버 왕복 지연 150ns인 시스템에서 PROP_SEG에 필요한 최소 시간은 2×(20m×5ns/m + 150ns) = 500ns다. 오실레이터 8MHz·프리스케일러 1로 tq를 125ns로 잡으면 비트 하나가 8tq뿐이라 PROP_SEG에만 4tq를 써야 하고, SYNC_SEG 1tq를 뺀 나머지 3tq를 PHASE_SEG1·PHASE_SEG2가 나눠 가져야 한다[3].
버스가 길어지거나 전송률이 높아질수록 PROP_SEG가 차지해야 하는 tq 수가 늘어나 PHASE_SEG1·PHASE_SEG2에 남는 여유가 줄어든다 — 고속 CAN일수록 버스 길이에 제약을 받는 근본 원인이다.
하드 동기화(Hard Synchronization)
버스가 유휴(idle) 상태에서 recessive→dominant edge가 관측되면 — 즉 SOF 비트가 도착하면 — 노드는 내부 비트 타이밍을 SYNC_SEG부터 강제로 다시 시작한다. 이를 하드 동기화라 하며, 그 결과 이 edge는 재시작된 비트 시간의 SYNC_SEG 안에 놓인다[1]. 여러 노드가 동시에 SOF를 실었을 때 어느 쪽이 버스를 차지하는지는 Bitwise Arbitration에서 다룬다.
재동기화(Resynchronization)와 SJW
하드 동기화 이후 프레임이 진행되는 동안에는, recessive→dominant edge가 나타날 때마다(직전 Sample Point에서 읽은 값과 다를 때만) 노드가 자신의 동기 상태를 점검한다[1]. edge의 위치를 SYNC_SEG 기준으로 잰 값을 위상 오차(phase error, e)라 하며, edge가 Sample Point보다 먼저 오면 e>0, 직전 Sample Point보다 늦게 오면 e<0이다. e>0이면 재동기화로 PHASE_SEG1을 늘리고, e<0이면 PHASE_SEG2를 줄여 위상을 맞춘다[1].
한 번의 재동기화로 늘리거나 줄일 수 있는 최대 폭은 재동기화 폭(Resynchronization Jump Width, SJW)으로 제한된다. Bosch 규격은 SJW를 1tq부터 min(4, PHASE_SEG1)까지 프로그래밍 가능하도록 규정하며[1], SJA1000은 이를 2비트 필드로 노출해 1~4tq 범위를 지원한다[2].
동기화는 하드 동기화와 재동기화 두 형태뿐이며, 한 비트 시간에는 둘 중 하나만 단 한 번 허용된다[1].
프레임 안에서 두 개의 서로 다른 비트율을 오가며 이 동기화 절차를 변형해 쓰는 확장은 CAN FD에서 다룬다.