Пролог
Как известно в классическом CAN пакете можно поместить ну максимум 8байт полезных данных (MTU=8).
Одновременно с этим, в реальной жизни данные могут быть существенно больше, чем 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 всего-навсего 4 формата пакета: Single frame, First frame, Consecutive frame и Flow control frame. Вот их перечень.
Иногда ещё показывают эту картинку. CAN-ID это адрес получателя. Пакеты ISO-TP всегда должны быть размером 8 байт. Если данных не достаточно то следует заполнять оставшийся payload канального CAN пакета константами padding (0x00 или 0x55).
У каждого пакета есть свой код (FrameID). В самом простом вырожденном случае, когда размер payload меньше или равен 7-ми байтам, то ISO-TP просто посылает Single Frame.
На 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 заголовки имеют разный размер.
В первом байте заголовка и вовсе помещаются аж две переменные! То есть для реализации этого протокола потребуются манипуляция с битами и битовые поля.
Адресация
Адресация устроена весьма хитро. В CAN ID протокол ISO-TP инкапсулирует свой адрес N_SA (8bits) и адрес назначения N_TA(8bits). Но этот вариант пригоден для Extended CAN адресов. Есть же еще крохотные Standart CAN адреса. Поэтому это не единственный вариант адресации. В самой простой реализации протокола ISO-TP плата всегда испускает в CAN пакеты подписывая их только своим CAN-ID. Заинтересованный в этом ID узел отвечает. В результате никто не к кому не обращается явно.
Вот так можно представить временную диаграмму передачи данных по протоколу ISO 15765-2
Все переменные протокола ISO 15765-2 можно представить вот в этом реестре
Реализация
Когда говорят о реализации какого бы то ни было бинарного протокола, то обычно всё сводится к тому, что следует скомпоновать конечный автомат, который и будет нужные стимулы интерпретировать в нужные реакции. Для протокола ISO-TP, в первом приближении, конечный автомат может выглядеть вот так.
Есть всего 4 явных состояния.
Входами для этого автомата могут выть вот эти события
А это список легальных действия для данного автомата
Отладка
Так как протокол это чисто работа с массивами, то и отлаживать протоколы можно прямо на NetTop PC. Я написал консольное win приложение, которое пуляет массивы по протоколу ISO-TP между двумя экземплярами протокола ISO-TP. Вот так выглядит лог общения двух воображаемых CAN устройств между собой.
Как видно массив 000102030405060708090a0b0c0d0e0f1011121314151617 успешно передан от передатчика к приёмнику!
Достоинства протокола ISO-TP
++Есть контроль потока. Это 4х битное поле Serial Number (SN, index) в пакете Consecutive Frame (CF). Если пакет потеряется, то приемник это сможет зарегистрировать.
Недостатки протокола ISO-TP
--В пакете Consecutive Frame отсутствует длина payload в этом конкретном пакете.
В связи с этим, когда присылается самый последний пакет, то там может быть больше данных чем нужно. Приемник может принять padding байты за байты c данными, прописать их в RAM память и, тем самым, выйти за границы массива. Далее программа тихо падает. Поэтому приёмник ISO-TP обязан всегда помнить сколько байт ему обещал прислать передатчик. Это прописано в 12-битном поле Data Length в пакете First Frame.
Приёмник должен контролировать заполнение результирующего массива!
Итоги
Надеюсь этот текст позволит кому-нибудь лучше понять суть бинарного протокола 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--Как ISO-TP приемник поймет какому CAN ID ему отвечать, если в CAN пакете First Frame только 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/
--19 Атрибутов Хорошего Канального Протокола Передачи Данных https://habr.com/ru/articles/682292/