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

 
 
> I2S Slave Прием - хелп!, Глючит
Allregia
сообщение Mar 4 2013, 16:26
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Работал с I2S-мастером, что прием что передача в 16 битах - никаких проблем небыло.
Сейчас пробую прием слейвом 24-2 бита, не могу понять где глюки.

I2S3 - мастер-передатчик, с него подаю прямо на I2S2 - слейв-приемник.
Передаю одно и то-же число в каждом канале, 32 бита, 48кгц., передатик тактируется внешним клоком.
Контролирую осциллографом шину - там все идеально, числа соответствуют.
Приемник считывает в 2 переменые - и там числа не совпадают с переданными.
Причем клик на ресет - и там уже другие числа.

Инициализация приемника такая:
CODE

void InitI2S2(void){ // slave receiver

I2S_InitTypeDef I2S2_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
u32 d;

RCC_I2SCLKConfig(RCC_I2S2CLKSource_Ext);
/* Enable the I2S peripheral clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

// GPIO
GPIO_PinAFConfig(GPIOB,GPIO_PinSource12, GPIO_AF_SPI2); // WCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource13, GPIO_AF_SPI2); // BCLK
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15, GPIO_AF_SPI2); // SDATA

GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_15; // WCLK, BCLK, SDATA
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

//------------------------------------------------------------------------
I2S_StructInit(&I2S2_InitStructure);
I2S2_InitStructure.I2S_AudioFreq =I2S_AudioFreq_Default;
I2S2_InitStructure.I2S_Standard = I2S_Standard_MSB;
I2S2_InitStructure.I2S_DataFormat = I2S_DataFormat_32b;
I2S2_InitStructure.I2S_CPOL = I2S_CPOL_Low;
I2S2_InitStructure.I2S_Mode = I2S_Mode_SlaveRx;
I2S2_InitStructure.I2S_MCLKOutput = I2S_MCLKOutput_Disable;

I2S_Init(SPI2, &I2S2_InitStructure);
// -------------- interrupt:
NVIC_InitStructure.NVIC_IRQChannel = SPI2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = I2SInputPriority;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = I2SInputSubPriority;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);

while( (GPIOB->IDR & GPIO_Pin_12) 0= 0 ); // wait for WCLK=1
while( (GPIOB->IDR & GPIO_Pin_12) != 0 );// wait for WCLK=0

d=(uint32_t)SPI3->DR; // to clear RXNE bit if was
d=(uint32_t)SPI3->SR; // to clear flags, if were

SPI_I2S_ITConfig(SPI2,SPI_I2S_IT_RXNE,ENABLE); // enable interrupt

I2S_Cmd(SPI2, ENABLE); // enable I2S2
}


прием по прерыванию делаю так:
Код
volatile u16 LDataRcvL, LDataRcvH, RDataRcvL, RDataRcvH; // сюда считываю
    
void SPI2_IRQHandler(void){
     static u32 chan, sequence;
    
        chan = (SPI2->SR & I2S_FLAG_CHSIDE);               // read CHSIDE = 0 for LEFT, 1 for RIGHT
        InpData=SPI2->DR;//SPI_I2S_ReceiveData(SPI2);   //  read reveived data
        sequence <<= 1;              // bit1 = old
        sequence &= 0x2;             // leave only bit1 = old chan value
        if (chan)  sequence |=1;   //  bit0 = new chan value
        //---------------------------------------------------------
        switch (sequence){
             case 0:  LDataRcvL = InpData; break;    // Left Low
             case 2:  LDataRcvH = InpData; break;    // Left High
             case 1:  RDataRcvH = InpData; break;   //  Right High
             case 3:  RDataRcvL = InpData; break;   //  Right Low,  End Of 2 channel receiving
       }
  }


Помогите пожалуйста, понять в чем дело. Второй день бьюсь, что я делаю не так?
Чувствую что где-то какая-то детская ошибка, понять бы где...

Сообщение отредактировал IgorKossak - Mar 6 2013, 07:30
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Allregia
сообщение Mar 9 2013, 17:13
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



В общем, сделал я и передачу и прием по DMA. Процессор посли инициализации вооще ничего не делает (while(1)wink.gif, кроме прерывания от системного таймера.
На 48 и 96 - все идеально, 192 - не работает, постоянная ошибка синхронизации.
Я уже в шоке - у меня идеи кончилисьsad.gif
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Mar 9 2013, 19:28
Сообщение #3


Гуру
******

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



Цитата(Allregia @ Mar 9 2013, 21:13) *
На 48 и 96 - все идеально, 192 - не работает, постоянная ошибка синхронизации.
Я уже в шоке - у меня идеи кончилисьsad.gif

Ну, может, оно и не умеет на 192 в слейве работать? В даташите до сих пор стоят умилительные TBD вместо таймингов.
Go to the top of the page
 
+Quote Post
Allregia
сообщение Mar 9 2013, 22:46
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 047
Регистрация: 28-06-07
Из: Israel
Пользователь №: 28 763



Цитата(aaarrr @ Mar 9 2013, 21:28) *
Ну, может, оно и не умеет на 192 в слейве работать? В даташите до сих пор стоят умилительные TBD вместо таймингов.


Может и не умеет, это весьма печально, потому что тогда у меня сильно ограничиться область применения устройства.
В даташите много чего непонятно, например почему в делителе частоты i2s нельзя ставить ни 0 ни 1, только начиная с 2. Если почему нельзя 0 понятно, то почему нельзя 1 - нет.
Кстати, хотья они пишут что нельзя, но с 1-й там оно тоже на 96К прекрасно работает.

Тайминги есть в даташите на F2, и я не думаю что у F4 этот блок чем-то отличается. Да и по логике - представляя немножко как оно внутри устроено, работа на 192 не должна чем-то отличаться от работы на 96, это еще не те частоты, где может что-то повлиять на работу обычного сдвигового регистра и его обвязки.

Но может я что-то упускаю, и в программе есть баг? Что раньше надо - разрешать DMA или разрешать I2S? Я, правда, пробовал и так и так, разницу не заметил. Или может флажек какой-то надо срасывать? Сама передачи и прием идут совершенно устойчиво - если принимает неправильно, то оно "неправильно" всегда по одинаковому, т.е. конкретно переданная константа принимается неправильным значением, но таким-же константным. Сбоев в процессе передачи-приема нет, проблем только в начальной синхронизации приемника с LRCLK.

Может это вообще аппратная проблема, и надо на шину попробовать 10-20пф конденсаторов навешать?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Allregia   I2S Slave Прием - хелп!   Mar 4 2013, 16:26
- - drum1987   в прерывании sequence изначально чему равно? если ...   Mar 4 2013, 17:14
|- - Allregia   Цитата(drum1987 @ Mar 4 2013, 19:14) в пр...   Mar 4 2013, 18:37
- - drum1987   сори не заметил строку sequence |=1;   Mar 4 2013, 19:07
- - Allregia   Кстати, я еше не пойму важно ли в каком порядке сч...   Mar 4 2013, 19:28
- - drum1987   Попробуйте в прерывании еще проверять флаг RXNE......   Mar 5 2013, 05:17
- - Allregia   Попробую, хотя - другие источники преывания коме R...   Mar 5 2013, 06:10
- - Allregia   Что-то страннно, сделал перекомпиляцию всей програ...   Mar 5 2013, 21:31
- - Allregia   Пришлось в конце прерывания поставить __ISB(); с...   Mar 6 2013, 14:29
|- - aaarrr   Цитата(Allregia @ Mar 6 2013, 18:29) с ни...   Mar 6 2013, 14:58
|- - Allregia   Цитата(aaarrr @ Mar 6 2013, 16:58) И охот...   Mar 6 2013, 22:47
|- - aaarrr   Цитата(Allregia @ Mar 7 2013, 02:47) И эт...   Mar 6 2013, 23:11
|- - Allregia   Цитата(aaarrr @ Mar 7 2013, 01:11) Нет, п...   Mar 7 2013, 06:01
- - Allregia   Что-то у меня не получается I2S3 Master in DMA зап...   Mar 7 2013, 09:45
- - Allregia   Но обнаружил другую проблему - случайно проинитил ...   Mar 7 2013, 11:25
|- - Uuftc   Цитата(Allregia @ Mar 10 2013, 02:46) В д...   Mar 12 2013, 01:46
|- - Allregia   Цитата(Uuftc @ Mar 12 2013, 03:46) Там на...   Mar 12 2013, 08:53
- - Allregia   Только что звонил приятель, который параллельно со...   Mar 10 2013, 14:11


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

 


RSS Текстовая версия Сейчас: 9th August 2025 - 06:58
Рейтинг@Mail.ru


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