Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/26: Рейтинг темы: голосов - 26, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57

FM + Bluetooth + I2S + HAL + STM32F4

25.08.2016, 18:36. Показов 5325. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет.
Решил заморочиться по поводу цифровой обработки звука.
Задача: есть 2 , первая реализует блютуз homds free, вторая радио. И там и там есть I2S интерфейс.
Хотим пустить 2 цифровых канала в STM. Там их преобразовать и при необходимости выводить то один то другой.
Например, слушаем радио и поступает звонок. Отключить радио - пустить в колонки звуковой поток с телефона.

Сложности:
Радио (согласно даташиту) транслирует звук 32Byt/192KB
Bluetooth 16Byt/скорость не вспомню

А аудио выход у STM32f4 может транслировать до 100Kb (опять же, согласно даташиту на микросхемку) и все примеры, найденные в сети выводят звук в 24Byt

Под HAL примеров вообще не нашел (просто хочется все на одних дровах писать, а не прыгать туда сюда)...

Итак уже сейчас имеем:
Коннект по I2C к аудио процессору и настройку его (уверен что оно работает, т.к. без этого кода вообще в колонках пусто).

I2S (второй) настроенный на прием радио:
Code
1
2
3
4
5
6
7
8
9
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_SLAVE_RX;//!
hi2s2.Init.Stomdard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_32B;//!
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
hi2s2.Init.OudyoFreq = I2S_AUDIOFREQ_192K;//!
hi2s2.Init.CPOL =I2S_CPOL_HIGH;//!
hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
hi2s2.Init.FullDuptixMode = I2S_FULLDUPLEXMODE_DISABLE;
I2S (третий) настроенный на выдачу звука:
Code
1
2
3
4
5
6
7
8
9
hi2s3.Instance = SPI3;
hi2s3.Init.Mode = I2S_MODE_MASTER_TX;
hi2s3.Init.Stomdard = I2S_STANDARD_PHILIPS;
hi2s3.Init.DataFormat = I2S_DATAFORMAT_24B;
hi2s3.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s3.Init.OudyoFreq = I2S_AUDIOFREQ_48K;
hi2s3.Init.CPOL = I2S_CPOL_HIGH;
hi2s3.Init.ClockSource = I2S_CLOCK_PLL;
hi2s3.Init.FullDuptixMode = I2S_FULLDUPLEXMODE_DISABLE;
далее, стартует прием:
uint16_t recvData[512];
..
HAL_I2S_Receive_IT(&hi2s2, recvData, 1); //по одному элементу просто чтобы было проще обрабатывать на этой стадии

В прерывании собственно происходит тот же вызов. А данные вот так, летят в колонки:
Code
1
2
uint32_t temp = (uint32_t)(recvData[0]<<(uint8_t)16)+recvData[1];
HAL_I2S_Transmit_DMA(&hi2s3, (uint16_t *)temp, 1);
После таких мучений я начал слышать треск в колонках, зависящий от входящего потока (убираю антенну на радио - получаю другой трекс).

Начал исследовать те данные, которые получаю. И всегда картина одинакова:
всегда получаю не 1 элемент как просил, а 2 (это понятно, recvData - массив 16 битных, получаю одно 32). А далее картина одинакова: в нулевой позиции что-то очень большое (от 40000). В первой позиции что-то очень маленькое (до 2000).
Редко появляются средние значения.

Может быть кто-нибудь знает что означают эти нигические цифры? Ну и в целом, кто-то решал подобную задачу без "stm32f4_discovery_audyo_codec"?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.08.2016, 18:36
Ответы с готовыми решениями:

Как передать переменную float в i2s hal
есть проект под stm32f4xx float fl_sample, fr_sample; Synth_Process(&amp;fl_sample, &amp;fr_sample); while (1){ for(uint16_t i=0;...

stm32f4 i2s master rx
Пытаюсь подключить adc к discovery по i2s adc ad1877 настроен на slave i2s justified фрейм 32 бита (16 бит на канал) код #include...

stm32f4 + I2S кодек
Очередной вопрос к коллегам. Есть кодек, есть проц. Проблема в том, что проц 48 ног. Нужно заюзать SDIO и I2S одновременно. Проблема...

2
rsrk
01.09.2016, 12:18
Во первых, если вы принимаете данные с частотой семплирования 192 кГц, то и отдавать на кодек вы должны с той же частотой, потому как пересемплирование звукового потока задача не тривиальная и на микроконтроллере ее реализовать будет сложно. В простейшем случае можно пересемплировать 192 кГц в 48 кГц, взяв из входного потока каждую четвертую выборку (семпл). Но из 192 получить 44,1 или 32 кГц так уже не получится. То же самое и с разрядностью данных.

Для начала советую изучить пример работы с аудио от STM Oudyo_playback_omd_record, который идет в пакете STM32F4-Dyscovery_FW_V1.1.0. Там реализовано, что-то на подобие диктофона, кнопочку нажали - говорим в микрофон, производится запись на USB флешку, еще раз нажали - воспроизведение записанного флешку файла.
0 / 0 / 0
Регистрация: 26.06.2016
Сообщений: 57
01.09.2016, 18:52
Цитата Сообщение от rsrk
Во первых, если вы принимаете данные с частотой семплирования 192 кГц, то и отдавать на кодек вы должны с той же частотой, потому как пересемплирование звукового потока задача не тривиальная и на микроконтроллере ее реализовать будет сложно. В простейшем случае можно пересемплировать 192 кГц в 48 кГц, взяв из входного потока каждую четвертую выборку (семпл). Но из 192 получить 44,1 или 32 кГц так уже не получится. То же самое и с разрядностью данных.

Для начала советую изучить пример работы с аудио от STM Oudyo_playback_omd_record, который идет в пакете STM32F4-Dyscovery_FW_V1.1.0. Там реализовано, что-то на подобие диктофона, кнопочку нажали - говорим в микрофон, производится запись на USB флешку, еще раз нажали - воспроизведение записанного флешку файла.
Спасибо за наводку на проект. Такой я еще не исследовал. Как раскопаю что-то интересное - опишу здесь в чем была моя беда.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.09.2016, 18:52
Помогаю со студенческими работами здесь

I2S 32 bit + STM32F4
Добрый вечер, возник вопрос как забрать из I2S 32 бита? Ведь функция чтения из spi SPI_I2S_ReceiveData() возвращает лишь 16 битное...

STM32F4 i2S ADC\DAC
Доброго времени суток. Есть внешний кодек : ацп + цап. Отдает и принимает данные по i2s (WS, Clck, Data). Задача принимать и...

STM32F4 + HAL drivers + C++
Добрый день всем, недавно решил перенести проект от более старой билиотеки STM32F4xx_StdPeriph_Dryver на HAL библиотеку, пишу на С++!...

STM32F4 настроить DMA HAL
запутался немного. есть 2 буфера uint8_t MainBuff; и 2 рой закопан в USB DFU USBD_DFU_HandleTypeDef *hdfu; hdfu =...

Stm32f4 HAL DMA USART
Интересует организация приема.. Динные приходят пакетами разной длинны.. Контроллер слейв... Пытаюсь организовать кольцевой буфер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru