# CAN 네트워크를 위한 Raccoon Developers의 ISO-TP 드라이버 실전 분석
ISO-TP (ISO 15765-2)는 CAN classic의 프레임당 8바이트 제한을 대형 데이터 배열을 분할함으로써 해결합니다. Raccoon Developers의 드라이버는 초기화, 송신, 수신 프레임 큐잉, 처리라는 네 가지 핵심 함수를 통해 프로토콜을 구현합니다. FIFO 큐를 사용해 프레임 조립으로 최대 4094바이트 패킷을 지원합니다.
드라이버 API:
n_rslt iso15765_init(iso15765_t* instance);
n_rslt iso15765_send(iso15765_t* instance, n_req_t* frame);
n_rslt iso15765_enqueue(iso15765_t* instance, canbus_frame_t* frame);
n_rslt iso15765_process(iso15765_t* instance);
초기화에는 업타임, 프레임 송신, 오류 처리, 수신 완료 알림을 위한 콜백이 필요합니다. BS (블록 크기), STmin (분리 시간), 주소 지정 형식, 최대 패킷 크기 등을 설정할 수 있습니다.
의존성 및 내부 구조
드라이버는 수신 CAN 프레임을 저장하는 범용 iqueue 큐에 의존합니다. I15765_QUEUE_ELMS 상수는 버퍼 깊이를 정의합니다.
i_status iqueue_init(iqueue_t* _queue, uint32_t _max_elements,
size_t _element_size, void* _storage);
i_status iqueue_enqueue(iqueue_t* _queue, void* _element);
i_status iqueue_dequeue(iqueue_t* _queue, void* _element);
수신 과정에서는 FirstFrame과 ConsecutiveFrame으로부터 데이터를 재조립해 완전한 페이로드를 만듭니다. 완료되면 전체 페이로드와 함께 indn() 콜백이 호출됩니다. 콜백 처리 후 데이터가 지워집니다.
iso15765_send()를 통한 송신은 최대 4094바이트(12비트 길이 필드)를 지원합니다. 단일 프레임은 최대 8바이트, 멀티 프레임은 순차 블록과 확인 응답을 사용합니다.
하드웨어 없이 테스트
모듈러 테스트는 하나의 프로그램에서 세 개의 ISO-TP 인스턴스 간 교환을 시뮬레이션합니다. 송신 콜백을 수신자의 enqueue로 리다이렉트합니다. 송신 및 수신 페이로드의 CRC32를 비교합니다.
24바이트 송신 테스트의 예시 로그:
- TxSize:24 Byte, TxCrc32:0x8295A696
- RxFirstFrame: MesgSize:24 Byte
- ConsecutiveFrame: SN=1, Payload:000102...17181920212223
- DataMatch! Size:24 Byte
이 테스트는 올바른 조립과 검증을 확인합니다. 소요 시간: ~863 ms.
USB-CAN에서의 하드웨어 검증
실제 트래픽을 위해 USB2CANFD_V1 어댑터를 사용합니다. CANcat은 ISO-TP를 위한 netcat 같은 콘솔 유틸리티입니다.
성공 사례:
- 프로세스 간 0x3344556656565656565656 전송.
- 0xd에서 0xc로 점보 프레임 0x11223344556677889900aabbccddeeff 전송.
- 양방향 단일 프레임.
로그는 FirstFrame (FS=0, BS=3), ConsecutiveFrame, flow control의 올바른 처리를 보여줍니다.
주요 장점 및 제한사항
장점:
- 독립 설정이 가능한 다중 인스턴스 (CAN, UART).
- 순수 C, 핵심 코드 약 1000줄.
- 재컴파일 없이 양방향 모드 지원.
제한사항:
- -Werror=strict-prototypes 옵션으로 컴파일되지 않음.
- 동시 Tx/Rx 불가 — 송신이 수신을 중단시킴.
- 마스터 손실 시 ConsecutiveFrame 무한 대기.
- CAN classic 단일 프레임에서 8-15바이트를 그대로 해석하며 검사하지 않음.
중요한 점
- ISO-TP over UDS가 필요한 CAN 기반 임베디드 프로젝트에 적합.
- 슈퍼루프 처리: Rx에서 enqueue, 고주파 process, 요청 시 send.
- indn() 호출 후 페이로드가 지워지므로 콜백 내에서 데이터 복사.
- 하드웨어 테스트 전에 모듈러 테스트로 알고리즘 검증.
- 12비트 길이 필드로 인해 세션당 최대 4094바이트.
— Editorial Team
아직 댓글이 없습니다.