Перейти к содержанию
    

Здравствуйте!

Master соединен со Slave, по интерфейсу передаются данные двух каналов (левого и правого) с использованием DMA, но для этого создается новый буфер двойного размера в котором данные каналов чередуются. Правильная ли это реализация I2S + DMA или есть способ проще? Вообще, не очень понятно, как предполагалось создавать двойной буфер чередующихся данных. Может быть с использование DMA memory-tomemory с инкрементом адреса на два? Или как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Pridnya said:

Правильная ли это реализация I2S + DMA или есть способ проще?

Нормальная.

 

1 hour ago, Pridnya said:

Вообще, не очень понятно, как предполагалось создавать двойной буфер чередующихся данных.

Вообще, не очень понятно, о чем вопрос: кем, например, предполагалось? Буфер с чередующимися данными каналов - вполне нормальное явление, и уж точно не стоит привлекать DMA для перестановки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, aaarrr said:

Нормальная.

 

Вообще, не очень понятно, о чем вопрос: кем, например, предполагалось? Буфер с чередующимися данными каналов - вполне нормальное явление, и уж точно не стоит привлекать DMA для перестановки.

В STM32F4 есть интерфейсы для передачи аудио: STM32F407 I2S, в STM32F427 I2S и SAI (Serial audio interface). Вообще интерфейс I2S в STM32F4 поддерживает режим MainClock = 256 × Fs;  (Fs is the audio sampling frequency), но фирма STMicroelectronics производит микросхемы Digital Terminal Audio (таблица из документации), у которых эти множители разные, от 32*Fs до 768*Fs. И у STM32F407 есть ограничения на настройку I2S PLL, например, для поддержки некоторых частот придется использовать кварц 6.144 МГц, 12.288 МГц и другие, т.к. у самих микросхем Digital Terminal Audio есть еще дополнительные требования к тактовой частоте MainClock. Т.е. при использовании кварца на 8 МГц не удается настроить I2S PLL на частоту 49.152 МГц.

Набор.png

Набор2.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне кажется вас смущает то что в буфере перемешаны дынные правого и левого каналов. Увы кажется STM не умеет раскидывать по каналам. Если вам беэ этого не жить то берите DSP процессор. Blackfin так умеет и другие наверняка тоже.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

23 minutes ago, uriy said:

Мне кажется вас смущает то что в буфере перемешаны дынные правого и левого каналов. Увы кажется STM не умеет раскидывать по каналам. Если вам беэ этого не жить то берите DSP процессор. Blackfin так умеет и другие наверняка тоже.

Да, это одна из особенностей реализации I2S в STM32F407. Получается что два буфера данных нужно слить в один с чередованием данных и затем отправить в I2S через DMA. А иначе как разработчики микроконтроллера предполагали использовать режим I2S DMA? Пока только так и работает. Вот в STM32F427 обнаружил SAI (Serial audio interface), нужно его посмотреть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Pridnya said:

Получается что два буфера данных нужно слить в один с чередованием данных и затем отправить в I2S через DMA.

А откуда они в исходном буфере берутся? Еслитоже с I2S, то они там уже с чередованием.

Я обычно эти буфера в структуру заворачиваю.

Вообще, в чем именно состоит проблема - не понял.

 

1 hour ago, Pridnya said:

Вот в STM32F427 обнаружил SAI (Serial audio interface), нужно его посмотреть.

Если не нужно TDM и т.п, то он удобнее только для слейва - не надо отседивать начало вордклока, а для мастера - практически все равно.

Ну еще там есть некторые заморочки с частотами тактированя. Я правда, практически никогда не использовал его от внутреннго PLL, т.к. требования как правило были гораздо выше, чем он может обеспечить. Но для STA333 это конечно оверкилл, там и внутреннего выше крыши.

 

 

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Через DMA данные пришли с кодека и в буфере они лежат вперемешку левый и правый канала. Их приходится копировать в новые буферы отдельно для правого и левого канала. Обработали каналы по отдельности и опять сложили в буфер в перемешку. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 minutes ago, uriy said:

Их приходится копировать в новые буферы отдельно для правого и левого канала.

Зависит от того, как обработка сделана. В общем случая-же никто не мешает делать обработку семплов, не лежащих непрерывно в памяти.

Все равно ведь, для какой-то серьезной обработки STM32F4 мало пригоден, тут H7 или G4, да и то...

 

А в случае соединения с STA333 вобще непонятно зачем обработка в STM32  - она же внутри STA какая-никакая уже есть.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 минут назад, Allregia сказал:

Зависит от того, как обработка сделана. В общем случая-же никто не мешает делать обработку семплов, не лежащих непрерывно в памяти.

Видимо как всегда - для обработки предполагается использование некоей готовой чужой "либы", которая так не умеет.  :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, Allregia said:
Quote

А откуда они в исходном буфере берутся? Если тоже с I2S, то они там уже с чередованием.

Я обычно эти буфера в структуру заворачиваю.

Вообще, в чем именно состоит проблема - не понял.

Quote

Нет, данные берутся не с I2S, а с другого источника, просто есть два буфера, один для левого и один для правого канала.

Quote

Ну еще там есть некторые заморочки с частотами тактированя. Я правда, практически никогда не использовал его от внутреннго PLL, т.к. требования как правило были гораздо выше, чем он может обеспечить. Но для STA333 это конечно оверкилл, там и внутреннего выше крыши.

