Zpět na domů

ISO-TP řidič: implementace a testy pro CAN

Článek rozebírá řidič ISO-TP od Vývojáři Enoti pro přenos polí až 4094 bajtů přes CAN. Jsou popsána API, závislosti, modulární testy a hardwarová validace s USB-CAN. Jsou vyzdviženy výhody více instancí a omezení současného Tx/Rx.

Testujeme ISO-TP na CAN: řidič Enotů v akci
Advertisement 728x90

Praktický rozbor ovladače ISO-TP od Vývojáři-Enovoti pro CAN sítě

ISO-TP (ISO 15765-2) řeší problém omezení CAN classic na 8 bajtů na rámec fragmentací velkých polí dat. Ovladač od Vývojáři-Enovoti implementuje protokol prostřednictvím čtyř klíčových funkcí: inicializace, odeslání, zařazení příchozích rámců do fronty a zpracování. Podporuje pakety až do 4094 bajtů s využitím FIFO fronty pro sestavení rámců.

API ovladače:

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);

Inicializace vyžaduje callbacky pro up-time, odesílání rámců, zpracování chyb a indikaci příjmu. Nastavují se BS (velikost bloku), STmin (minimační separační čas), typ adresování a maximální velikost balíčku.

Google AdInline article slot

Závislosti a vnitřní architektura

Ovladač závisí na univerzální frontě iqueue pro ukládání příchozích CAN rámců. Konstanta I15765_QUEUE_ELMS určuje hloubku bufferu.

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);

Příjem sbírá data z FirstFrame a ConsecutiveFrame do mozaiky. Po dokončení se volá callback indn() s úplným payloadem. Data se mažou po zpracování v callbacku.

Odeslání přes iso15765_send() podporuje až 4094 bajtů (12bitové pole délky). Single frame do 8 bajtů, multi-frame — sekvenční bloky s potvrzeními.

Google AdInline article slot

Testování bez hardwaru

Modulové testy simulují výměnu mezi třemi instancemi ISO-TP v jednom programu. Callback send je přesměrován na enqueue příjemce. Porovnává se CRC32 odeslaného a přijatého payloadu.

Příklad logu testu odeslání 24 bajtů:

  • TxSize:24 Byte, TxCrc32:0x8295A696
  • RxFirstFrame: MesgSize:24 Byte
  • ConsecutiveFrame: SN=1, Payload:000102...17181920212223
  • DataMatch! Size:24 Byte

Test potvrzuje správné sestavení a ověření. Doba trvání: ~863 ms.

Google AdInline article slot

Hardwarová validace na USB-CAN

Pro reálný provoz se používá adaptér USB2CANFD_V1. CANcat — konzolová utilita podobná netcat pro ISO-TP.

Úspěšné příklady:

  • Přenos 0x3344556656565656565656 mezi procesy.
  • Jumbo-frame 0x11223344556677889900aabbccddeeff od 0xd k 0xc.
  • Single frame oběma směry.

Logy ukazují správné zpracování FirstFrame (FS=0, BS=3), ConsecutiveFrame a flow control.

Klíčové výhody a omezení

Výhody:

  • Více instancí s nezávislou konfigurací (CAN, UART).
  • Čistý C, ~1000 řádků jádra.
  • Bidirekční režim bez překompilace.

Omezení:

  • Nekompiluje se s -Werror=strict-prototypes.
  • Žádná současná Tx/Rx — odeslání přeruší příjem.
  • Nekonečné čekání na ConsecutiveFrame při ztrátě mastera.
  • Single frame v CAN classic interpretuje 8-15 bajtů doslova, bez kontroly.

Co je důležité

  • Ovladač je vhodný pro embedded projekty s CAN, kde je potřeba UDS přes ISO-TP.
  • Zpracování v super cyklu: enqueue na Rx, process s vysokou frekvencí, send na požádání.
  • Payload se maže po indn() — kopírujte data uvnitř callbacku.
  • Testujte modulově před hardwarem pro ověření algoritmu.
  • Maximum 4094 bajtů za relaci kvůli 12bitovému poli délky.

— Editorial Team

Advertisement 728x90

Číst dál