Продолжение проекта по замене медиасистемы Toyota Prius.
В этой статье — PHY, Transport, и доставка пакетов до хост-девайса, которую наконец-то удалось проверить на реальной родной голове приуса.
Быстро сказка сказывается, да не быстро дело делается. Сегодня продолжаю затяжной проект по переделке медиасистемы в Prius, начатый 2 года назад.
Но случилось так, что доблестные дорожные службы, так тщательно спонсируемые мной во время прохождения ТО, забыли починить тормоза в МАЗе, и моему приусу пришлось вырабатывать дополнительное тормозное усилие для уборочной техники.
Ну, а пока он стоит в покраске, я снял с него голову, и проверил PHY-часть схемы.
Итак, с самого начала. Копаясь в интернете на предмет адаптеров к AVC-LAN, я очень часто видел решения, похожие на вот такое. И в обсуждении нередко проскакивают вот такие комментарии:
Честно говоря не очень хорошо работает, точнее не со всеми головами хорошо работает.
Пока идеально читается шина на какой-то старинной магнитоле со Spacio 99 года.
Я изначально настроен принципиально против того, чтобы делать «как нибудь», и решения с конструктивно заложенной нестабильностью меня не устраивают.
Будем повторять путь реверс-инженеринга шины. Поехали.
Первым делом, подключаемся к шине на живом авто, и снимаем осциллограммы:
Начало пачки.
Биты где-то в середине, крупнее.
Что-то очень похожее на ACK.
Чуть подробнее про эту странную ступеньку — ниже.
Скрины осциллограмм делал уже из сохраненных данных, во время снятия не сразу обратил внимание на диапазон по напряжению, в котором снимал данные. А когда обратил — пришлось спускаться в машину еще раз, чтобы убедиться, что из ума не выжил. Да-да, размах дифференциальной шины — всего лишь 200мВ (!!!).
Дальше идем в даташит на применяемый коллегами ST485, и видим там следующее:
Вот, собственно, и нашелся корень всех бед, из-за которых приходится играться с резисторами, и молить канифольных богов, чтобы преобразователь заработал на конкретной машине. Работать рядом с пороговыми значениями — зло. Но еще интереснее то, что для AVC-LAN, которая по физике своей — клон какой-то IE-Bus от NEC — по своей спецификации (ссылка будет чуть дальше) считает активным состоянием напряжение выше 120мВ, при том, что ST485 имеет право считать все, что меньше 200мВ — нулем. Ну, то есть, если из-за производственных отклонений ST485 будет иметь пороговый уровень чуть ниже, а на шине для запаса появится чуть выше нормы (допускается до 6-ти вольт), то, конечно, ST485 сможет принять такой сигнал. И эти производственные неточности — единственное, что заставляет устройства с ST485 в составе иногда работать. Разумеется, закладывать такое счастье в разработку мы не будем.
Второе имеющееся решение на базе того же ST485 и операционного усилителя мне не понравилось обилием компонентов. Ну, в 21-м же веке живем, в конце концов.
Решение:
Для AVC-LAN существуют специальные преобразователи. Но мне не удалось достать их по приемлемой для этого девайса цене. На помощь снова пришел братский Китай, где была обнаружена HA12240FP, у которой разница напряжений для восприятия лог. «1» по даташиту составляет 80..110 мВ. Это позволит нашей шине выставить активный уровень с почти двукратным запасом. Устраивает.
Рожаем схему на упомянутом в первой части STM32F103:
Все просто до примитивизма, думаю, в описании не нуждается. За исключением, разве что, того факта, что выбор ног для RX1/2 — не случаен, и первая версия схемы потребовала «доработки напильником», чтобы завести сигналы на входы захвата/сравнения, ибо именно его я хочу использовать для измерения длины импульса. Альтернативные решения — поллинг и прерывание по изменению состояния проигрывают по точности и сложности программной реализации. Плюс — хотелось бы параллельного приема минимум с двух линий (в «голове» их — вообще три), а при совпадении фронтов на двух можно попрощаться с мыслью о сколь-нибудь приемлемой точности, если не использовать захват/сравнение.
Дальнейший разбор данных в пакет хорошо расписан тут. Но, учитывая, что ссылки — штука непостоянная, вкратце повторюсь здесь:
- Шина дифференциальная, тут пишут про трактовку уровней лог. «1» при <20mV, лог. «0» — >110mV.
- Длина бита — 40мс, первые 20 мс — всегда «0», последние 7 мс — всегда «1», посредине — значение бита.
ну и светофорчик:
- Стартовый бит — длиннее 180 мс
- В конце некоторых частей пакета следует бит подтверждения (ACK). Осциллограмма получилась очень «говорящей», и я ее чуть-чуть разукрасил:
Принцип передачи ACK-бита очень похож на тот, что происходит в Dallas 1-wire, только тут у нас два провода, и драйверы, похоже, токовые. Потому на рисунке видно, как в т. 1 мастер начинает передачу битового фрейма, переводя линию в активный уровень «0» (то есть, подавая на нее напряжение), почти сразу же в т.2 подключается ведомый, тоже форсируя шину в активный уровень, и их усилия складываются, повышая напряжение вдвое. В т.3 видно, что мастер отпускает шину в неактивный уровень (1), но ее продолжает удерживать ведомый, и только его усилиями напряжение на шине остается в активном нуле, и на последних 7мс шина освобождается, возвращаясь в неактивную лог. «1».
Что ж… с физическим уровнем разобрались, схему нарисовали, плату развели. Получилось что-то вот такое:
Печатная плата вышла несколько неудачно, и не потому, что не получился QR-код в шелкографии. В ней есть ошибка в схеме (на схеме выше я ее уже исправил) в части выбора ног для RX, и разведено три драйвера линии. В процессе написания и отладки программы я понял, что хорошо, если удастся запустить устойчиво хотя бы два. Да больше и не нужно.
Что ж… девайс получился простым и эффективным, при этом конструктивная проблема с несоответствием уровней решена.
Далее в программе:
- Прошивка для контроллера этого преобразователя. Забегая вперед скажу, что пришлось отказаться от идеи с составным девайсом. Причины две: * в приехавшей магнитоле нет необходимости добавлять кнопки по USB — кнопки резистивные как с руля, так и на панели, есть нативный способ их «обучить» и назначить. Проще пойти этим путем. * Испытания на разных версиях Андроида показали, что более или менее адекватно андроид с составными девайсами работает в версии 8, в 6-й я сильно не разбирался, а с 4.4 определенно имеются проблемы. Когда драйвер андроида открывает клавиатуру составного устройства, он блокирует устройство целиком, и больше ничего на нем октрыть невозможно.
- Андроид-монитор для полного реверса логики шины. Если кто-то силен в Андроид и Котлин — буду признателен за возможность консультаций. Это робкие попытки освоения всего и сразу, потому в репозиторий по ссылке без ново-пассита не заходить :)
Автор: remixoff