티스토리 뷰
CanTp (CAN Transport Protocol, ISO 15765-2)는 AUTOSAR에서 정의된 CAN 네트워크 상에서 대용량 데이터를 송수신할 수 있도록 지원하는 전송 계층 (Transport Layer) 모듈입니다.
🔹 1. CanTp의 역할
CAN(Controller Area Network)은 기본적으로 8바이트 이하의 데이터만 전송할 수 있습니다.
하지만 자동차에서 진단 메시지(UDS - Unified Diagnostic Services) 또는 OTA 업데이트와 같은 경우, 수백 바이트~수 킬로바이트의 데이터를 전송해야 하는 경우가 많습니다.
이를 가능하게 하는 것이 CanTp (CAN Transport Protocol)입니다.
✅ CanTp는 CAN 네트워크 상에서 데이터를 여러 개의 CAN 프레임으로 쪼개어 전송하고 다시 조립하는 역할을 수행합니다.
✅ 주로 UDS(진단 서비스)와 함께 사용되며, DCM(Diagnostic Communication Manager)과 연계됩니다.
🔹 2. CanTp의 구조와 동작 원리
CanTp는 ISO 15765-2 표준을 기반으로 작동하며, 두 가지 전송 방식을 제공합니다.
📌 2.1. CanTp의 전송 방식
1️⃣ Single Frame (단일 프레임 전송)
- 8바이트 이하의 데이터는 하나의 CAN 메시지에 담아 전송 가능
- 데이터가 7바이트 이하일 경우 사용
- 구성: SF (Single Frame) + 데이터
2️⃣ Multi Frame (다중 프레임 전송)
- 8바이트를 초과하는 데이터를 전송할 때 사용
- 데이터를 여러 개의 CAN 프레임으로 나누어 전송
- 구성
- First Frame (FF): 처음 전송되는 프레임으로 전체 데이터 길이를 포함
- Consecutive Frame (CF): 나머지 데이터 조각을 포함
- Flow Control Frame (FC): 수신 측에서 송신 속도를 조절하기 위해 사용
🔹 3. CanTp 전송 과정 (Multi Frame 예제)
✅ 예제: 30바이트 데이터 전송 과정
1️⃣ First Frame (FF) 전송
- 데이터가 30바이트로 8바이트 초과이므로, Multi Frame 방식 사용
- First Frame(FF)은 전체 데이터 길이 정보(30바이트)를 포함
- 이후 데이터를 분할하여 송신
2️⃣ Flow Control (FC) 프레임 응답
- 수신 ECU는 Flow Control (FC) 프레임을 보내 송신을 계속할 수 있도록 허용
- FC 프레임에는 Block Size (BS), Separation Time (ST) 정보 포함
3️⃣ Consecutive Frame (CF) 전송
- 남은 데이터를 여러 개의 CF 프레임에 나누어 전송
- 송신 측은 FC 프레임에서 지정한 BS, ST를 준수하여 전송
🔹 4. CanTp의 AUTOSAR 계층 구조
CanTp는 AUTOSAR BSW (Basic Software) 계층의 일부이며, 다른 모듈과 협력하여 동작합니다.
계층 관련 모듈
Application Layer | UDS (Unified Diagnostic Services), OTA Update |
Service Layer | DCM (Diagnostic Communication Manager) |
Communication Layer | CanTp (CAN Transport Protocol) |
CAN Interface Layer | CanIf (CAN Interface) |
Microcontroller Abstraction Layer | CAN Driver |
✅ CanTp는 DCM과 연계되어 사용되며, CanIf를 통해 CAN Driver로 데이터가 전달됩니다.
🔹 5. CanTp의 주요 AUTOSAR 설정
CanTp를 설정하기 위해서는 CanTp_ConfigType 구조체를 설정해야 합니다.
📌 5.1. CanTp의 주요 설정 요소
- CanTpTxChannel: 송신 채널 설정
- CanTpRxChannel: 수신 채널 설정
- CanTpBlockSize (BS): 송신 시 한 번에 전송할 데이터 블록 크기
- CanTpSTmin (Separation Time, ST): 프레임 간 최소 대기 시간
- CanTpPadding: CAN 프레임의 패딩 설정
🔹 6. CanTp C 코드 예제
✅ 6.1. CanTp 설정 예제
#include "CanTp.h"
CanTp_ConfigType CanTpConfig = {
.CanTpTxChannel = 1, // 송신 채널
.CanTpRxChannel = 1, // 수신 채널
.CanTpBlockSize = 8, // Flow Control에서 한번에 받을 블록 크기
.CanTpSTmin = 10 // 송신 프레임 간 대기 시간 (10ms)
};
void InitializeCanTp(void) {
CanTp_Init(&CanTpConfig); // CanTp 초기화
}
✅ 6.2. CanTp 데이터 송신 예제
#include "CanTp.h"
uint8_t data[30] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10,
0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E};
void SendCanTpMessage(void) {
CanTp_Transmit(1, data, sizeof(data)); // 채널 1을 통해 데이터 전송
}
✅ 6.3. CanTp 데이터 수신 예제
#include "CanTp.h"
void CanTp_ReceiveCallback(uint8_t channel, uint8_t* data, uint16_t length) {
printf("수신된 데이터 (채널 %d, 길이 %d): ", channel, length);
for (int i = 0; i < length; i++) {
printf("%02X ", data[i]);
}
printf("\n");
}
void InitializeCanTpReceiver(void) {
CanTp_RegisterReceiveCallback(CanTp_ReceiveCallback); // 수신 콜백 등록
}
🔹 7. CanTp의 주요 오류 및 해결 방법
오류 원인 해결 방법
데이터 전송 중단 | Flow Control 프레임 미수신 | 수신 ECU가 FC 프레임을 보내는지 확인 |
데이터 손실 발생 | CAN 버스 부하 과다 | STmin을 조절하여 프레임 간격 늘리기 |
송신 속도 느림 | Block Size(BS)가 너무 작음 | BS 값을 증가시켜 여러 개의 프레임을 한 번에 전송 |
🔹 8. 결론
✅ CanTp는 CAN 네트워크에서 8바이트 이상의 데이터를 효율적으로 전송할 수 있도록 도와주는 모듈입니다.
✅ UDS 진단 메시지 전송 및 OTA 업데이트 같은 자동차 통신에서 필수적인 역할을 수행합니다.
✅ AUTOSAR 환경에서는 CanTp가 DCM과 연계되어 동작하며, CanIf 및 CAN 드라이버를 통해 CAN 버스를 제어합니다.
🚗 CanTp 모듈을 활용하면, 자동차 내에서 대용량 데이터를 안정적으로 주고받을 수 있습니다! 🚀
'개발 > 그 외 개발관련' 카테고리의 다른 글
일반 증가 연산 vs 원자적 증가 연산 차이점 ( counter++ ) (0) | 2025.02.05 |
---|---|
원자적 접근 (Atomic Access) C++? (0) | 2025.02.05 |
BSW(Basic Software)에서 ComM 모듈 (0) | 2025.02.03 |
AUTOSAR Communication Manager(ComM) 네트워크 상태 자세히 알아보기 (1) | 2025.01.24 |
AUTOSAR Classic Platform과 Adaptive Platform의 상세 비교 (0) | 2025.01.20 |