реклама на сайте
подробности

 
 
> I2S full duplex dma, Сбой в режиме DMA
nicks80
сообщение Sep 8 2016, 19:58
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 18-10-07
Пользователь №: 31 485



Проблема в следующем.
Имеется кодек UDA1344 в связке с stm32f407vet6
Данные читаются по I2S из кодека в память и потом выдаются в кодек обратно по I2S с помощью DMA.
Все работает как часы но на объекте раз в день или два. происходит сбой. результатом такого сбоя является сильный шум из кодека.
Как я понял такой шум появляется если самому дотронутся до линии CK I2S. которая отвечает за очередность передачи битов.
Печально что восстановления не происходит при переходе 1 в 0 или наоборот 0 в 1 линии WS(LR CH). То есть получается что данные так и идут перемешанными битами соответственно и програмно никак это не отследишь.
Но оно и понятно если бит(помеха) лишний проскочил то все уже съехало а dma все шлет и шлет. какими средствами справляться хз.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
aaarrr
сообщение Sep 11 2016, 11:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Давайте уточним: сбивается только прием, передача остается нормальной? Можете схему включения привести?
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 11 2016, 11:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Завести сигнал клока параллельно на любой таймерный вход в счётном режиме и подсчитывать число переходов 0->1 и 1->0 за время кадра по этому таймеру. Если получено недопустимое число - реинит I2S.

2ТС: Вы ищете сочуствие или всё-таки совет?? Если 2ое, то чтобы получить осмысленные и полезные советы, следует приводить подробное и внятное описание проблемы. Сюда следует отнести: схемы включения, диаграммы сигналов и т.п. Ибо здесь не форум телепатов.
Go to the top of the page
 
+Quote Post
nicks80
сообщение Sep 11 2016, 12:42
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 97
Регистрация: 18-10-07
Пользователь №: 31 485



Цитата(jcxz @ Sep 11 2016, 15:29) *
Завести сигнал клока параллельно на любой таймерный вход в счётном режиме и подсчитывать число переходов 0->1 и 1->0 за время кадра по этому таймеру. Если получено недопустимое число - реинит I2S.

2ТС: Вы ищете сочуствие или всё-таки совет?? Если 2ое, то чтобы получить осмысленные и полезные советы, следует приводить подробное и внятное описание проблемы. Сюда следует отнести: схемы включения, диаграммы сигналов и т.п. Ибо здесь не форум телепатов.

1й вариант отпадает т.к. непонятно как помеха поведет себя по отношению к этим двум ногам. понятно что процессор выдает клоки нормальные. наверно здесь лучше таймер завести по перепаду WS и сравнивать допустим через 1024 отсчета границы сигнала WS.

схема включения стандартная


Цитата(aaarrr @ Sep 11 2016, 16:00) *
На прием используется отдельный I2S?

нет, все одним I2S2 принимается и передается.

CODE
/// Peripheral DMA init
hdma_i2s2_ext_rx.Instance = DMA1_Stream3;
hdma_i2s2_ext_rx.Init.Channel = DMA_CHANNEL_3;
hdma_i2s2_ext_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_i2s2_ext_rx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s2_ext_rx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s2_ext_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_i2s2_ext_rx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s2_ext_rx.Init.Mode = DMA_CIRCULAR;
hdma_i2s2_ext_rx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2s2_ext_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;//ENABLE;
hdma_i2s2_ext_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
hdma_i2s2_ext_rx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2s2_ext_rx.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_i2s2_ext_rx);

__HAL_LINKDMA(hi2s,hdmarx,hdma_i2s2_ext_rx);

hdma_i2s2_ext_tx.Instance = DMA1_Stream4;
hdma_i2s2_ext_tx.Init.Channel = DMA_CHANNEL_0;
hdma_i2s2_ext_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_i2s2_ext_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_i2s2_ext_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_i2s2_ext_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_i2s2_ext_tx.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_i2s2_ext_tx.Init.Mode = DMA_CIRCULAR;
hdma_i2s2_ext_tx.Init.Priority = DMA_PRIORITY_HIGH;
hdma_i2s2_ext_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;//ENABLE;
hdma_i2s2_ext_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_HALFFULL;
hdma_i2s2_ext_tx.Init.MemBurst = DMA_MBURST_SINGLE;
hdma_i2s2_ext_tx.Init.PeriphBurst = DMA_PBURST_SINGLE;
HAL_DMA_Init(&hdma_i2s2_ext_tx);

