홈으로 돌아가기

CAN용 ISO-TP 드라이버: 구현 및 테스트

이 기사는 Raccoon Developers의 ISO-TP 드라이버를 분석하며 CAN을 통해 최대 4094바이트 배열 전송. API, dependencies, unit tests 및 USB-CAN을 사용한 hardware validation 설명. 다중 인스턴스 장점과 동시 Tx/Rx 제한 강조.

CAN에서 ISO-TP 테스트: raccoon 드라이버 작동
Advertisement 728x90

# 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 (분리 시간), 주소 지정 형식, 최대 패킷 크기 등을 설정할 수 있습니다.

Google AdInline article slot

의존성 및 내부 구조

드라이버는 수신 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바이트, 멀티 프레임은 순차 블록과 확인 응답을 사용합니다.

Google AdInline article slot

하드웨어 없이 테스트

모듈러 테스트는 하나의 프로그램에서 세 개의 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.

Google AdInline article slot

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

Advertisement 728x90

다음 읽기