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.
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.
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.
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
Zatím žádné komentáře.