Доброго времени суток, Хабр!



Решил написать небольшую статью по запуску разработанного и спаянного устройства на основе процессора iMX8MQ от NXP. Идея возникла в связи с тем, что приходится запускать много различных проектов, а характер первичного тестирования и запуска однообразен и, возможно, не раз пройденный мной путь поможет кому-нибудь не сделать ошибок при пуско-наладке и не спалить устройство. Статья не является универсальной инструкцией к действиям, а представляет собой результат проделанной работы по запуску конкретной платы.

Печатная плата


Печатная плата модуля имеет 10 слоев, поэтому она прошла электротестирование на заводе и визуально ее осматривать смысла нет, если только полюбоваться (платы более 2 слоев всегда должны проходить электроконтроль). При изготовлении было выбрано иммерсионное покрытие золотом для улучшения автоматизированного монтажа на производстве. Так как это первый макет на этом процессоре, я буду паять его вручную, чтобы исключить ошибки монтажа на заводе и параллельно буду проверять все питания (как ни странно, но если производство конкретного устройства еще не налажено на заводе, иногда встречаются ошибки в номиналах).



Рис.1. Печатная плата модуля на iMX8MQ без компонентов.

Пассив на bottom


Первым делом я установил пассив на нижнем слое платы. Сразу нашлась первая проблема. Изначально, под iMX8 устанавливаются конденсаторы типоразмером 0201, которые я решил поменять на 0402. Чтобы они установились корректно, я подредактировал наши стандартные футпринты (и правила в Altium), чтобы иметь возможность установить компоненты ближе друг к другу. Также я решил изменить типоразмеры 0603 и немного не рассчитал. Видно, что на плате эти конденсаторы прижаты друг к другу, что не позволительно для автоматизированного монтажа. Так как проблема наблюдается только на 0603, и их расстановка позволяет увеличить расстояние между ними, я это исправлю на следующей итерации.



Рис.2. Установка пассивных компонентов на bottom.

На всякий случай я прозвонил мультиметром на предмет КЗ все точки выходов источников питания относительно GND, так как допущенную на этом этапе ошибку в виде «залипа», будет сложно отыскать на следующих этапах. Короткого замыкания нигде не обнаружено, можно продолжать…

Установка части компонентов на top


На bottom я буду ставить пассив и часть актива, а именно «первичные источники питания». Входное питание моего модуля 3V3. Помимо нескольких DC/DC и LDO на плате установлен PMIC (MC34PF4210A1ES) – контроллер управления питанием, а также несколько вторичных источников питания. У PMIC входное напряжение тоже 3V3, но его устанавливать я пока не буду. Для фиксации платы я использую простой держатель, который не позволяет сдвинуться компонентам на bottom при прогреве платы феном сверху.



Рис.3. Установка части компонентов на top.

Теперь важно произвести визуальный осмотр платы с обеих сторон и убедиться, что все компоненты стоят ровно, нигде нет лишнего припоя и отсутствуют «залипы» между выводами компонентов. Следующий шаг — снова проверка на КЗ мультиметром точек выходов источников питания.

Первая подача напряжения


Напряжение на плату я буду подавать от лабораторного источника питания с ограничением тока. Так как я еще не уверен в правильности схемы и трассировки источников питания, необходимо ограничить ток, например, до 100мА, и установить напряжение 3V3. При таком токе сгореть ничего не должно, а в случае КЗ – это я увижу на блоке питания.



Рис.4. Подача напряжения на плату.

Просто подпаиваю два проводка и включаю лабораторник. Дыма нет, потребления почти то же. Считаем, что пока все в норме. Кроме контроллера питания от 3V3 питаются два DC/DC и два LDO. Для подачи разрешающего сигнала на питатели я использовал супервизор питания, так что он тоже должен быть запаян. Обнаружилась вторая проблема. При разработке схемы я забыл рассчитать делитель одного из DC/DC и, как следствие, вместо 0V9 на его выходе оказалось 2V5. Если бы в этот момент был запаян процессор, то с большой вероятностью он бы сгорел, так как это напряжение ядра. Делаю корректировки резисторов для feedback питателя, запускаю, все в норме.

Установка PMIC


Данный контроллер питания имеет несколько встроенных DC/DC и LDO. Помимо этого он управляется по I2C и имеет несколько сигналов, типа PORb (сигнал сброса процессора) и др.



Рис.5. Установка PMIC на плату.

