Комментарии 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. Будьте аккуратны.
Информация
- Сайт
- slc.tl
- Дата регистрации
- Дата основания
- Численность
- 1 001–5 000 человек
- Местоположение
- Россия
- Представитель
- Александр Шилов
Цифровой звук на STM32: подключаем аналоговый микрофон через SAI и NAU88C22