Доброго времени суток!
Внимание, много текста и фоток. На рынке можно встретить множество вариаций одноплатных ПК с шилдами или решения «все в одном». Одни заточены под конкретные задачи, например, сбор и отображение данных, другие универсальные и включают в себя всевозможные интерфейсы на все случаи жизни. Существенные отличия наблюдаются также и в конфигурации, типах крепления, соединительных разъемам, форм-факторе и т.д. Для чего разрабатывать свое устройство, спросите Вы, если можно выбрать уже имеющееся в продаже? Несколько лет назад, вертя в руках плату на IMX6Q – «BD-SL-i.MX6» от Freescale (читаем NXP) появилась идея сделать модуль, который бы …
1. Покрывал наши потребности по макетированию плат на IMX6. На тот момент уже было несколько проектов реализованных на этом чипе. Тут стоит пояснить что имея свой модуль и разработав для него материнскую плату под конкретный проект можно достаточно быстро протестировать всю периферию, «поднять» софт, внести изменения и перенести все на те самые 8 слоев, которые необходимы для IMX6Q (линейка этих чипов не ограничивается четырехъядерным вариантом, помимо QUAD, есть еще DUAL и SOLO – все «пин-ту-пин», что дает широкие возможности для реализации разных по функционалу устройств на основе одной «борды»). Напомню, что материнская плата может быть 4-слойной и даже 2-слойной, что значительно ускоряет сроки ее производства и снижает затраты.
2. Использовать модуль в качестве компонента и предоставить заказчику выбор: переносить все на одну плату или использовать как есть. Справедливости ради скажу, что не рассматривается использование покупных модулей под коммерческие проекты. Во-первых, не найти модуль, который всем бы устраивал (либо разъемов много, либо мало, либо крепежных отверстий нет, либо плата большая и т.д., в общем, кто искал под свои нужды, тот поймет), а, во-вторых, своя разработка всегда надежнее. Можно закидать меня помидорами, но я доверяю только себе.
3. Дать заказчику возможность разработать свое устройство на базе нашего модуля. Да – это тоже оказалось востребовано, но большую роль играет не то, что было описано выше (про сложности подбора модуля), а то, что это Российская разработка и производство. Видимо, слово «импортозамещение», очень сильно повлияло на нашу промышленность и разработку, в том числе.
IMX6 начало
Коротко о главном, но это не будет сутью статьи. Наш первый модуль на IMX6Q используется и сейчас в разработках, имеет размеры 50x75мм. OS Linux и Android.
Рис. 1. Модуль на IMX6Q
Не буду перечислять его интерфейсы, достоинства и недостатки. На нем выведено почти все, что имеет чип и этого вполне хватает для реализации многих проектов. На борту стоит eMMC, интерфейсные разъемы, физика Ethernet гигабит и питание. Краткий экскурс закончен, теперь суть.
К чему мы пришли
Линейка IMX6 не заканчивается и на вышеперечисленных чипах. Уже появился IMX7, IMX8 в различных вариантах, но нас заинтересовала более слабая версия в меньших габаритах, урезанная по функционалу – это IMX6UL/IMX6ULL (они тоже «пин-ту-пин» между собой). Обратили внимание мы на него не просто так, а потому что появилось сразу несколько задач, связанных с передачей голоса по Ethernet по протоколу SIP, а также необходимость в разработке устройств в малых габаритах и без возможности отвода тепла. IMX6UL имеет на борту довольно неплохой набор для подключения периферии:
Рис. 2. IMX6UL Block Diagram
Кому мало картинки, может залезть на сайт NXP и посмотреть подробности линейки данных чипов. Одним из удобств применения этого процессора является его корпус. Шаг его контактов 0.8мм, а контактная площадка 0.356мм (BGA), а это означает ровно то, что плату можно выполнить на 4-х слоях (что, в принципе, и сделано в референсной плате NXP на этот чип). Мы используем версию 14х14мм (также существует и 9х9мм с шагом 0.5мм).
Почему именно NXP, а не Broadcom, ST, Ali или еще какой-нибудь гигант по производству процессоров? На самом деле, все дело в доступности чипов, техподдержке и кроссплатформенности. Сделав модуль на IMX6Q мы относительно просто портировали софт на IMX6UL/IMX6ULL. Линейки чипов «пин-ту-пин», поэтому отладив ПО на UL можно перейти на более дешевый ULL. Второе – это низкое энергопотребление и как следствие малый нагрев. Я намеренно не привожу тех-параметры процессоров, итак много «воды» в статье, а эта информация общедоступная.
Один из интересных проектов, реализованных на IMX6ULэто устройство передачи голоса по Ethernet – SIP телефон, а по сути переговорное устройство.
Рис. 3. SIP телефон.
О главном
Сердцем проекта является IMX6, на котором «крутится» OS с установленным SIP клиентом. Перед тем как загрузиться Linux, с отдельной SPI Flash грузится u-boot (загрузчик). Разделение загрузчика и основной прошивки сделаны не случайно (в отличие от референса), а для того, чтобы сделать устройство выносливым с неожиданным выключением питания. Если Вы начнете говорить об ubifs и read-only разделе на NAND, то я сильно расстроюсь. Практика показала, что даже самые лучшие микросхемы NAND имеют право умирать и делают это весьма неожиданно. Для связи с внешним Миром имеется интерфейс RMII, а на плате установлена Ethernet switch LAN9303 – 10/100 (данный IMX не поддерживает гигабит) и было необходимо два порта. IMX6UL имеет два порта RMII с роутингом, но была необходимость в именно в двух независимых интерфейсах в виде хаба.
Для хранения прошивки и файлов используется NAND (Остановились на Самсунг K9F1G08U0D в корпусе TSOP48. Не начинаем плеваться и не закрываем статью, так как память в таком форм-факторе при маленьких партиях очень дешевая, по сравнению с BGA63). Одна микросхема памяти DDR3 – K4B4G1646D, кодек ADAU1761. На кодеке стоит остановиться подробнее. До этого, в нескольких проектах использовался SGTL5000, но с ADAU жизнь стала намного веселее. Про него можно написать отдельную статью, но я постараюсь кратко изложить его суть в моем проекте. Мало того, что микросхема имеет 6 аналоговых входов, 7 выходов и, конечно, интерфейс I2S, так еще компания Analog Devices вместе с кодеком выпустила для него специализированное ПО для написания прошивок под встроенный DSP. Кому интересно, и кто не в курсе можете почитать инфу что такое DSP и с чем его едят.
Рис. 4. ADAU1761 Block Diagram
Во время написания софта первым делом программисты наигрались с всевозможными функциями искажения, эхо подавления, фильтрования и микширования звука. На слух очень эффектно, я Вам скажу. Интерфейс очень дружественный, много настроек, фильтров, преобразований, возможности перенаправления звука и т.д.
Рис. 5. SigmaStudio от Analog Devices
В проекте задействованы по 4 канала (вход/выход), так как имеются встроенные стереодинамики и микрофоны, а также разъемы для подключения внешних.
К плате (на рис. 3) стыкуется сверху периферийная плата, как раз с кодеком, сканером матричной клавиатуры и пр., про нее писать не стал.
Один из разъемов RJ45 используется для питания по PoE, в качестве Powered Device (PD) используется микросхема Si3402 от Silicon Laboratories. Схема включения использовалась практически стандартная без гальванической развязки с выходом 12В (напряжение настраивается резисторами). Немного отвлекусь, кому интересна тема PoE+ с гальваноразвязкой, существует очень хорошая микросхема от TI – LM5072MH-80. Отлично зарекомендовала себя в нескольких проектах.
Вторичные питания реализованы на DC/DC ST1S10PHR – не самые дешевые, не самые высокочастотные, но отлично работают и доступны вагонами. Вообще, у нас целый зоопарк DC/DC и LDO под разные нужды, но, когда важно качество, выбираем известных производителей.
На плате также имеются USBHOST, USBOTG и SD карта. Через USB и SD можно накатывать/обновлять прошивку. Обновление по сети также есть, но это уже относится к ПО и к web интерфейсу.
Немного о трассировке
Можно бесконечно постить гербера и куски трассировки плат, но я этого делать не буду, а затрону только основные и критичные моменты. Порядок слоев плат стандартный:
— TOP – сигнальный с полигоном земли
— GND – полигоны земли
— POWER – полигоны питания
— BOTTOM – сигнальный с полигоном земли
1. DDR3. С самостоятельной разводкой памяти нужно быть осторожными, поэтому я этого делать не стал, а взял за пример референс. Для трассировки используется только два слоя (top и bot), остальные два слоя не задействованы. Переходные отверстия 0.203/0.406мм, толщина линии 0.114мм. Изменил здесь только линии земли под процессором и сделал их немного толще – до 0.3мм. На слое GND получилась хорошая земля, в которой пришлось провести RGB интерфейс, что не совсем правильно, но другого варианта я просто не увидел со своим количеством интерфейсов на плате.
Рис. 6. Трассировка памяти
Рис. 7. Полигоны питания и земли
При разводке платы нужно побольше времени уделить на полигоны питания и земли. 4-слойные платы разрабатывать гораздо проще при одной и той же схематике, есть раздолье в трассировке сигнальных проводников и всегда остается два слоя для хорошего питания, которые можно тоже грамотно задействовать под не критичные линии данных. Основной полигон питания почти всегда я делаю 3.3В, остальные внутри него. Все высоковольтные полигоны делаются с большими зазорами, чтобы исключить наводки.
2. PoE, как я писал ранее, реализовано на микросхеме Si3402. Она разводится строго на четырех слоях платы с большими зазорами от основных полигонов. Думаю, на двух слоях она тоже заведется, но качество при этом никто не гарантирует. При проектировании узлов питания я обычно руководствуюсь evaluation board к микросхемам, а при тестировании сверяюсь с осциллограммами сигналов, приведенными в документации. Если как в референсе сделать не получается, из-за размеров или конфигурации платы, то приходится руководствоваться только опытом и здравым смыслом.
В слое питания для PoE выделен полигон 12В. Остальные слои используются для сигналов и полигонов земли PoE – GND_EXT. Все полигоны находятся строго друг под другом без «нахлестов» на соседние полигоны в других слоях. Отступ между полигонами PoE и основными порядка 1мм. При разработке PoE с гальванической развязкой я обычно дополнительно делаю вырез фрезой (при производстве плат) под трансформатором и оптронами обратной связи.
Рис. 9. PoE. TOP.
3. Периферия. Доводилось мне делать разводку платы на чипе M3616 компании ALi Corporation, он имеет всего 292 шарика, но посмотрите, как качественно продуман процессор в плане облегчения трассировки платы. Как четко в нужном порядке выходят все интерфейсы. Внимание, плата разводится на двух слоях, а оперативка полностью в одном.
Рис. 10. Полигоны питания и земли
На IMX6UL/IMX6ULL с интерфейсами пришлось повозиться. На рис. 6. можно увидеть на сколько плотно идут проводники и места для переходных отверстий не хватает, а выводить нужно из 5-ого ряда шариков. Тут главное соблюсти импеданс в дифференциальных парах (например, USB) и не переборщить с переходными отверстиями, так как от этого испортится полигоны земли и питания.
И все-таки модуль
Что не делай, а все равно получится модуль. Когда количество проектов на IMX6UL/IMX6ULL превзошло ожидания, а основной функционал был написан, было решено перейти на модульную систему, как и в прошлый раз, да еще и сделать это элегантно.
Рис. 11. Модуль mx6ull-m02c на IMX6UL/IMX6ULL
Почему элегантно?
- Модуль выполнен в форм-факторе «на плату» и не имеет интерфейсных разъемов, дает возможность его использования как «микросхему».
- На бору он имеет только все необходимое: чип, DDR3, NAND, SPI, физику Ethernet, один питатель на 1,35В (что позволяет подавать на модуль только одно напряжение 3,3В), кварцы и пассив.
- Односторонний монтаж. Не каждое модульное решеное может похвастаться отсутствием компонентов на боттом. Это дает сразу несколько преимуществ: отвод тепла на материнскую плату, возможность трассировки под модулем (так как отсутствует вырез на плате для выступающих компонентов) и удешевление производства самих модулей (минус трафарет, переворот платы при монтаже и др.).
- Пады по периметру платы. Нет никаких сигнальных точек пайки под модулем.
- Размеры модуля всего 45x36мм.
- Как-нибудь расскажу про одно из устройств, разработанных на данном модуле, а пока фото материнской платы для отладки и написания софта.
Рис. 12. Модуль IMX6UL/IMX6ULL на плате
Плата двухслойная и имеет интерфейсные разъемы, необходимые для запуска и работы. На таких платах мы проводим внутреннее тестирование на охлаждение и нагрев во время работы, проверяем устойчивость работы под нагрузкой и отлаживаем ПО.
Заключение
Что же конкретно дает модульная система, при разработке устройств?
— При имеющемся модуле, время разработки платы с внешними интерфейсами занимает всего несколько дней (при условии, что все интерфейсы понятны и использовались ранее в разработках).
— Макеты печатных плат получаются на порядок дешевле, так как в большинстве случаев можно сделать двухслойку, или же 4-слойную плату с более низким классом.
— Скорость получения материнской платы намного выше, так как не нужно паять компоненты, относящиеся к модулю.
— Переход от макета к релизному варианту получается более быстрым и безболезненным (если все-же решили сделать одноплатное решение).
Безусловно, все проекты разные и порой схемотехника периферии на порядок сложнее самого процессора, но отладка отдельных модулей всегда проще, особенно если разработка одного проекта происходит силами нескольких инженеров.
В рамках одной статьи очень сложно написать все что хочется. Описание даже одного проекта занимает много букв, а хочется затронуть несколько проектов, поделиться впечатлениями о различной периферии, о используемых микросхемах, особенностях трассировки интерфейсов и т.п. Но главное, вовремя остановиться.
PS: ссылка на исходники github.com/trotill/adk_yocto
Спасибо за внимание!
Автор: the_bat