CAN 프레임 안에 UDS는 어떻게 들어가나 — ISO-TP 정리

개정: 2026-10-04. 설명 범위를 Classical CAN 일반 주소 방식으로 한정하고, 50바이트 예제의 FC를 CTS 4회와 Wait 1회, 총 5회로 정리했습니다.

CANoe Trace의 03 22 F1 90 AA AA AA AA는 무엇일까요? 앞의 03은 UDS 서비스가 아니라 ISO-TP의 제어 정보입니다. 이 글은 CAN 데이터 안에서 길이·순번·흐름 제어를 읽는 연습입니다. 서비스가 허용되는지는 별도 UDS 사양으로 판정합니다.

1. 먼저 적용 범위를 붙입니다

아래 바이트 예제는 Classical CAN, 데이터 길이 8바이트, 일반(normal) 주소 형식, 물리 주소 1:1 전송을 가정합니다. 일반 주소는 CAN ID로 주소를 표현하므로 데이터 첫 바이트가 PCI입니다. 확장·혼합 주소 형식에는 추가 주소 바이트가 들어갈 수 있습니다. CAN FD는 최대 64바이트 데이터와 다른 길이 처리가 있으므로 여기의 “7바이트” 규칙을 그대로 적용하지 않습니다.

CAN의 ID는 프레임을 구분하고, DLC는 데이터 길이를 나타냅니다. 이 범위의 데이터는 최대 8바이트입니다. ISO-TP는 그 안에 PCI와 진단 데이터를 넣고, 한 프레임에 안 들어가면 분할·재조립합니다. CAN의 CRC·ACK는 링크 전송에 관여하지만 UDS 서비스 결과나 ECU 애플리케이션 처리 완료를 보장하지 않습니다.

2. DLC와 진단 데이터 길이는 다릅니다

03 22 F1 90 AA AA AA AA에서 DLC는 8, SF의 진단 데이터 길이는 3입니다. PCI 03의 상위 4비트 0은 Single Frame, 하위 4비트 3은 길이입니다. 실제 UDS 바이트는 22 F1 90이고 나머지 AA 네 개는 이 예제의 패딩입니다. AA는 모든 프로젝트의 공통 정답이 아닙니다.

Classical CAN·일반 주소·물리 1:1 예에서 DLC 8은 PCI 1바이트, UDS 3바이트, 패딩 4바이트로 나뉩니다. AA는 이 예제의 가정입니다.
Classical CAN·일반 주소·물리 1:1 예에서 DLC 8은 PCI 1바이트, UDS 3바이트, 패딩 4바이트로 나뉩니다. AA는 이 예제의 가정입니다.
종류PCI 예이 범위에서 읽는 내용
SF 단일03길이 3, 최대 진단 데이터 7바이트
FF 첫10 3212비트 길이 0x032=50, 이어지는 데이터 6바이트
CF 연속21순번 1, 이어지는 데이터 최대 7바이트
FC 흐름 제어30 02 14CTS, BlockSize 2, STmin 20ms

SF는 이 범위에서 UDS 7바이트까지 담습니다. 8바이트부터는 다중 전송이 필요합니다. FF의 12비트 길이를 모든 ISO-TP 판본·프레임 형식의 절대 최대값으로 설명하지 않습니다. 실제 길이 지원과 버퍼 제한은 적용 규격·구현을 확인합니다.

3. 50바이트를 실제 바이트로 나눠 봅니다

교육용 가상 요청은 2E 12 34와 값 00~2E입니다. SID 1바이트+DID 2바이트+값 47바이트=총 50바이트입니다. DID 0x1234가 실제 차량에서 존재하거나 쓰기를 허용한다는 뜻이 아니며, 아래는 실제 실행 로그가 아닙니다. DLC는 8, 패딩은 AA로 가정합니다.

테스터가 데이터를 보내고 ECU가 FC를 보냅니다. 수신기가 Wait 1회를 허용하는 상황을 가정하며, 그 뒤 각 CTS가 CF 2개를 허용합니다. 각 CF 사이의 최소 간격은 0x14=20ms입니다. Wait 허용 횟수와 대기 제한은 승인된 전송 사양을 따라야 합니다.

