CAN TP (CAN Transport Protocol) — ISO 15765-2 기반의 CAN 전송 계층 프로토콜. CAN 프레임의 8 Byte 데이터 필드 제약을 넘는 긴 메시지(예: UDS 진단 데이터)를 여러 프레임으로 분할·조립하고 흐름을 조절한다. AUTOSAR에서는 CanTp라는 이름의 BSW 모듈로 구현되며, PduR과 CanIf 사이에 위치한다.
필요성
- CAN Data Frame의 페이로드는 최대 8 Byte (Classical CAN 기준; CAN FD는 64 Byte).
- UDS 진단 메시지는 수십~수천 Byte 규모로 확장 가능.
- 송신자가 데이터를 여러 프레임에 나눠 전송하고, 수신자가 흐름을 제어하며 순서대로 재조립해야 함.
Frame Type (N_PCItype)
CAN 프레임 첫 바이트의 상위 nibble이 N_PCItype 으로 전송 단위를 구분한다.
| N_PCItype | 값 (nibble) | 이름 | 용도 |
|---|---|---|---|
| SF | 0000 | Single Frame | 7 Byte 이하 단일 전송 |
| FF | 0001 | First Frame | 분할 전송 첫 프레임 |
| CF | 0010 | Consecutive Frame | 분할 전송 이어지는 프레임 |
| FC | 0011 | Flow Control | 수신측 흐름 제어 (송신 안 함) |
프레임 포맷 (Normal Addressing)
| Frame Type | Byte 1 상위 nibble | Byte 1 하위 nibble | Byte 2 | Byte 3~8 |
|---|---|---|---|---|
| Single | 0000 | SF_DL (0~7) | DATA 1 | DATA 2 ~ DATA 7 |
| First | 0001 | FF_DL (상위) | FF_DL (하위) | DATA 1 ~ DATA 6 |
| Consecutive | 0010 | SN (Sequence #) | DATA 1 | DATA 2 ~ DATA 7 |
| Flow Ctrl | 0011 | FS | BS | STmin + Reserved |
- SF_DL(Single Frame Data Length): 1~7 Byte.
- FF_DL: First Frame의 전체 메시지 길이 (12 bit).
- SN(Sequence Number): Consecutive Frame 순서 번호 (0~15 순환).
CAN FD 확장 포맷
CAN FD(최대 64 Byte 페이로드) 지원을 위해 SF·FF가 확장 형식으로도 정의된다.
| Frame Type | Byte 0 (7..4) | Byte 0 (3..0) | Byte 1 | Byte 2~ (길이 필드 연장) |
|---|---|---|---|---|
| SF (DLC ≤ 8) | 0000 | Size (0..7) | DATA A.. | — |
| SF (DLC > 8) ⁺ | 0000 | 0000 | Size (8..62) | DATA A.. |
| FF (DL ≤ 4095) | 0001 | Size high | Size low | DATA A.. |
| FF (DL > 4095) ⁺ | 0001 | 0000 | 0000 0000 | Size (4096..2³²−1, 4 B) |
| CF | 0010 | Index (0..15) | DATA A.. | — |
| FC | 0011 | Flag (0/1/2) | Block size | STmin, … |
- ⁺ 표시는 CAN FD 전용.
- 확장 SF(
0000 0000 Size...): 1 Byte에 길이를 담지 못할 때 길이 필드를 한 Byte 뒤로 미뤄 최대 62 Byte 페이로드. - 확장 FF(
0001 0000 0000 0000 Size...): 12 bit(4095 Byte)를 넘는 메시지를 위해 32-bit 길이 필드(최대 Byte) 사용.
데이터 스트림
긴 메시지를 전송할 때의 시퀀스:
- 송신자 → First Frame(FF) 전송 — 전체 길이 공지.
- 수신자 → Flow Control(FC) 응답 — 흐름 제어 파라미터 전달.
- 송신자 → Consecutive Frame(CF) 반복 전송 — BS만큼 보내고 필요 시 추가 FC 대기.
7 Byte 이하면 FF/CF/FC 없이 Single Frame 한 개로 완결.
Flow Control (FC)
FC의 목적은 Consecutive Frame이 수신측에 전달되는 속도를 조절하는 것이다. 수신자가 송신자의 속도를 제한하여 버퍼 오버런·처리 지연을 방지.
Flow Status (FS)
FC 프레임 Byte 1 하위 nibble에 위치. 송신자에게 다음 동작을 지시한다.
| 값 (HEX) | 상태 | 의미 |
|---|---|---|
| 0 | CTS (Continue To Send) | 송신자가 Consecutive Frame 송신을 재개. 수신자가 최대 BS만큼 받을 준비 완료. |
| 1 | WT (Wait) | 송신자는 새로운 FC를 계속 대기. 수신측 아직 준비 안 됨. |
| 2 | OVFLW (Overflow) | 송신자는 분할된 메시지 전송을 중단. 수신 버퍼 부족. |
Block Size (BS)
FC 프레임 Byte 2. 한 블록 당 Consecutive Frame의 절대 개수.
| 값 (HEX) | 의미 |
|---|---|
00 | 분할 전송 중 추가 FC 프레임 없이 끝까지 전송. 수신측은 남은 CF를 한 번에 수신. |
01~FF | 중간 FC 없이 전송할 수 있는 최대 CF 개수 (1~255). |
STmin (Minimum Separation Time)
FC 프레임 Byte 3. Consecutive Frame 전송 간 최소 시간 간격.
| 값 (HEX) | 시간 | 단위 |
|---|---|---|
00~7F | 0 ms ~ 127 ms | 값 1당 1 ms |
F1~F9 | 100 µs ~ 900 µs | 값 1당 100 µs |
FA~FF | Reserved | - |
AUTOSAR CanTp 모듈
AUTOSAR Classic Platform은 CAN TP를 CanTp라는 BSW 모듈로 표준화한다.
위치
- 상위: PduR (I-PDU routing 층)
- 하위: CanIf (CAN HW 추상화)
- OSI L3(Network Layer) 매핑 — CAN 자체는 L2까지이므로 CanTp가 L3을 보완
기능
- Segmentation — 페이로드가 CAN 8 Byte(또는 CAN FD 64 Byte)를 넘으면 다수 프레임으로 분할
- Reassembly — 수신 측에서 분할된 프레임을 원본 메시지로 재조립
- Data Flow 제어 — SF / FF / CF / FC PDU 조합으로 흐름 조절
- Segmentation session 에러 검출 — 시퀀스 위반·타임아웃 등 감지
- Transmission cancellation — 진행 중 송신 취소
- Receive cancellation — 진행 중 수신 취소
진단 경로에서의 역할
AUTOSAR Communication Stack 내에서 CanTp는 진단 메시지의 표준 분할 재조립 경로다. DCM → PduR → CanTp → CanIf → Can → CAN bus 순으로 UDS 데이터가 흐른다.
UDS와의 결합
CAN 기반 UDS 진단 통신에서 CAN TP는 필수 전송 계층이다.
- UDS Request
22 F1 90(ReadDataByIdentifier, DID 0xF190) → CAN TP로 Single Frame03 22 F1 90 ...캡슐화.03= SF·길이 3. - 응답이 7 Byte를 초과하면 FF → FC → CF… 시퀀스로 재조립.
DoIP와의 관계: DoIP는 Ethernet 기반이므로 TCP 세그멘테이션을 이용하며 CAN TP가 필요 없다. Gateway가 DoIP ↔ CAN 경로에서 UDS 메시지를 CAN TP로 재캡슐화하여 CAN ECU에 전달한다.