차량용 네트워크 대역폭 한계와 CAN-FD 도입의 기술적 배경
현대 자동차(SDV, Software Defined Vehicle)와 지능형 산업 자동화 시스템에서는 ADAS(첨단 운전자 지원 시스템), 카메라, 레이더 및 전동 파워트레인 ECU의 수가 급증하면서 차량 내부 통신 트래픽이 기하급수적으로 증가하고 있습니다. 지난 수십 년간 차량용 네트워크의 표준으로 사용된 Classic CAN(CAN 2.0B, ISO 11898-1)은 최대 1Mbps의 전송 속도와 단일 프레임당 최대 8바이트의 페이로드 제한을 가집니다.
실제 양산 차량 환경에서는 버스 중재(Arbitration) 안정성을 위해 통상 500kbps 속도로 운영되며, 버스 로드율(Bus Load)이 70%를 초과할 경우 메시지 전송 지연(Latency Jitter)과 프레임 드롭 위험이 급격히 증가합니다. 특히 8바이트를 초과하는 진단 데이터(UDS)나 보안 인증 메시지(SecOC, MAC)를 송신할 경우, 전송 계층(ISO-TP)에서 패킷 분할(Fragmentation)과 재조립 오버헤드가 발생하여 대역폭 낭비가 심화됩니다.
이러한 물리적 한계를 극복하기 위해 제안된 규격이 바로 CAN-FD (CAN with Flexible Data-rate, ISO 11898-1:2015)입니다. CAN-FD는 기존 CAN의 비파괴적 비트 단위 중재(CSMA/CD + AMP) 메커니즘을 유지하면서도, 데이터 페이로드를 최대 64바이트로 확장하고 데이터 전송 구간의 전송 속도를 2Mbps~5Mbps(최대 8Mbps)로 가속하는 유연한 대역폭 스위칭 기술을 제공합니다. 본 글에서는 Classic CAN 대비 CAN-FD의 프레임 구조적 변화, BRS(Bit Rate Switch) 동작 원리, CRC 및 Stuff Bit 규칙 개선, 그리고 고속 통신 시 필수적인 TDC(Transmitter Delay Compensation) 메커니즘을 심층 분석합니다.
CAN-FD 핵심 아키텍처 및 메커니즘 요약
- Flexible Data-rate Architecture: 중재 구간(Arbitration Phase)은 기존 500kbps의 공통 속도로 충돌을 해결하고, 데이터 구간(Data Phase)에서는 BRS 비트를 통해 2Mbps~5Mbps로 속도를 전환하여 전송 시간을 획기적으로 단축합니다.
- Payload & Integrity Upgrade: 단일 프레임 페이로드를 최대 64바이트로 8배 확장하고, 고정 Stuff Bit 삽입 및 17/21비트 CRC 다항식을 도입하여 해밍 거리(Hamming Distance 6) 및 데이터 무결성을 보장합니다.
- Transmitter Delay Compensation (TDC): 고속 데이터 구간에서 송신기 내부 루프 지연(Transceiver Loop Delay)으로 인한 비트 오인식을 방지하기 위해 보조 샘플링 포인트(SSP, Secondary Sample Point)를 동적으로 연산하여 보상합니다.
CAN-FD 프레임 구조 및 핵심 메커니즘 상세 분석
1. Classic CAN vs CAN-FD 프레임 구조 비교
CAN-FD 프레임은 Classic CAN의 기본 골격을 유지하면서 제어 필드(Control Field)와 CRC 필드 구조를 확장하였습니다.
| 프레임 필드 | Classic CAN (CAN 2.0B) | CAN-FD (ISO 11898-1:2015) | 기술적 차이점 및 개선 사항 |
|---|---|---|---|
| SOF (Start of Frame) | 1 비트 (Dominant) | 1 비트 (Dominant) | 프레임 시작 동기화 신호 유지 |
| Arbitration Field | 11비트(표준) / 29비트(확장) | 11비트(표준) / 29비트(확장) | 동일한 비파괴적 우선순위 중재 방식 적용 |
| RTR / RRS | RTR (Remote Transmission Request) | RRS (Remote Request Substitution) | CAN-FD에서는 원격 프레임(Remote Frame) 지원 폐지 |
| IDE (Identifier Extension) | 1 비트 | 1 비트 | 표준(11비트) 및 확장(29비트) ID 구분 |
| FDF (FD Format Indicator) | Reserved Bit (r0 Dominant) |
FDF (1 Recessive) |
CAN-FD 프레임 식별 플래그 (EDL: Extended Data Length) |
| BRS (Bit Rate Switch) | 미존재 | BRS (1 Recessive / 0 Dominant) |
데이터 구간의 고속 클록 전환 여부 결정 |
| ESI (Error State Indicator) | 미존재 | ESI (0 Error-Active / 1 Passive) |
송신 노드의 에러 상태를 수신 노드에 직접 통지 |
| DLC (Data Length Code) | 4 비트 (0 ~ 8 바이트, 1:1 매핑) | 4 비트 (0 ~ 64 바이트, 비선형 매핑) | 9~15 값을 12, 16, 20, 24, 32, 48, 64 바이트로 확장 |
| Data Field | 0 ~ 8 바이트 | 0 ~ 64 바이트 | 8바이트 초과 데이터(SecOC, 진단 패킷) 단일 전송 |
| CRC Field | 15비트 CRC + 1비트 Delimiter | 17비트/21비트 CRC + Stuff Count + Delimiter | 16B 이하: CRC17 / 16B 초과: CRC21 동적 적용 |
| ACK Field | 1비트 Slot + 1비트 Delimiter | 1비트 Slot + 1비트 Delimiter | 중재 속도로 복귀하여 수신 ACK 수신 |
| EOF (End of Frame) | 7 비트 Recessive | 7 비트 Recessive | 프레임 종료 구분 신호 |
Classic CAN (Standard 11-bit Frame):
+-----+----------------+-----+-----+------+-----------+---------+-----+-----+
| SOF | 11-bit CAN-ID | RTR | IDE | r0 | DLC (4b) | Data | CRC | ACK | EOF |
| (1) | | (1) | (1) | (1) | (0-8B) | (0-8B) |(15b)| (2) | (7) |
+-----+----------------+-----+-----+------+-----------+---------+-----+-----+
[ Nominal Bit Rate (e.g. 500kbps) ]
CAN-FD (Standard 11-bit Base Frame):
+-----+----------------+-----+-----+-----+-----+-----+------+-------+------+-----+-----+
| SOF | 11-bit CAN-ID | RRS | IDE | FDF | BRS | ESI | DLC | Data | CRC | ACK | EOF |
| (1) | | (1) | (1) | (1) | (1) | (1) | (4b) |(0-64B)|17/21b| (2) | (7) |
+-----+----------------+-----+-----+-----+-----+-----+------+-------+------+-----+-----+
|<-- Nominal Rate (500k) -->| |<-- Data Rate (2~5M) ------>| |<- Nominal Rate ->|
^ ^
Bit Rate Switch Bit Rate Switch
(BRS Sample Point) (CRC Delimiter)2. BRS(Bit Rate Switch) 및 이중 보레이트(Dual Baud Rate) 동작 원리
CAN-FD의 핵심은 단일 버스 상에서 두 가지 서로 다른 통신 속도를 동적으로 전환하여 사용하는 것입니다.
- 중재 구간 (Nominal / Arbitration Phase):
- 버스에 연결된 모든 노드가 물리적 전파 지연(Propagation Delay)을 감내하며 충돌 없이 우선순위를 경합해야 하므로 기존 500kbps (또는 250kbps) 속도로 동작합니다.
- 데이터 구간 (Data Phase):
- 중재가 완료되어 오직 하나의 송신 노드만이 버스를 점유한 상태이므로, 다른 노드와의 전파 지연 충돌을 고려할 필요가 없습니다.
- 제어 필드의
BRS비트의 샘플링 포인트(Sample Point)에서 컨트롤러 내부 클록이 고속 클록(Data Bit Rate: 2Mbps, 4Mbps, 5Mbps)으로 전환됩니다.
- 중재 속도 복귀:
- 데이터 필드와 CRC 필드 전송이 완료된 후, CRC Delimiter 비트의 샘플링 포인트에서 원래의 중재 속도(500kbps)로 안전하게 복귀합니다.
- 모든 수신 노드는 중재 속도로 ACK 비트를 버스에 전송합니다.
3. DLC(Data Length Code) 비선형 매핑 테이블
Classic CAN은 4비트 DLC 값이 바이트 수(08)와 1:1로 일치했으나, CAN-FD에서는 4비트(015)를 사용하여 최대 64바이트까지 표현하기 위해 비선형 매핑을 적용합니다.
+-----------+----------------------+--------------------+
| DLC (Hex) | Classic CAN (Bytes) | CAN-FD (Bytes) |
+-----------+----------------------+--------------------+
| 0x0 | 0 | 0 |
| 0x1~0x8 | 1 ~ 8 | 1 ~ 8 |
| 0x9 | 8 (Capped) | 12 |
| 0xA | 8 (Capped) | 16 |
| 0xB | 8 (Capped) | 20 |
| 0xC | 8 (Capped) | 24 |
| 0xD | 8 (Capped) | 32 |
| 0xE | 8 (Capped) | 48 |
| 0xF | 8 (Capped) | 64 |
+-----------+----------------------+--------------------+4. CRC 개선 및 고정 Stuff Bit(Fixed Stuff Bit) 규칙
Classic CAN에서는 동일한 극성의 비트가 5개 연속되면 반대 극성의 Stuff Bit가 동적으로 삽입되었습니다. 이 방식은 수신 노드에서 Stuff Bit가 손상될 경우 전체 프레임의 비트 카운팅이 어긋나는 취약점(Hamming Distance 감소)이 존재했습니다.
CAN-FD는 이를 보완하기 위해 다음과 같은 엄격한 무결성 규칙을 도입했습니다:
- Stuff Count 필드 추가: CRC 필드 직전에 4비트 크기의
Stuff Count(3비트 Gray Code + 1비트 Parity)를 삽입하여 프레임 내에 삽입된 Stuff Bit의 총 개수를 검증합니다. - 고정 Stuff Bit (Fixed Stuff Bits, FSB): CRC 필드 영역에서는 동적 스터핑 대신 4비트 간격(FSB)마다 이전 비트와 반대되는 고정 스터프 비트를 강제 삽입하여 재동기화 에지(Edge)를 상시 제공합니다.
- 확장 CRC 다항식:
- 페이로드 $\le$ 16 바이트: CRC-17 ($x^{17} + x^{16} + x^{14} + x^{13} + x^{11} + x^6 + x^4 + x^3 + x^1 + 1$)
- 페이로드 $>$ 16 바이트: CRC-21 ($x^{21} + x^{20} + x^{13} + x^{11} + x^7 + x^4 + x^3 + 1$)
5. 송신기 지연 보상 (TDC, Transmitter Delay Compensation)
CAN-FD 통신 속도가 2Mbps(비트 타임 500ns) 또는 5Mbps(비트 타임 200ns)로 고속화될 때 가장 치명적인 물리 계층 문제는 트랜시버 루프 딜레이(Loop Delay)입니다.
송신 노드의 CAN 컨트롤러가 TXD 핀으로 비트를 출력하면, (1) CAN 트랜시버 드라이버 지연, (2) 물리 버스 신호 상승/하강 시간, (3) 트랜시버 수신 리시버 지연을 거쳐 RXD 핀으로 피드백됩니다. 이 지연 시간($t_{loop}$)이 통상 100ns~250ns에 달합니다.
Transmitter Node (Microcontroller + CAN-FD Transceiver):
+-------------------------------------------------------------+
| CAN-FD Controller |
| |
| TXD Signal -----[Transmitter Loop Delay (t_loop)]------> |
| | | |
| v v |
| Sent Bit 0 ---------> CAN Transceiver -------------> Bus |
| | | |
| RXD Feedback <------------+ (Echo Delay) <-------------+ |
| | |
| v |
| Sample Point (Nominal): Misses data! (Samples next bit) |
| Secondary Sample Point (SSP): Accurately samples feedback |
+-------------------------------------------------------------+- 문제 현상: 비트 타임(200ns)이 루프 딜레이($t_{loop} = 150ns$)와 비슷해지면, 송신 노드가 자신이 보낸 비트 0을 확인하기 위해 일반적인 샘플 포인트(예: 비트의 75% 지점 = 150ns)에서 RXD를 읽을 때 이전 비트나 다음 비트가 읽혀 스스로 Bit Error를 발생시키고 Error Frame을 송출합니다.
- TDC 해결 원리:
- 송신 노드는 TXD 에지가 발생한 시점부터 RXD 에지가 감지될 때까지의 시간($t_{loop}$)을 하드웨어 타이머로 실측합니다.
- 여기에 설정된 TDC Offset (TDCO)을 더하여 보조 샘플링 포인트(SSP, Secondary Sample Point)를 동적으로 생성합니다.
$$\text{SSP Position} = \text{Measured Transmitter Delay } (t_{loop}) + \text{TDC Offset}$$ - 이를 통해 송신 노드는 루프 지연과 무관하게 자신이 송신한 비트를 정확한 시점에 검증할 수 있습니다.
CAN-FD 하드웨어 및 레지스터 설정 실무 가이드
1. STM32 / NXP / Infineon CAN-FD 비트 타이밍 계산
CAN-FD 통신을 구축할 때는 중재 구간(Nominal)과 데이터 구간(Data)의 비트 타이밍 파라미터를 각각 독립적으로 계산해야 합니다.
Nominal Phase (500 kbps, 80% Sample Point, Clock = 80 MHz):
- $t_q = \frac{1}{80\text{ MHz}} = 12.5\text{ ns}$
- Bit Time = $\frac{1}{500\text{ kbps}} = 2000\text{ ns} = 160\text{ }t_q$
- $\text{Sync_Seg} = 1\text{ }t_q$
- $\text{Prop_Seg} + \text{Phase_Seg1} = 127\text{ }t_q$
- $\text{Phase_Seg2} = 32\text{ }t_q$
- $\text{Sample Point} = \frac{1 + 127}{160} = 80.0%$
Data Phase (2.0 Mbps, 75% Sample Point, Clock = 80 MHz):
- Bit Time = $\frac{1}{2000\text{ kbps}} = 500\text{ ns} = 40\text{ }t_q$
- $\text{Sync_Seg} = 1\text{ }t_q$
- $\text{Prop_Seg} + \text{Phase_Seg1} = 29\text{ }t_q$
- $\text{Phase_Seg2} = 10\text{ }t_q$
- $\text{Sample Point} = \frac{1 + 29}{40} = 75.0%$
- $\text{TDC Offset (TDCO)} = \text{Prop_Seg} + \text{Phase_Seg1} = 29\text{ }t_q\text{ (362.5 ns)}$
2. C 언어 CAN-FD 하드웨어 초기화 코드 예시 (Bosch M_CAN IP 레퍼런스)
src/can_fd_driver.c:
#include <stdint.h>
#include <stdbool.h>
/* Bosch M_CAN Base Register Definition Example */
typedef struct {
volatile uint32_t CREL; /* Core Release Register */
volatile uint32_t DBTP; /* Data Bit Timing & Prescaler */
volatile uint32_t TEST; /* Test Register */
volatile uint32_t RWD; /* RAM Watchdog */
volatile uint32_t CCCR; /* CC Control Register */
volatile uint32_t NBTP; /* Nominal Bit Timing & Prescaler */
volatile uint32_t TSCC; /* Timestamp Counter Configuration */
volatile uint32_t TSCV; /* Timestamp Counter Value */
volatile uint32_t TOCC; /* Timeout Counter Configuration */
volatile uint32_t TOCV; /* Timeout Counter Value */
volatile uint32_t TDCR; /* Transmitter Delay Compensation Register */
} m_can_registers_t;
#define M_CAN ((m_can_registers_t *)0x4000A000)
/* CCCR Register Bit Definitions */
#define CCCR_INIT (1 << 0)
#define CCCR_CCE (1 << 1)
#define CCCR_FDOE (1 << 8) /* Flexible Data-Rate Enable */
#define CCCR_BRSE (1 << 9) /* Bit Rate Switch Enable */
/* TDCR Register Bit Definitions */
#define TDCR_TDCF(val) (((val) & 0x7F) << 8) /* Filter Window Length */
#define TDCR_TDCO(val) (((val) & 0x7F) << 0) /* Offset */
/**
* @brief Initialize CAN-FD Controller with Dual Bitrate and TDC.
*/
int can_fd_controller_init(void)
{
/* Step 1: Enter Initialization and Configuration Mode */
M_CAN->CCCR |= CCCR_INIT;
while ((M_CAN->CCCR & CCCR_INIT) == 0) {
/* Wait for initialization mode */
}
M_CAN->CCCR |= CCCR_CCE;
/* Step 2: Enable CAN-FD Operation and Bit Rate Switching */
M_CAN->CCCR |= (CCCR_FDOE | CCCR_BRSE);
/* Step 3: Configure Nominal Bit Timing (500 kbps @ 80MHz) */
/* Prescaler=1, Sync_Seg=1, Prop+Phase1=127, Phase2=32, SJW=16 */
M_CAN->NBTP = (15 << 25) | (0 << 16) | (127 << 8) | (31 << 0);
/* Step 4: Configure Data Bit Timing (2.0 Mbps @ 80MHz) */
/* Prescaler=1, Sync_Seg=1, Prop+Phase1=29, Phase2=10, SJW=8, TDC Enabled */
M_CAN->DBTP = (1 << 23) | (7 << 16) | (29 << 8) | (9 << 4) | (0 << 0);
/* Step 5: Configure Transmitter Delay Compensation (TDC) */
/* TDCO = 29 tq, TDC Filter = 0 */
M_CAN->TDCR = TDCR_TDCO(29) | TDCR_TDCF(0);
/* Step 6: Leave Configuration Mode and Start CAN Operation */
M_CAN->CCCR &= ~CCCR_CCE;
M_CAN->CCCR &= ~CCCR_INIT;
while ((M_CAN->CCCR & CCCR_INIT) != 0) {
/* Wait for normal operation mode */
}
return 0;
}
예외 상황 및 트러블슈팅
1. ISO CAN-FD vs Non-ISO CAN-FD 호환성 충돌
초기 Bosch CAN-FD 사양(Non-ISO CAN-FD)과 최종 국제 표준 규격(ISO 11898-1:2015 ISO CAN-FD)은 CRC 계산 알고리즘과 Stuff Count 비트 위치가 상이합니다.
- 증상: Non-ISO 모드로 설정된 구형 계측기(또는 레거시 ECU)와 ISO CAN-FD로 설정된 신규 ECU가 통신할 때 수신 노드에서 지속적인 Form Error / CRC Error가 발생하고 버스가 Bus-Off 상태로 전락합니다.
- 해결 방안: 모든 ECU 펌웨어 및 벡터(CANoe), 피크(PCAN) 계측기 설정에서
ISO CAN-FD표준 모드가 활성화되어 있는지 확인하고 레지스터(CCCR_NISO비트)를 일관되게 동기화합니다.
2. 고속 버스 토폴로지에서의 스텁(Stub) 반사파 에러
2Mbps 이상의 CAN-FD 신호는 높은 주파수 성분으로 인해 하네스 분기 라인(Stub Line)의 길이가 30cm를 초과할 경우 신호 반사파(Signal Reflection)가 심화되어 데이터 위상이 일그러집니다.
- 해결 방안:
- 메인 버스 트렁크 라인 양단에 정밀 120Ω 터미네이션 저항을 장착하고, 공통 모드 노이즈 제거를 위한 Split Termination(60Ω + 60Ω + 4.7nF GND 커패시터)을 적용합니다.
- 고속 노드의 드롭 케이블(Stub) 길이를 10cm 이내로 극단적으로 최소화합니다.
차세대 전장 네트워크로의 도약
CAN-FD는 Classic CAN의 물리적 계층 안정성을 100% 계승하면서도 64바이트 페이로드 확장과 최대 5Mbps의 고속 데이터 전송을 실현한 차량용/산업용 핵심 네트워크 기술입니다.
BRS에 의한 동적 보레이트 전환과 TDC 보조 샘플링 포인트 메커니즘을 정확히 이해하고 하드웨어를 튜닝하는 것은, 향후 UDS 대용량 진단, ISO-TP 전송 최적화 및 AUTOSAR 기반 SDV 전장 아키텍처를 설계하는 현대 임베디드 엔지니어의 가장 필수적인 기술 역량입니다.