|
I2S Slave Прием - хелп!, Глючит |
|
|
|
Mar 4 2013, 16:26
|
Профессионал
    
Группа: Свой
Сообщений: 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] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Mar 9 2013, 22:46
|
Профессионал
    
Группа: Свой
Сообщений: 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пф конденсаторов навешать?
|
|
|
|
|
Mar 12 2013, 01:46
|
Местный
  
Группа: Свой
Сообщений: 234
Регистрация: 3-10-04
Из: Кукуево-Дальнее
Пользователь №: 767

|
Цитата(Allregia @ Mar 10 2013, 02:46)  В даташите много чего непонятно, например почему в делителе частоты i2s нельзя ставить ни 0 ни 1, только начиная с 2. Если почему нельзя 0 понятно, то почему нельзя 1 - нет. Кстати, хотья они пишут что нельзя, но с 1-й там оно тоже на 96К прекрасно работает. Там начинаются странности с DIV 1 и ODD 1 Вообще впечатление такое, что в доке просто забили описывать все "странности" I2S, коих у STM32F куча. Цитата(Allregia @ Mar 10 2013, 02:46)  Сама передачи и прием идут совершенно устойчиво - если принимает неправильно, то оно "неправильно" всегда по одинаковому, т.е. конкретно переданная константа принимается неправильным значением, но таким-же константным. Сбоев в процессе передачи-приема нет, проблем только в начальной синхронизации приемника с LRCLK. В errata на stm32f4 было нечто похожее
|
|
|
|
Сообщений в этой теме
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    Allregia Цитата(Uuftc @ Mar 12 2013, 03:46) Там на... Mar 12 2013, 08:53 Allregia Только что звонил приятель, который параллельно со... Mar 10 2013, 14:11
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|