__HAL_LINKDMA(hi2s,hdmatx,hdma_i2s2_ext_tx);


.............
hi2s2.Instance = SPI2;
hi2s2.Init.Mode = I2S_MODE_MASTER_TX;
hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;//I2S_DATAFORMAT_16B;
hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
hi2s2.Init.AudioFreq = g_nI2SFreq[nSR];
hi2s2.Init.CPOL = I2S_CPOL_LOW;

hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;

RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2S;
PeriphClkInitStruct.PLLI2S.PLLI2SN = g_nI2SPLLN[nSR];
PeriphClkInitStruct.PLLI2S.PLLI2SR = g_nI2SPLLR[nSR];
HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);


HAL_I2S_Init(&hi2s2);
HAL_I2SEx_TransmitReceive_DMA(&hi2s2,(unsigned short*)i2s2_DelayBuf,(unsigned short*)i2s2_DelayBuf,(nDelay* ( 1<<nFFT ))*I2S2_DELAY_BUFFCHANNELS);

MX_TIM7_Init(g_nI2S_SR[nSR],1<<nFFT);

g_nI2S2_nFFT = nFFT;
g_nI2S2_DelayBufCmpl = 0;

g_nI2S2_nSR = nSR;


я наверно совсем заблудился. Если мастер процессор и он выдает сигналы WS. то получается кодек неверные данные выдает я же его тактирую.

Сообщение отредактировал IgorKossak - Sep 12 2016, 17:51
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- nicks80   I2S full duplex dma   Sep 8 2016, 19:58
- - _4afc_   Если сбой не отражается в статусных регистрах stm3...   Sep 9 2016, 13:18
- - OVladimir   Не знаю, поможет или нет, но похожую проблему приш...   Sep 9 2016, 13:48
|- - nicks80   Цитата(OVladimir @ Sep 9 2016, 17:48) Не ...   Sep 10 2016, 18:46
- - OVladimir   Я использовал только TXE прерывание для проверки р...   Sep 11 2016, 09:25
|- - nicks80   Цитата(OVladimir @ Sep 11 2016, 13:25) Я ...   Sep 11 2016, 09:44
- - aaarrr   Случаи разные: у OVladimir'а МК ведомый, а у в...   Sep 11 2016, 09:52
|- - nicks80   Цитата(aaarrr @ Sep 11 2016, 13:52) Случа...   Sep 11 2016, 10:50
||- - jcxz   Цитата(nicks80 @ Sep 11 2016, 18:42) я на...   Sep 11 2016, 14:00
|- - nicks80   Цитата(aaarrr @ Sep 11 2016, 15:16) Давай...   Sep 11 2016, 11:52
|- - aaarrr   Цитата(nicks80 @ Sep 11 2016, 14:52) сбив...   Sep 11 2016, 12:00
- - Genadi Zawidowski   Судя по схеме, кодек в режиме конфигурирования пин...   Sep 11 2016, 16:06
|- - nicks80   Цитата(Genadi Zawidowski @ Sep 11 2016, 20...   Sep 11 2016, 18:04
|- - jcxz   Цитата(nicks80 @ Sep 12 2016, 00:04) но в...   Sep 12 2016, 03:57
||- - nicks80   Цитата(jcxz @ Sep 12 2016, 07:57) Кол-во ...   Sep 12 2016, 12:06
|- - _4afc_   Цитата(nicks80 @ Sep 11 2016, 22:04) Но с...   Sep 12 2016, 07:32
- - nicks80   Что только не предпринимал оказывалось костылями. ...   Sep 15 2016, 20:23


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 22:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01383 секунд с 7
ELECTRONIX ©2004-2016