Загрузка данных


Карта физических пинов GPIO_SD_B1 на i.MX RT1024В i.MX RT1024 под пластиковым корпусом (SiP) находится кристалл процессора RT1020 и кристалл 4 МБ Quad SPI Flash памяти. Они соединены фиксированным внутренним монтажом.Согласно даташиту и AN12878, внутренняя Flash-память жестко сидит на шине FlexSPI Port A через следующие выводы:Пин в вашем DTSФункция в pinmux_sai3Внутренняя функция FlexSPI (Flash)Статус конфликтаGPIO_SD_B1_06SAI3_TX_BCLKFLEXSPI_A_DATA3Конфликт шиныGPIO_SD_B1_07SAI3_TX_SYNCFLEXSPI_A_SCLKКритический конфликтGPIO_SD_B1_08SAI3_TX_DATAFLEXSPI_A_DATA0Конфликт шиныGPIO_SD_B1_09(Не занят)FLEXSPI_A_DATA2—GPIO_SD_B1_11SAI3_RX_DATA(Не используется во Flash)Безопасен (Поэтому RX работал!)Почему возникает сбой TX и ошибка -11 при XIP?Поскольку FlexSPI используется в режиме XIP (Execute-in-Place), ядро процессора непрерывно читает из него код программы в процессе работы.Инициализация: При старте программы Zephyr настраивает регистры IOMUXC, переключая пины 06, 07, 08 в режим работы звукового интерфейса SAI3.Иллюзия работы: Так как контроллер SAI3 перехватывает управление пинами BCLK (06) и SYNC (07), вы видите физическую генерацию этих частот на осциллографе.Обвал транзакции: Как только ваше приложение начинает выполнять код из Flash-памяти (или происходит обращение к константам/DMA дескрипторам в Flash), контроллер FlexSPI пытается захватить эти же линии данных.Финал: Передача TX_DATA на пине GPIO_SD_B1_08 (который одновременно является FLEXSPI_A_DATA0) аппаратно искажается. Периферия SAI3 не может корректно сбросить данные из FIFO наружу, так как линия зашумлена XIP-трафиком. FIFO переполняется, DMA зависает, а i2s_write выплевывает ошибку -11 (-EAGAIN).Как инженеры NXP обходят этот конфликт?Чтобы аудиоинтерфейс SAI3 мог легально работать на этих пинах (как на отладочной плате RT1024 EVK), код, работающий со звуком, категорически нельзя выполнять из Flash-памяти.Если на вашей плате дорожки разведены именно к пинам GPIO_SD_B1_[06...11], вам нужно изолировать код от XIP:Вызовы функций i2s_write, обработчики прерываний DMA и сам буфер данных должны быть размещены во внутренней оперативной памяти RAM (ITC/DTC).В Zephyr для этого используется макрос __ramfunc перед объявлением функции аудио-потока или настройки линкера (zephyr,code-in-ram).Если вы хотите полностью уйти от конфликта с XIP Flash на аппаратном уровне, проверьте, разведены ли на плате пины GPIO_AD_B1_[01...05], куда также можно перекоммутировать модуль SAI3 без каких-либо коллизий.