После установки микросхемы снова проверяем на КЗ входные/выходные цепи питания. Далее устанавливаем ограничение тока лабораторника на 200мА и подаем питание. По умолчанию все выходы PMIC имеют фиксированные значения, поэтому сверяемся с даташитом и смотрим осциллографом питания. Помимо самих выходных напряжений я смотрю генерацию выводов SW (перед индуктивностями), чтобы оценить, нет ли срывов частоты. Проверяю, выдается ли сигнал сброса для процессора. Все в норме. Продолжаем.

Установка процессора и памяти


Процессор имеет 621 болл (от англ. ball — шарик), память LPDDR4 на 200 выводов, тоже в BGA исполнении. Их я запаиваю феном с нижним воздушным подогревом, так как корпуса маленькие и нет опасения что можно перегреть.



Рис.6. Установка BGA на плату.

Новый этап пайки – новая прозвонка на КЗ и новый визуальный осмотр. Важно, чтобы BGA стояли ровно относительно платы, боковые шарики были одинакового размера и не было перекосов относительно шелкографии. У процессора есть ножка управления питанием VDD_ARM, важно проверить, что она не замкнута ни на питание, ни на землю.


Рис.7. Схема управления питанием VDD_ARM.

У меня этот вывод назван как PWM_LED (нужно будет назвать более корректно, чтобы не было путаницы в дальнейшем). Проверяем PORb, PMIC_nINT, PMIC_ON и другие сигналы на наличие КЗ. На этом этапе нужно особенно внимательно отнестись к тестированию, так как перепаивать процессор долго и дорого, а лишний раз нагревать плату не желательно.

Позволю себе сделать небольшое отступление по поводу выводов, которые находятся под процессором. Так как у нас нет рентген контроля, то сложно оценить пайку всех выводов под BGA, но способ все-таки есть. Если нужно убедиться, что проводник доходит до процессора, можно убрать с него все подтяжки и компоненты и прозвонить мультиметром относительно GND на диодной прозвонке. Например, если в дальнейшем будет не ясно, доходит ли вывод PMIC_ON до процессора, можно снять PMIC, резисторы R117, R118 и конденсатор C240 (по схеме на рис.7.), тем самым освободив этот вывод. Есть еще вариант – это в u-boot (загрузчик) настроить выводы на выход и выставлять на них логические 0 и 1, проверяя мультиметром напряжение, но это возможно далеко не всегда, например, если u-boot не стартует, либо вывод чипа нельзя сконфигурировать как GPIO, например, как выводы CSI/DSI для камеры и дисплея.

Данный процессор имеет множество вариантов загрузки. Я предусмотрел все возможные варианты с помощью резисторов boot_cfg. Углубляться в эту тему не буду, так как на данном этапе у меня подготовлена SD карта с u-boot. Таким образом, мне нужен только этот режим. В дальнейшем старт u-boot будет происходить с QSPI, а образ загружаться с eMMC. На этапе тестирования наиболее удобной является именно SD карта.

Еще до пайки платы модуля я собрал материнскую плату, на которой у меня выведен USB для консоли (консолей в iMX8 две, поэтому я использовал двухканальную микросхему USB-UART – CP2105-F01-GMR). Также плата имеет мощный преобразователь на 3V3 и все необходимые разъемы для тестирования интерфейсов. Плата сложная, но это тоже макет, который позволит быстро все проверить и запустить. Процесс запуска был похожим на описанный выше.



Рис.8.Модуль на материнской плате.

Подаю питание и в консоли … ничего. Потребление в норме, все питания на месте. Сигнал сброса присутствует. Проверяю генерацию кварцевых резонаторов и генераторов – клоки есть. Нагрев процессора низкий. Для загрузки платы (как я выше писал) может быть использовано несколько интерфейсов: SD/eSD, MMC/eMMC, NAND, QSPI и SPI_NOR. Все эти интерфейсы имеют вывод клоков. Встаем поочередно на эти клоки перезагружая плату. Я увидел клоки на QSPI, следовательно, процессор пытается загрузиться с пустой микросхемы. Вот и третья проблема – выбран не тот интерфейс загрузки. Переставляю режим на SD/eSD и:



Рис.9. Первый старт u-boot.

Заключение


После того, как произошел старт u-boot, с помощью программы MSCALE_DDR_Tool от NXP был проведен тест DDR (через USB_OTG), далее зашит образ и постепенно подняты интерфейсы, такие как I2S, MIPICSI, MIPIDSI, USB, HDMI и др. На момент написания статьи не запустилась только физика Ethernet, но, надеюсь, проблема скоро будет решена (обязательно допишу, когда запустится).

PS: После пропайки imx8 физика Ethernet заработала. Был не пропаян один пин.

Спасибо за внимание и до скорых встреч и быстрых запусков!