Обновить

Цифровой звук на STM32: подключаем аналоговый микрофон через SAI и NAU88C22

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели20K
Всего голосов 30: ↑30 и ↓0+37
Комментарии9

Комментарии 9

Верна ли гипотеза, что запись по SPI блокирует работу DMA - сам по себе нет (даже если вы используете блокирующие функции, но в этом случае можно проворонить что-нибудь другое, не используйте блокирующие вызовы в микроконтроллере без RTOS, в котором достаточно ресурсов на SPI DMA (если только речь не идёт о редких посылках в пару байт, но это - не Ваш случай)), процессорное время у DMA функций тратится только на запуск и обработку прерываний по половине/целому буферу, в остальном оно работает без участия ядра. А вот поднять SDIO и тоже прикрутить к нему DMA было очень полезно. По поводу шумов, мне кажется, что, скорее всего, их причина кроется в просадках питания во время записи на флешку, т.к. в это время она кушает хорошо и рывками. Ну и выкиньте memcpy из обработчиков прерываний, это достаточно долгая процедура, ей там не место.

Конкретно в этом чипе нет SDIO, только SPI. И скорее всего если без FATFS писать на карту в сыром виде через SPI DMA должно быть не сильно хуже чем через SDIO.

Питание проверяли, не проседает ни на мВ во время записи. В примерах работы со звуком, что мне попадались и не такие операции творят в обработчиках прерываний, и мне показалось что memcpy лучшая альтернатива чем в цикле байты поштучно перекладывать. Но вы правы, практика плохая и надо ставить флаги и копировать данные в основном цикле.

Я бы рекомендовал Вам взять другой МК, с достаточным кол-вом выводов и набором нужной периферии, лепить из того что есть, с костылями, а потом пытаться вытащить из этого минимальное потребление - такое себе удовольствие.

Чем проверяли? Мультиметр короткие иголки не покажет, нужен шунт + осциллограф или регистратор, достаточно быстрый, чтобы отследить хотя бы микросекундные просадки

NAU - сейчас хороший выбор. Сам недавно ставил. А микросхемы самых знаменитых кодеко-строителей AK сейчас тоже недоступны? Cirrus? Китай?

Верна ли гипотеза, что запись по SPI блокирует работу DMA? По идее, не должна, но кто его знает…

Это вряд ли. DMA-каналы работают в общем независимо, и скорость SPI для DMA достаточно детская. Заголовок WAV ведь нормально пишется, без смещений и пропусков.

Нужно только не забывать сливать кэш, когда DMA используете. Если вызов у вас блокирующий, проц в это время ничего не делает, тупо ждёт бита окончания, и данные могут застрять в кэше.

Как лучше писать аудиопоток на внешнюю память?

Наверное, быстрее будет один раз сформировать скелет для файла - всю инфу о связи блоков, которую требует FAT. На все 20 часов, например. А потом писать сами данные, не заморачиваясь ни на что. Иначе вам приходится всё время переписывать заголовок, в котором объём данных указан. Может, стоит выбрать другую файловую систему, более удобную для записи потоковых данных.

Ну и напрашивается решение - сжать данные. OGG, MP3, да хоть GSM. У вас вполне производительный 32-разрядный проц, который ничего не делает.

Евгений писал, почему именно NAU, наверняка можно и любой другой кодек, в рамках страдания с запуском SAI на STM32 - это не важно.

Нужно только не забывать сливать кэш, когда DMA используете. Если вызов у вас блокирующий, проц в это время ничего не делает, тупо ждёт бита окончания, и данные могут застрять в кэше.
Вот про это подробнее напишите пожалуйста. Про чей кеш речь?

Заголовок я пишу один раз, перед началом файла и потом уже к нему не возвращаюсь. В текущем варианте пишу кусками по 15 минут. Не думаю, что кому то придет в голову работать с 20 часовой записью и разбивать на фрагменты все таки надо.Другая файловая система? Применительно к МК я встречал только FATFS. А для сжатия на ходу не потребуется бОльший объем оперативки?

Про кэш данных процессора. Может, для STM это не сильно актуально, там, вроде, только флеш-память кэшируется. Но в каких-то случаях даже упрощённый ARM Cortex-M4 может отложить запись в RAM.

Не так уж много нужно для сжатия, говорят. Используемый в Bluetooth кодек, вроде, считается попроще и экономит батарейку как раз. Ну и существует G.711 - он вообще простейший. Правда от 16 бит остаётся 13-14, но сжатие - в 2 раза.

FatFS от мистера Чана умеет пре-аллоцировать файл. Для sd карты это значит, что можно заранее стереть сектора и не тратить на это время при записи. И использовать более оптимальную команду последовательно записи.

Та же FatFS уже внутри себя заботится о выравнивании и сбрасывает буфер кратно блокам по 512 байт.

ChibiOS помимо того что RTOS, ещё и имеет хороший набор драйверов. Т.е. SD карта через spi + dma с использованием fatfs там точно есть. Советую посмотреть.

Скачки сигнала это явная потеря сэмплов. Включите overrun прерывания и посчитайте их.

SD карта вполне законно может задумываться на сотни mS в процессе внутреннего housekeeping. Будьте аккуратны.

Спасибо за идеи, проверю.

С chibios раньше работать не приходилось, только с freertos. Буду смотреть.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
slc.tl
Дата регистрации
Дата основания
Численность
1 001–5 000 человек
Местоположение
Россия
Представитель
Александр Шилов