Обзор Протокола ISO-TP [ISO 15765-2]

32e70198f082106dce0e8538172f0e34.png

Пролог

Как известно в классический CAN пакет можно поместить ну максимум 8 байт полезных данных (MTU=8).

бинарная структура CAN classic пакета

бинарная структура CAN classic пакета

Одновременно с этим в реальной жизни данные могут быть существенно больше чем 8 байт. В связи с этим возникает противоречие.

Как передать jumbo frame (ы), например, по 512–1024 байт пакет каждый кусками по 8 байт так, чтобы на принимающей стороне могли однозначно распознать начало и конец каждого массива?

Эту задачу как раз и призван решить протокол с названием ISO 15765–2. Его ещё называют ISO-TP.

В этом протоколе фигурирует адрес. Однако он берется из пакета канального уровня. По сути адрес CAN-Frame (ма)

Что надо из спецификаций?

Код спеки

Пояснение

pages

2

ISO 11899–2

 Controller area network

?

3

ISO-15765

Transport Layer

60

Теория ISO 15765–2 (ISO-TP)

Протокол ISO 15765–2 это бинарный последовательный master-slave протокол. Причем роли не постоянные. Один ECU может быть сначала мастером потом slave (ом). Протокол ISO-TP в классической версии может передавать до 4095(0xFFF) байт за раз. В абстрактной модели OSI-7 протокол ISO-TP занимает сетевой (ISO-3 network layer) и транспортный (ISO-4 transport layer) уровни.

af223bc1e6d868bb270f9bce661676c1.png

В протоколе ISO-TP всего-навсего 4 формата пакета: Single frame, First frame, Consecutive frame и Flow control frame. Вот их перечень.

https://docs.google.com/spreadsheets/d/1z6TwPQtFTTmuP6gTpR7UHynesrAnW024_vWKVmCih9g/edit#gid=624540658список легальных пакетов протокола 15765-2

Иногда ещё показывают эту картинку. CAN-ID это адрес получателя. Пакеты ISO-TP всегда должны быть размером 8 байт. Если данных не достаточно то следует заполнять оставшийся payload канального CAN пакета константами padding (0×00 или 0×55).

список легальных пакетов протокола 15765-2

список легальных пакетов протокола 15765–2

У каждого пакета есть свой код (FrameID). В самом простом вырожденном случае кода размер paylod меньше или равен 7 байтам ISO-TP просто посылает Single Frame.

d27f4ebeaae952fab9b75d70e9615068.png

На Single Frame даже отвечать не надо ибо физический и канальный уровень шины CAN сами гарантируют разрешение коллизий, саму доставку битом подтверждения приема и проверку CRC15 в канальном CAN пакете на уровне MAC.

В случае когда данных в payload (e) больше чем 7 байт, то payload требуют дробления. Сначала посылается First frame, который сообщает сколько будет данных. Для этого у него есть 12 бит для переменной Data Len. Получается, что можно передать максимум 4096 байт. Это бинарный протокол big endian компоновкой.

ISO-TP — это диалоговый протокол. Оба устройства обязаны вести себя согласно протоколу.

Приёмник в нужное время должен отвечать пакетом Flow control. Пакет Flow control используется для конфигурирования последующего общения учитывая способности приёмника. Поле Flag может принимать следующие значения

Flag value, dec

Flag value bin

интерпретация

0

0b0000

continie to send

1

0b0001

Wait

2

0b0010

overflow/abort

Поле Block size сообщает мастеру сколько пакетов могут быть отправлены без контроля потока.

Значение параметра BS=0×00 должно использоваться для указания отправителю, что во время передачи раздробленного сообщения больше не будут отправляться кадры FC. Отправитель может смело отправить все оставшиеся последовательные кадры без остановки для дальнейших кадров FC от принимающего устройства сетевого уровня.

Проще говоря значение BS=0×00 интерпретируется, как оставшиеся пакеты могут быть отправлены без контроля потока. Любое положительное число в поле block size явно указывает количество пакетов которые можно смело отправить мастеру.

Поле Sepatation time (ST) указывает временной интервал который следует выдержать мастеру между отправками оставшихся пакетов.

Значение поля ST

единица измерения

минимальное значение

максимальное значение

0×00…0×7F

миллисекунды

0ms

127ms

0xF1…0xF9

сотни микросекунд

100us

900us

В качестве заполнителя рекомендуется прописывать либо 0×00 либо 0xAA.

Можно заметить, что в протоколе ISO 15765–2 заголовки имеют разный размер.

список заголовков пакетов протокола 15765-2

список заголовков пакетов протокола 15765–2

