Пролог

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

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

бинарная структура 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) уровни.

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

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

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

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

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

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

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

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

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

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

На 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 сообщает мастеру ISO-TP сколько пакетов могут быть отправлены без контроля потока.

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

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

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

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

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

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

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

0x00…..0x7F

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

0ms

127ms

0xF1…..0xF9

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

100us

900us

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

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

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

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

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

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

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

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

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

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

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

Реализация

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

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

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

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

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

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

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

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

Отладка

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

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

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

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

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

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

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

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

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

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

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

Итоги

Надеюсь этот текст позволит кому-нибудь лучше понять суть бинарного протокола 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)?

LinksURLs
–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/

–19 Атрибутов Хорошего Канального Протокола Передачи Данных https://habr.com/ru/articles/682292/