Медиасистема для Toyota Prius (часть 2)

Продолжение проекта по замене медиасистемы Toyota Prius.

В этой статье — PHY, Transport, и доставка пакетов до хост-девайса, которую наконец-то удалось проверить на реальной родной голове приуса.

Быстро сказка сказывается, да не быстро дело делается. Сегодня продолжаю затяжной проект по переделке медиасистемы в Prius, начатый 2 года назад.

Исторический оффтоп
На самом деле — адаптер USB-AVC физически собран достаточно давно, и пакеты принимать он тоже научился намного раньше. Но у меня были сомнения относительно его поведения на реальной шине, а проверить возможности не было, т.к. тащить и подключать в машину конструкцию ноут+отладчик+плата — просто не было ни времени, ни желания.

Но случилось так, что доблестные дорожные службы, так тщательно спонсируемые мной во время прохождения ТО, забыли починить тормоза в МАЗе, и моему приусу пришлось вырабатывать дополнительное тормозное усилие для уборочной техники.

Ну, а пока он стоит в покраске, я снял с него голову, и проверил PHY-часть схемы.


Итак, с самого начала. Копаясь в интернете на предмет адаптеров к AVC-LAN, я очень часто видел решения, похожие на вот такое. И в обсуждении нередко проскакивают вот такие комментарии:

Честно говоря не очень хорошо работает, точнее не со всеми головами хорошо работает.

Пока идеально читается шина на какой-то старинной магнитоле со Spacio 99 года.

Я изначально настроен принципиально против того, чтобы делать «как нибудь», и решения с конструктивно заложенной нестабильностью меня не устраивают.
Будем повторять путь реверс-инженеринга шины. Поехали.

Первым делом, подключаемся к шине на живом авто, и снимаем осциллограммы:

ccczuftggnmbqqtebaewgwcx_3e.png
Начало пачки.

acv-wuwaaoywpav08fjqekdyaq8.png
Биты где-то в середине, крупнее.

l3cyba6lailk2fcxp9274-eltlk.png
Что-то очень похожее на ACK.

Чуть подробнее про эту странную ступеньку — ниже.

Скрины осциллограмм делал уже из сохраненных данных, во время снятия не сразу обратил внимание на диапазон по напряжению, в котором снимал данные. А когда обратил — пришлось спускаться в машину еще раз, чтобы убедиться, что из ума не выжил. Да-да, размах дифференциальной шины — всего лишь 200 мВ (!!!).

Дальше идем в даташит на применяемый коллегами ST485, и видим там следующее:

dmuin85kauk3hwji9d6w4d2dx5w.png

Вот, собственно, и нашелся корень всех бед, из-за которых приходится играться с резисторами, и молить канифольных богов, чтобы преобразователь заработал на конкретной машине. Работать рядом с пороговыми значениями — зло. Но еще интереснее то, что для AVC-LAN, которая по физике своей — клон какой-то IE-Bus от NEC — по своей спецификации (ссылка будет чуть дальше) считает активным состоянием напряжение выше 120 мВ, при том, что ST485 имеет право считать все, что меньше 200 мВ — нулем. Ну, то есть, если из-за производственных отклонений ST485 будет иметь пороговый уровень чуть ниже, а на шине для запаса появится чуть выше нормы (допускается до 6-ти вольт), то, конечно, ST485 сможет принять такой сигнал. И эти производственные неточности — единственное, что заставляет устройства с ST485 в составе иногда работать. Разумеется, закладывать такое счастье в разработку мы не будем.

Второе имеющееся решение на базе того же ST485 и операционного усилителя мне не понравилось обилием компонентов. Ну, в 21-м же веке живем, в конце концов.

Решение:
Для AVC-LAN существуют специальные преобразователи. Но мне не удалось достать их по приемлемой для этого девайса цене. На помощь снова пришел братский Китай, где была обнаружена HA12240FP, у которой разница напряжений для восприятия лог.»1» по даташиту составляет 80…110 мВ. Это позволит нашей шине выставить активный уровень с почти двукратным запасом. Устраивает.