Внутреннего I2S PLL вполне хватает для некторых комбинаций частот. Не очень понятно, какую частоту нужно подавать на вход XTI STA333W. Работает (два канала из четырех) только от XTI=12.288 MHz = Fs*256, где Fs=48kHz, 16 бит на канал. Т.е. частоты на входах получаются такие:

XTI = 12.288 MHz = Fs * 256.

BCKI = 1.536 MHz  = Fs * 32, где 32 бита на два канала.

LRCKI = Fs = 48 kHz.

Fpwm = 384kHz = Fs *8.

А в документации на STA333W написано, что для Fs = 48 kHz нужна частота 49,152 MHz. Вот здесь совсем не понятно, почему 49.152 MHz и вообще не описаны поддержиаемые частоты XTI, BCLKI.

 

 

2 hours ago, jcxz said:

Видимо как всегда - для обработки предполагается использование некоей готовой чужой "либы", которая так не умеет.  :biggrin:

Quote

Никакие чужие либы не используются. Для STA333W либ нет. На все семейство описание скудное. Есть несколько примеров, но в готовом оборудовании (LCD TV). В русскоязычном сегменте одни чинщики аппаратуры про них спрашивали, разработчики не упоминали. У ST на комьюнити тоже тишина.

 

2 hours ago, Allregia said:
Quote

Зависит от того, как обработка сделана. В общем случая-же никто не мешает делать обработку семплов, не лежащих непрерывно в памяти.

Все равно ведь, для какой-то серьезной обработки STM32F4 мало пригоден, тут H7 или G4, да и то...

А в случае соединения с STA333 вобще непонятно зачем обработка в STM32  - она же внутри STA какая-никакая уже есть.

Никто не мешает обрабатывать сэмплы через один, достаточно написать свои обработчики. Если данные приходят не от I2S, то нужно собирать их в буфер.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 minutes ago, Pridnya said:

Внутреннего I2S PLL вполне хватает для некторых комбинаций частот.

Вопрос не в комбинации а в джиттере. Но для STA плл-я более чем.

 

10 minutes ago, Pridnya said:

А в документации на STA333W написано, что для Fs = 48 kHz нужна частота 49,152 MHz. Вот здесь совсем не понятно, почему 49.152 MHz и вообще не описаны поддержиаемые частоты XTI, BCLKI.

49.162 = это 1024фс,,  одна из стандарных аудио частот для клоков.

Я с STA особо не разбирался, но вроде внутри там все на 96/24 происходит.

Частота битклока напрямую зависи от разрядности данных,  как правило она 64фс, но в древних устройствах бывает и 32фс.

Про XTI там четко пишут что должна быьт кратна Fs:

The external clock frequency provided to the XTI pin must be a multiple of the input
sampling frequency (fS).
The relationship between the input clock and the input sampling rate is determined by both
the MCSx and the IR (input rate) register bits. The MCSx bits determine the PLL factor
generating the internal clock and the IR bit determines the oversampling ratio used
internally.

Еще там дальше про оверсемплинг пишут.

15 minutes ago, Pridnya said:

Нет, данные берутся не с I2S, а с другого источника, просто есть два буфера, один для левого и один для правого канала.

 

Ну тогда вручную сливать эти два буфера в один с чередованием, а потом уже передавать его на ДМА.

ДМА-шный буфер лучше делать кольцевым с двойной буферизацией и двумя прерываниями.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 minutes ago, Allregia said:
Quote

Вопрос не в комбинации а в джиттере. Но для STA плл-я более чем.

49.152 = это 1024фс,,  одна из стандарных аудио частот для клоков.

Я с STA особо не разбирался, но вроде внутри там все на 96/24 происходит.

Частота битклока напрямую зависи от разрядности данных,  как правило она 64фс, но в древних устройствах бывает и 32фс.

Про XTI там четко пишут что должна быьт кратна Fs:

The external clock frequency provided to the XTI pin must be a multiple of the input
sampling frequency (fS).
The relationship between the input clock and the input sampling rate is determined by both
the MCSx and the IR (input rate) register bits. The MCSx bits determine the PLL factor
generating the internal clock and the IR bit determines the oversampling ratio used
internally.

Еще там дальше про оверсемплинг пишут.

49.152 MHz = 1024 * Fs, где Fs=48kHz, но судя по описанию на STA333W, режим 1024*Fs не поддерживается микросхемой (я приводил таблицу в начале топика), поддерживаются режимы 32-768, поэтому не понятно, какая частота должна подаваться на вход ХTI.

Сейчас частота XTI кратна Fs: XTI=256*Fs=12.288 MHz, где Fs=48kHz, но работают два канала из четырех, левый 200 Гц, правый 100 Гц.

STM32F407 I2S умеет выдавать Fs*256.

А в этом описании есть два термина external clock и internal clock (49.152 MHz for Fs 48 kHz) и еще к чему-то PLL упоминается, что предполагает кратность частот (подаем одну - получаем другую).

 

I2S_16bit_1A_2A.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Pridnya said:

STM32F407 I2S умеет выдавать Fs*256.

Это если работать с pll и использовать выход mclk.

Я обычнно работаю с внешним mclk, 512 или 1024Fs

А с STA333 навскидку действительно не понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 minutes ago, Allregia said:

Это если работать с pll и использовать выход mclk.

Я обычнно работаю с внешним mclk, 512 или 1024Fs

А с STA333 навскидку действительно не понятно.

От внешнего кварцевого генератора подаете сигнал на вход mclk I2S Slave?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

39 minutes ago, Pridnya said:

От внешнего кварцевого генератора подаете сигнал на вход mclk I2S Slave?

Внешний мастерклок подается  на CK_IN (РС9).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...