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는 모든 프로젝트의 공통 정답이 아닙니다.

| 종류 | PCI 예 | 이 범위에서 읽는 내용 |
|---|---|---|
| SF 단일 | 03 | 길이 3, 최대 진단 데이터 7바이트 |
| FF 첫 | 10 32 | 12비트 길이 0x032=50, 이어지는 데이터 6바이트 |
| CF 연속 | 21 | 순번 1, 이어지는 데이터 최대 7바이트 |
| FC 흐름 제어 | 30 02 14 | CTS, 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진수) | 진단 데이터 누적 |
|---|---|---|
| 테스터 → FF | 10 32 2E 12 34 00 01 02 | 6 |
| ECU → Wait | 31 00 00 AA AA AA AA AA | 6 |
| ECU → CTS 1 | 30 02 14 AA AA AA AA AA | 6 |
| 테스터 → CF 1 | 21 03 04 05 06 07 08 09 | 13 |
| 테스터 → CF 2 | 22 0A 0B 0C 0D 0E 0F 10 | 20 |
| ECU → CTS 2 | 30 02 14 AA AA AA AA AA | 20 |
| 테스터 → CF 3 | 23 11 12 13 14 15 16 17 | 27 |
| 테스터 → CF 4 | 24 18 19 1A 1B 1C 1D 1E | 34 |
| ECU → CTS 3 | 30 02 14 AA AA AA AA AA | 34 |
| 테스터 → CF 5 | 25 1F 20 21 22 23 24 25 | 41 |
| 테스터 → CF 6 | 26 26 27 28 29 2A 2B 2C | 48 |
| ECU → CTS 4 | 30 02 14 AA AA AA AA AA | 48 |
| 테스터 → CF 7 | 27 2D 2E AA AA AA AA AA | 50 |
FF의 6바이트 + CF 여섯 개의 42바이트 + 마지막 CF의 2바이트 = 50입니다. CF의 PCI·마지막 패딩·FC는 이 길이에 포함하지 않습니다. CTS는 4회, Wait까지 포함한 FC는 총 5회입니다. 마지막 CF 뒤에 전송 완료 확인용 FC를 하나 더 붙이지 않습니다. 이후 UDS 응답은 별도의 반대 방향 전송입니다.

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에서 실패를 좁히는 순서
- CAN ID·주소 형식·DLC·패딩이 승인 설정과 맞는지 봅니다. 요청과 응답의 패딩 정책은 다를 수 있습니다.
- FF 길이와 재조립한 데이터 길이를 비교합니다. 순번은 1~F 다음 0으로 돌아가며, 누락·순서 오류를 찾습니다.
- 누가 송신자·수신자인지 적고, FC 방향, BlockSize 경계의 멈춤과 다음 CTS를 확인합니다.
- CF 시각으로 STmin을 확인하고, FC·CF 대기 제한은 전송 사양과 대조합니다.
- 재조립이 끝난 뒤에 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와 고객 전송 사양의 승인본을 사용합니다.
댓글
댓글 쓰기