본문 바로가기
임베디드 개발/펌웨어

CAN ISO-TP

by eteo 2023. 5. 31.

 

 

 

 

Classic CAN 프레임의 경우 페이로드가 8바이트로 제한되고 CAN FD의 경우 페이로드가 64바이트로 제한된다. 이보다 큰 대용량 페이로드를 전송하려면 어떻게 해야할까?

 

ISO-TP (ISO transfer protocol)는 이 문제를 해결하기 위해 ISO 15765-2 표준에 정의된 프로토콜로, 페이로드 데이터 크기를 최대 4095바이트까지 확장한다.

ISO-TP의 가장 일반적인 기능은 송신측에서 패킷을 작은 조각(세그먼트)으로 분할하고 수신측에서 다시 재조립해 원래의 데이터로 복원하는 것이다.

 

 

 

 

 

 

 

ISO TP가 정의하는 Frame type은 다음의 4가지이다. Frame별로 1~3바이트 길이의 PCI(Protocol Control Information) 헤더가 붙는다.

 

 

  • Single Frame (SF, 0x0): Unsegmented message which can be fit into single frame.
  • First Frame (FF, 0x1): First frame of segmented message.
  • Consecutive Frame (CF, 0x2): Frame followed by the first frame are consecutive frame.
  • Flow Control Frame (FC, 0x3): When first frame is received a flow control frame is send, which contain status flow, block size and separation time.

 

 

✔ ISO-TP frame type은 첫번째 바이트의 첫번째 니블을 확인하면 구별할 수 있다. 0x0x, 0x1x, 0x2x, 0x3x

 

✔ 프레임 페이로드를 8바이트 길이로 맞추기 위해 패딩(e.g. 0x00, 0xAA, ..)이 사용된다.

 

 

 

 

 

 

Single-frame communication

 

 

페이로드가 7바이트에 포함될 수 있는 경우 단순히 Single Frame으로 전송한다.

조각화할 필요가 없으며, 흐름제어가 없다.

 

 

 

 

 

 

 

 

Multi-frame communication

 

 

메시지가 7바이트를 초과하는 경우 multiple CAN frames으로 분할해야 한다.

 

1. 먼저 sender가 total packet length(8~4095 bytes)정보와 data chunk의 initial 정보(UDS SID 등)가 담긴 First Frame(FF)을 송신한다.

2. FF를 수신한 receiver는 Flow Control(FC) 프레임을 송신하여 sender가 나머지 data를 어떻게 전송해야할지 알려준다.

3. 이어서 sender는 remaining payload를 Consecutive Frames(CF)에 담아 전송한다.

 

 

 

 

 

 

 

1. Single Frame (SF)

  • Byte 0의 Bit 7..4는 0x0
  • Byte 0의 Bit 3..0은 Data Size가 오며 범위는 0~7이다.

 

 

 

 

 

2. First Frame (FF)

  • Byte 0의 Bit 7..4는 0x1
  • Byte 0의 Bit 3..0 부터 Byte 1의 7..0까지는 Data Size 11..0이고 범위는 8~4095 (0x008~0xFFF)이다.

 

 

 

 

 

3. Consecutive Frame(CF)

  • Byte 0의 Bit 7..4는 0x2
  • Byte 0의 Bit 3..0은 modulo 16값인 Sequnce Number가 온다. 범위는 0-15이며 오버플로우되면 0부터 시작한다.

 

 

 

 

 

 

 

4. Flow Control Frame(FC)

 

  • Byte 0의 Bit 7..4는 0x3
  • Byte 0의 Bit 3..0은 Flag. 범위는 0~2이다.
    • Flag 0x0 : Continue To Send (CTS)
    • Flag 0x1 : Wait
    • Flag 0x2 : Overflow / Abort
  • Byte 1은 Block Size가 온다.
    • Block Size 0x00 : 남아있는 Frame들을 Flow Control이나 delay없이 전송
    • Block Size > 0x00 : 다음 Flow Control 프레임을 대기하기 전에 전송할 Block 수
  • Byte 2는 Separation time (ST)이다.
    • ST 0x00 ~ 0x7F : in milliseconds (0-127ms)
    • ST 0xF1 ~ 0xF9 : multiples of 100 microseconds (0xF1 = 100µs, 0xF2 = 200µs, ... 0xF9 = 900µs)

 

✔ 제일 간단한 경우 FC payload 는 "30 00 00 00 00 00 00 00" 일 수 있다. (남아있는 Frame을 딜레이 없이 다 보내라)

 

 

 

 

 

 

 

 

참고자료 : 

https://www.emotive.de/wiki/index.php?title=ISOTP 

https://www.csselectronics.com/pages/uds-protocol-tutorial-unified-diagnostic-services

'임베디드 개발 > 펌웨어' 카테고리의 다른 글

PXI  (0) 2023.06.25
UDS (차량용 진단 통신)  (0) 2023.06.09
ARINC-429 Word Format  (0) 2023.05.31
ARINC-429 Protocol  (0) 2023.05.31
Vector CANdb++ editor  (0) 2023.05.14