Рожаем схему на упомянутом в первой части STM32F103:

dsmjeylhhd1tldlydzj7kdf8yky.png

Все просто до примитивизма, думаю, в описании не нуждается. За исключением, разве что, того факта, что выбор ног для RX1/2 — не случаен, и первая версия схемы потребовала «доработки напильником», чтобы завести сигналы на входы захвата/сравнения, ибо именно его я хочу использовать для измерения длины импульса. Альтернативные решения — поллинг и прерывание по изменению состояния проигрывают по точности и сложности программной реализации. Плюс — хотелось бы параллельного приема минимум с двух линий (в «голове» их — вообще три), а при совпадении фронтов на двух можно попрощаться с мыслью о сколь-нибудь приемлемой точности, если не использовать захват/сравнение.

Дальнейший разбор данных в пакет хорошо расписан тут. Но, учитывая, что ссылки — штука непостоянная, вкратце повторюсь здесь:

  • Шина дифференциальная, тут пишут про трактовку уровней лог.»1» при <20mV, лог. «0» — >110mV.
  • Длина бита — 40 мс, первые 20 мс — всегда »0», последние 7 мс — всегда »1», посредине — значение бита.
    vv6__8pbidlx43eqnvjbupnee3g.png

    ну и светофорчик:

    i1u2k-ji3f5mckou9r7mut6nzkm.png

  • Стартовый бит — длиннее 180 мс
  • В конце некоторых частей пакета следует бит подтверждения (ACK). Осциллограмма получилась очень «говорящей», и я ее чуть-чуть разукрасил:

    pgslhqq84ha2ytwegw9njtlq6we.png

    Принцип передачи ACK-бита очень похож на тот, что происходит в Dallas 1-wire, только тут у нас два провода, и драйверы, похоже, токовые. Потому на рисунке видно, как в т. 1 мастер начинает передачу битового фрейма, переводя линию в активный уровень »0» (то есть, подавая на нее напряжение), почти сразу же в т.2 подключается ведомый, тоже форсируя шину в активный уровень, и их усилия складываются, повышая напряжение вдвое. В т.3 видно, что мастер отпускает шину в неактивный уровень (1), но ее продолжает удерживать ведомый, и только его усилиями напряжение на шине остается в активном нуле, и на последних 7 мс шина освобождается, возвращаясь в неактивную лог.»1».


Что ж… с физическим уровнем разобрались, схему нарисовали, плату развели. Получилось что-то вот такое:

_d4ygj2rf315jb9yqodcdfh7dda.png

fuomrmmvbepdwmvpiqrmh1efezm.png

Печатная плата вышла несколько неудачно, и не потому, что не получился QR-код в шелкографии. В ней есть ошибка в схеме (на схеме выше я ее уже исправил) в части выбора ног для RX, и разведено три драйвера линии. В процессе написания и отладки программы я понял, что хорошо, если удастся запустить устойчиво хотя бы два. Да больше и не нужно.

Что ж… девайс получился простым и эффективным, при этом конструктивная проблема с несоответствием уровней решена.

Далее в программе:

  1. Прошивка для контроллера этого преобразователя. Забегая вперед скажу, что пришлось отказаться от идеи с составным девайсом. Причины две: * в приехавшей магнитоле нет необходимости добавлять кнопки по USB — кнопки резистивные как с руля, так и на панели, есть нативный способ их «обучить» и назначить. Проще пойти этим путем. * Испытания на разных версиях Андроида показали, что более или менее адекватно андроид с составными девайсами работает в версии 8, в 6-й я сильно не разбирался, а с 4.4 определенно имеются проблемы. Когда драйвер андроида открывает клавиатуру составного устройства, он блокирует устройство целиком, и больше ничего на нем октрыть невозможно.
  2. Андроид-монитор для полного реверса логики шины. Если кто-то силен в Андроид и Котлин — буду признателен за возможность консультаций. Это робкие попытки освоения всего и сразу, потому в репозиторий по ссылке без ново-пассита не заходить :)

© Habrahabr.ru