Введение
Как многим известно, не все контроллеры с поддержкой CAN-FD одинаково полезны, поскольку существует 2 реализации:
- Первая версия протокола CAN FD, описанная в документа от Роберта Боша в 2012г (эта версия также известна как non-ISO CAN FD)
- Вторая версия протокола CAN FD, стандартизованная как обновленный ISO11898-1 в 2015г (эта версия встречается под рекоммендованом CiA термином ISO CAN FD)
Версии CAN FD
Часто сложно понять какая же версия CAN FD реализована (особенно если речь идёт о первой версии — производители не очень красноречивы), но есть косвенные признаки:
- упоминание в спецификации SBC (или Staff bit counter)
- упоминание в программной модели бита переключения режимов FD: ISO/nonISO
При отсутствии этих признаков Вы, скорее всего, имеете дело с nonISO CAN FD. Важно отметить, что эти версии несовместимы между собой, однако на рынке до сих пор находится некоторое количество оборудования, поддерживающего только nonISO CAN FD (само собой в режиме передачи кадров традиционного CAN 2.0 совместимость присутствует). Для всех новых разработок настоятельно рекомендуется использование именно ISO CAN FD реализации. С точки зрения ПО и взаимодействия с регистровой моделью отличия версий никак не проявляются (различия протоколов никак не видны пользователю).
Отличия реализаций CAN FD
Для контроля целостности данных в пакетах традиционного CAN применяют CRC-кодирование 15-битным полиномом с хемминговым расстоянием равным 6-ти (означающим способность обнаружить любые 5 ошибок, случаным образом внесённые в пакет, либо до 15-ти подряд идущих ошибок битов). В реализации CAN FD это CRC был улучшен полиномом большей длины, поскольку хемминогово расстояние уменьшается с ростом длины пакеда данных. Это позволило сохранить ту же вероятность детектирования ошибок что и в традиционном CAN (несмотря на то, что CRC традиционного CAN попрежнему обеспечивал для кадров CAN FD обнаружение одной ошибки и весьма низкую вероятность необнаружения нескольких ошибок).
CAN FD использует 17-битный CRC с полиномом [x17 + x16 + x14 + x13 + x11 + x6 + x4 + x1 + x0] для пакетов длиной до 16 байт включительно, и 21-битный CRC с полиномом [x21 + x20 + x13 + x11 + x7 + x4 + x3 + x0] для пакетов большей длины, оба с хемминоговым расстоянием равным 6-ти для соответствующих длин пакетов.
Также в поле CRC стандарта CAN FD изменено правило бит-стаффинга: введено понятие т.н. FSB (Fixed stuff-bits) — независимых стаффинг-битов, всегда вставляемых через каждые 4 бита поля CRC и имеющих всегда инверсное по отношению к предшествующему биту значение.
Выше было описано то, что присутствует в обеих реализациях CAN FD. Дополнительно к вышеуказанному реализация ISO CAN FD предполагает наличие т.н. SBC (Stuff bit counter) — трёхбитного счётчика стаффинг-битов (сам счётчик считает в коде Грея по модулю 8) с защитой контролем чётности, который используется для раннего детектирования любой одиночной ошибки (сам счётчик считает в коде Грея по модулю 8). FSB-бит, следующий после бита чётности SBC, часто называют вторым битом чётности, поскольку он всегда имеет инверсное к биту чётности значение.
В итоге такое маленькое, но принципиальное отличие сделало несовместимым между собой ранюю и ISO-стандартизованную реализации CAN FD.