В первом байте заголовка и вовсе помещаются аж две переменные! То есть для реализации этого протокола потребуются манипуляция с битами и битовые поля.

Адресация устроена весьма хитро. В CAN ID протокол ISO-TP инкапсулирует свой адрес N_SA (8bits) и адрес назначения N_TA (8bits). Но это не единственный вариант адресации. В самой простой реализации ISO-TP мастер просто прописывает адрес того CAN узла к которому он хочет обратиться, а Slave отвечает своим адресом.

Вот так можно представить временную диаграмму передачи данных по протоколу ISO 15765–2

c0a133a1eb113f8e3e2d03f186ae3140.png

Все переменные протокола ISO 15765–2 можно представить вот в этом реестре

https://docs.google.com/spreadsheets/d/1z6TwPQtFTTmuP6gTpR7UHynesrAnW024_vWKVmCih9g/edit#gid=1271971035

Реализация

Когда говорят о реализации какого бы то ни было бинарного протокола, то обычно всё сводится к тому, что следует скомпоновать конечный автомат, который и будет нужные стимулы интерпретировать в нужные реакции. Для протокола ISO-TP, в первом приближении, конечный автомат может выглядеть вот так.

27964471d1cb8ae55886f2137d48eb22.JPG

Есть всего 4 явных состояния.

5353abece42b4924de834e1b45786bcd.png

Входами для этого автомата могут выть вот эти события

c828b5d5413b75fcb7d66d844968e2bd.png

А это список легальных действия для данного автомата

2c89eee7f7834ba7f17f2481c0f725e3.png

Отладка

Так как протокол это чисто работа с массивами, то и отлаживать протоколы можно прямо на NetTop PC. На написал консольное приложение, которое пуляет массивы по протоколу ISO-TP между двумя экземплярами протокола ISO-TP. Вот так выглядит лог общения двух воображаемых CAN устройств между собой.

228deef6c392ee128a61c967d33960d7.png

Как видно массив 000102030405060708090a0b0c0d0e0f1011121314151617 успешно передан от передатчика к приёмнику!

Достоинства протокола ISO-TP

++Есть контроль потока. Это 4х битное поле Serial Number (SN, index) в пакете Consecutive Frame (CF). Если пакет потеряется, то приемник это сможет зарегистрировать.

Недостатки протокола ISO-TP

--В пакете Consecutive Frame отсутствует длина payload в этом конкретном пакете.

1e1c2993be8101099a0a7654d4881aad.png

В связи с этим, когда присылается самый последний пакет, то там может быть больше данных чем нужно. Приемник может dadding принять за байты c данными, прописать их в RAM память и, тем самым, выйти за границы массива, повредить память. Поэтому приёмник ISO-TP обязан всегда помнить сколько байт ему обещал прислать передатчик. Это прописано в 12 битном поле Data Length в пакете First Frame.

665d9ba3902182894cf1baf211d032a8.png

Приёмник должен контролировать заполнение результирующего массива!

Итоги

Надеюсь этот текст позволит кому-нибудь лучше понять суть бинарного протокола ISO-TP, реализовать его и использовать в своих проектах. Этот протокол можно попробовать использовать не только для CAN, но и в других интерфейсах, например LoRa/GFSK трансиверах. Там тоже присутствует ограничение на MTU для физического уровня. Везде где MTU имеет свои пределы можно применить протокол ISO-TP.

Словарь

акроним

расшифровка

Topic

ECU

Electronic Control Units

HW

TP

Transport Protocol

ISO

International Organization for Standardization

DOC

PCI

Protocol Control Information

ISO-TP

SF

Single Frame

ISO-TP

FC

Flow Control

ISO-TP

PDU

Protocol Data Unit

--

MTU

Maximum transmission unit

--

CAN

Controller area network

PHY

N_AI

address information

ISO-TP

Контрольные вопросы:

1--Как приемник поймет какому CAN ID ему отвечать, если в CAN пакете только ID получателя?

2--Нужно ли отвечать на пакет Single Frame (SF)?

Links\URLs
UDS Explained — A Simple Intro (Unified Diagnostic Services) https://www.csselectronics.com/pages/uds-protocol-tutorial-unified-diagnostic-services

Протокол UDS https://canhacker.ru/protocol-uds/

ISO 15765–2 https://en.wikipedia.org/wiki/ISO_15765–2

Подробная детализация бинарной структуры пакетов ISO-TP https://docs.google.com/spreadsheets/d/1z6TwPQtFTTmuP6gTpR7UHynesrAnW024_vWKVmCih9g/edit#gid=624540658

Introduction to CAN-TP (ISO 15765) Tutorial https://piembsystech.com/can-tp-protocol/

© Habrahabr.ru