Доброго времени суток, Хабр!
Решил написать небольшую статью по запуску разработанного и
спаянного устройства на основе процессора 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, но, надеюсь, проблема скоро
будет решена (обязательно допишу, когда запустится).
Спасибо за внимание и до скорых встреч и быстрых запусков!