방향·종류데이터 필드(16진수)진단 데이터 누적
테스터 → FF10 32 2E 12 34 00 01 026
ECU → Wait31 00 00 AA AA AA AA AA6
ECU → CTS 130 02 14 AA AA AA AA AA6
테스터 → CF 121 03 04 05 06 07 08 0913
테스터 → CF 222 0A 0B 0C 0D 0E 0F 1020
ECU → CTS 230 02 14 AA AA AA AA AA20
테스터 → CF 323 11 12 13 14 15 16 1727
테스터 → CF 424 18 19 1A 1B 1C 1D 1E34
ECU → CTS 330 02 14 AA AA AA AA AA34
테스터 → CF 525 1F 20 21 22 23 24 2541
테스터 → CF 626 26 27 28 29 2A 2B 2C48
ECU → CTS 430 02 14 AA AA AA AA AA48
테스터 → CF 727 2D 2E AA AA AA AA AA50

FF의 6바이트 + CF 여섯 개의 42바이트 + 마지막 CF의 2바이트 = 50입니다. CF의 PCI·마지막 패딩·FC는 이 길이에 포함하지 않습니다. CTS는 4회, Wait까지 포함한 FC는 총 5회입니다. 마지막 CF 뒤에 전송 완료 확인용 FC를 하나 더 붙이지 않습니다. 이후 UDS 응답은 별도의 반대 방향 전송입니다.

기존 50바이트 전송 흐름 개념도입니다. BS 2에서 FF 1+CF 7, CTS 4회와 Wait 1회를 포함한 FC 총 5회를 가정합니다. 20ms는 최소 간격이고 그림의 요청 바이트는 현재 가상 DID와 별개입니다.
기존 50바이트 전송 흐름 개념도입니다. BS 2에서 FF 1+CF 7, CTS 4회와 Wait 1회를 포함한 FC 총 5회를 가정합니다. 20ms는 최소 간격이고 그림의 요청 바이트는 현재 가상 DID와 별개입니다.

4. BlockSize는 바이트 수가 아닙니다

BlockSize 02는 CF 두 개를 보낸 뒤 다음 FC를 기다린다는 뜻입니다. 한 CF가 7바이트를 실으므로 완전한 블록은 14바이트입니다. 마지막 블록은 남은 2바이트만 실어도 끝납니다. BlockSize 00이면 허용된 나머지 CF를 중간 블록 FC 없이 보냅니다.

FC의 흐름 상태 0은 CTS, 1은 Wait, 2는 Overflow입니다. Wait를 받았다고 계속 보내면 안 되고, 무한 대기도 아닙니다. STmin의 00~7F는 0~127ms, F1~F9는 100~900µs입니다. 다른 예약값을 임의 시간으로 해석하지 않습니다.

5. Trace에서 실패를 좁히는 순서

  1. CAN ID·주소 형식·DLC·패딩이 승인 설정과 맞는지 봅니다. 요청과 응답의 패딩 정책은 다를 수 있습니다.
  2. FF 길이와 재조립한 데이터 길이를 비교합니다. 순번은 1~F 다음 0으로 돌아가며, 누락·순서 오류를 찾습니다.
  3. 누가 송신자·수신자인지 적고, FC 방향, BlockSize 경계의 멈춤과 다음 CTS를 확인합니다.
  4. CF 시각으로 STmin을 확인하고, FC·CF 대기 제한은 전송 사양과 대조합니다.
  5. 재조립이 끝난 뒤에 UDS SID·DID·NRC를 판정합니다. 패딩·순번 오류를 곧바로 특정 UDS NRC로 단정하지 않습니다.

단일 프레임이 통과해도 다중 프레임은 별도 시험이 필요합니다. 긴 요청·응답, 순번 누락, FC 지연, BlockSize 변경, 잘못된 패딩을 승인된 환경에서 확인하고 원시 Trace를 남깁니다. 지원하지 않는 Wait 시험을 도구에 무조건 요구하지 말고 구현의 제한도 확인하세요.

공식 자료와 이어서 읽기

Linux Kernel 공식 ISO-TP 문서는 주소 형식, 분할·FC·STmin과 구현 제한을 설명합니다. 해당 구현은 Wait 송신을 지원하지 않는다고 밝히므로 위 가상 Wait 시나리오를 그대로 재현한다고 가정하지 않습니다. CiA CAN FD 안내는 FD의 최대 64바이트 데이터를 설명합니다. 실제 판정은 적용 ISO 15765-2와 고객 전송 사양의 승인본을 사용합니다.

UDS 서비스·NRC 판정 · DBC·LDF와 로그 해석

댓글

이 블로그의 인기 게시물

Automotive SPICE SYS.2에서 SYS.5 테스트 케이스 생성하기 — AI 활용, 요구사항부터 검증까지의 실무 프로세스

자동차도 시험을 볼까? MIL·SIL·PIL·HIL을 초등학생도 쉽게 이해하기