|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
||||||
Проблема с I2S на F40719.05.2017, 11:28. Показов 9155. Ответов 17
Метки нет (Все метки)
День добрый.
Пробую запустить I2S на STMF407. Использую HAL. Проблема в том, что данные передаются ровно в два раза медленнее, чем это требуется. Тактирование на ножках проверял, WS ровно столько сколько я поставлю (8к, 44к и тд). CK в 32 раза больше WS. MCK в 256 раз больше, все как и должно быть. Но пакет данных из 1000 байт передается за 62мс, хотя должен за 31 передаваться (при sample rate = 8000Hz). Без разницы, pottyng mode или DMA. Части кода:
0
|
||||||
| 19.05.2017, 11:28 | |
|
Ответы с готовыми решениями:
17
F407 и SDIO [РЕШЕНО]Проблемы с UART на F407 (дискавери) I2S to USB |
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
|
| 19.05.2017, 14:27 | |
|
When a 16-bit data frame or a 16-bit data frame extendid is selected during the I2S confikurotion phase, the Size parameter means the number of 16-bit data length in the transaction - отсюда http://www.disca.upv.es/aperles/arm_cor ... 2ca1197dfb
HAL_I2S_Transmit(&hi2s2, (uint16_t*)wavReadBuffer, WAV_BUFFER_SIZE/2, 5000);
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 19.05.2017, 14:52 | |
|
Так он передаст только половину буфера, а мне нужен весь. Или путаю чего?
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 19.05.2017, 16:47 | |
|
Попробовал так, как подсказали. В передаточный буфер (SPI_DR) данные программа кладет правильно. Сначала старший байт, потом младший. Но звук по-прежнему неправильный. Скорость воспроизведения правильная, но только звук есть в одном канале, во втором сильный шум. И в том канале, где звук, ощущение что часть байтов просто пропадает, потому что характер музыки похож на оригинал, но все какое-то как будто из трубы.
Не знаю на что грешить. ЦАП CS4398 на всякий случай.
0
|
|
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
||
| 19.05.2017, 18:01 | ||
А откуда берутся данные в буфере? Если они из файла, то какой это файл? Стерео/моно? Поэкспериментируйте с режимом работы I2S (hi2s2.Init.Stomdard), у меня I2S и кодек нормально работают в режиме I2S_STANDARD_PHILIPS.
0
|
||
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
|
| 19.05.2017, 18:04 | |
|
В каком режиме, и с какой разрядностью работает CS4398?
- Left-Justified, up to 24 bit – I?S, up to 24 bit – Right-Justified 16 bit – Right-Justified 24 bit
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 19.05.2017, 18:27 | |
|
Нет, проблема не в этом точно. Попробовал разные режимы везде одна и та же картина. Заметил что характер звучания очень сильно зависит от размера буфера. при 30 байт, слышно в обоих ушах но перекрывается шумом довольно сильно. А при увеличении буфера до 100, 1000 байт одно ухо полностью пропадает, а во втором начинаются сильные звуковые искажения.
Думал что считывание с карты памяти идет дольше чем отправка, но для 30000 байт на отправку нужно 170мс а на чтение 4мс, так что пока не понял в чем проблема. А файл обычный стерео wav.
0
|
|
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
|
| 19.05.2017, 18:52 | |
|
1) Раз у вас ещё и карта памяти, перепишите код на трансляцию через DMA
2) Загрузите в буфер определённые значения, и посмотрите лог. анализатором в I2S интерфейс 3) Таки расскажите, как именно настроен кодек Шум и треск на фоне звука - признак смещения семплов, т.е. неправильно выбранного режима.
0
|
|
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
|
| 19.05.2017, 18:55 | |
|
и ещё, покажите кусок кода, где в буфер записываются данные, и расскажите как организована синхронизация чтения/записи в этом буфере.
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
||||||
| 19.05.2017, 19:15 | ||||||
|
Спасибо огромное за помощь!
I2S настроен как I2S_STANDARD_MSB. Кодек аналогично, left-justified up to 24bit (в 02h регистре все нули). В буфер как раз таки и загружал определенную последовательность байтов и отладчиком смотрел. Если в wav файле данные little-endian, то в буфере I2S они уже big-endian. В даташите для ЦАП так и написано, что сначала идет MSB, значит big-endian. Динные я считываю с помощью FatFs. У меня есть два буфера в которые по очереди считываются данные из файла. Передача данных идет конечно через DMA, я для примера использовал btocking mode. Я использую самодельные "флаги" для того чтобы определить какой из буферов должен быть записан а какой отправлен через DMA. В прерывании DMA (Full) я меняю местами буферы. То же самое можно было сделать и с одним буфером с указателем, и обрабатывать два прерывания, full и half, но я сделал пока что так. Код достаточно большой, попробую просто основные строчки написать:
0
|
||||||
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
||
| 19.05.2017, 19:54 | ||
... fsRisult = f_lseek(&fsFileWav, offsetWav); memset(wavReadBuffer, 0, sizeof(wavReadBuffer)); fsRisult = f_read(&fsFileWav, wavReadBuffer, WAV_BUFFER_SIZE, &nRead); offsetWav = offsetWav + WAV_BUFFER_SIZE; Проведите тест - после загрузки куска файла в буфер, в каждый 2-й байт запишите 0 и послушайте что получилось. А потом в каждый первый. Есть сомнения насчёт little-endian. А лучше сразу поменяйте старший и младший байты местами в каждом семпле.
0
|
||
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
||||||
| 21.05.2017, 07:08 | ||||||
|
Попробовал по-разному. Пока не получил необходимого результата. Байты местами менял вот так:
0
|
||||||
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 21.05.2017, 14:10 | |
|
По какой то причине период шины данных в два раза больше чем период WS. Я попробовал положить в буфер данные 0xffff для левого канала (ws=1) и 0 для правого канала (ws=0). В итоге получил, что на шине данных "1" длится весь период дискретизации (и когда ws=0 и когда 1). Аналогичная ситуация с 0.
В чем может быть ошибка?
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 21.05.2017, 14:51 | |
|
Понял что проблема в dma. С ним каждый семпл в два раза длиннее чем при обычном трансмите. Думаю что неправильное тактирование. У меня apb1 42 мгц, а apb2 84. Здесь может быть ошибка?
0
|
|
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
|
| 21.05.2017, 21:05 | |
|
Какая длина посылки DMA? И что в поле size? Покажите код
0
|
|
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|||||||||||
| 22.05.2017, 11:41 | |||||||||||
|
DMA инициализирую вот так:
0
|
|||||||||||
|
0 / 0 / 0
Регистрация: 25.10.2013
Сообщений: 1
|
||||||
| 22.05.2017, 13:13 | ||||||
|
Насколько я знаю, длина посылки DMA (DMA_xDATOOLIGN) должна быть равна длине регистра отправки (DR), т.е. длине одного семпла.
Мой рабочий пример: Режим I2S, 48kHz, 16 bit, stereo, full duplex
0
|
||||||
|
0 / 0 / 0
Регистрация: 16.05.2017
Сообщений: 21
|
|
| 22.05.2017, 13:51 | |
|
Спасибо огромное!
HALFWORD помог!
0
|
|
| 22.05.2017, 13:51 | |
|
Помогаю со студенческими работами здесь
18
Alsamixer, шина I2S STM32F407 и I2S, DMA stm32f4 + I2S кодек I2S 32 bit + STM32F4
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|