• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
levshkatov

Проблема с I2S на STM32F407

1 сообщение в этой теме

levshkatov    0

День добрый. 
Пробую запустить I2S на STMF407. Использую HAL. Проблема в том, что данные передаются ровно в два раза медленнее, чем это требуется. Тактирование на ножках проверял, WS ровно столько сколько я поставлю (8к, 44к и тд). CK в 32 раза больше WS. MCK в 256 раз больше, все как и должно быть. Но пакет данных из 1000 байт передается за 62мс, хотя должен за 31 передаваться (при sample rate = 8000Hz). Без разницы, polling mode или DMA.
Части кода:

#define WAV_BUFFER_SIZE 1000
uint8_t wavReadBuffer[WAV_BUFFER_SIZE];

for(uint16_t i = 0; i < WAV_BUFFER_SIZE; i++){
    wavReadBuffer[i] = 0xff;
}

HAL_I2S_Transmit(&hi2s2, (uint16_t*)wavReadBuffer, WAV_BUFFER_SIZE, 5000);

static void MX_I2S2_Init(void)
{
    hi2s2.Instance = SPI2;
    hi2s2.Init.Mode = I2S_MODE_MASTER_TX;
    hi2s2.Init.Standard = I2S_STANDARD_MSB;
    hi2s2.Init.DataFormat = I2S_DATAFORMAT_16B;
    hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
    hi2s2.Init.AudioFreq = ((uint32_t)8000U);
    hi2s2.Init.CPOL = I2S_CPOL_LOW;
    hi2s2.Init.ClockSource = I2S_CLOCK_PLL;
    hi2s2.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
    if (HAL_I2S_Init(&hi2s2) != HAL_OK){Error_Handler();}
}


 

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


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

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: ToRcH2565
      Добрый день, недавно начал изучать азы STM, и наткнулся на интересную возможность, а именно отправлять текст через отладочный порт:
      https://hubstub.ru/stm32/111-otladka-po-swd-stm32.html  (дабы долго не обьяснять о чем я веду речь, ибо без знания терминов это может затянутся).
      Так вот, столкнулся я с проблемкой, а именно где же можно данные сообщения посмотреть в EmBlocks, отладочные окна пролез все, там не нахожу, возможно нужно ковырять глубже настройки среды? или данная среда не умеет отображать эти сообщения?
      Очень не хотелось бы городить UART для отображение отладочных сообщений...
    • Автор: Motrosoff8888
      Всем привет! Ребят есть вот это STM32F030K6T6 
      вот это, адаптер для прошивки  
      и это, собственно чем прошить. 
      Имеется прошивка, скетч, для двух Atmega328p. Есть пьезоэлементы, которые подсоединены к аналоговому пину, при касании, одна другой передаёт символы через NRF24l01, друга принимает таким же модулем и отправляет данные по блютус HC-05 на телефон.  Хотелось бы перенести её на STM32, не бесплатно конечно но и в рамках разумного. Цель переноса на STM32 - увеличить скорость отклика (задержка между ударом по пьезику и появлением символа в мониторе порта телефона) пьезо! И есть уже адаптер для прошивки МК с 32 ножками. Буду признателен если кто то ответит, можно в ЛС
    • Автор: Motrosoff8888
      Всем привет! Ребят есть вот это STM32F030K6T6 
      вот это, адаптер для прошивки 
      и это, собственно чем прошить. 
      Имеется прошивка для двух Atmega328p. Есть пьезоэлементы, которые подсоединены к аналоговому пину, при касании, одна другой передаёт символы через NRF24l01, друга принимает таким же модулем и отправляет данные по блютус HC-05 на телефон.  Хотелось бы перенести её на STM32, не бесплатно конечно но и в рамках разумного. Цель переноса на STM32 - увеличить скорость отклика (задержка между ударом по пьезику и появлением символа в мониторе порта телефона) пьезо! И есть уже адаптер для прошивки МК с 32 ножками. Буду признателен если кто то ответит, можно в ЛС
    • Автор: saer2
      Добрый!
      Осваиваю стм32.
      Уточните пожалуйста, есть ли описание библиотеки stblib ? 
      как с ней работать?
    • Автор: karomag
      Помогите! Не пойму, почему не работает код. Хотя он был рабочий, пока я что-то не "оптимизировал"...
      // Общие выводы индикатора #define D0 GPIO_Pin_14 #define D1 GPIO_Pin_13 #define D2 GPIO_Pin_12 #define ALL_CATOD ( D0 | D1 | D2 ) // К какой ноге какой сегмент подключен #define SEG_A GPIO_Pin_0 #define SEG_B GPIO_Pin_1 #define SEG_C GPIO_Pin_2 #define SEG_D GPIO_Pin_3 #define SEG_E GPIO_Pin_4 #define SEG_F GPIO_Pin_5 #define SEG_G GPIO_Pin_6 //Собираем цифры из сегментов #define DIG0 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F ) #define DIG1 ( SEG_B | SEG_C ) #define DIG2 ( SEG_A | SEG_B | SEG_G | SEG_E | SEG_D ) #define DIG3 ( SEG_A | SEG_B | SEG_G | SEG_C | SEG_D ) #define DIG4 ( SEG_F | SEG_G | SEG_B | SEG_C) #define DIG5 ( SEG_A | SEG_F | SEG_G | SEG_C | SEG_D ) #define DIG6 ( SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G ) #define DIG7 ( SEG_A | SEG_B | SEG_C ) #define DIG8 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G) #define DIG9 ( SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G) #define ALL_SEG (DIG8 ) void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Pin = ALL_SEG | ALL_CATOD; GPIO_Init(GPIOA, &GPIO_InitStructure); } void show_temp(void) { u16 tmp; // Содержит копию counter (из него по очереди исключаются последние цифры) u8 digit; // В эту переменную поочередно записываются цифры из которых состоит число counter u16 catods[] = { D0, D1, D2 }; u8 digitsp[] = { DIG0, DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7, DIG8, DIG9 }; u8 i; tmp = measureT; for (i = 0; i < 3; i++) { if (tmp > 0) { //Вытаскиваем первую справа цифру из числа counter digit = tmp % 10; tmp = tmp / 10; //Выключаем все разряды. 1 на катоды GPIOA->ODR |= ALL_CATOD; //Включаем i разряд индикатора GPIOA->ODR &= ~catods[i]; //Выводим цифру в i разряд GPIOA->ODR &= ~DIG8; //Выключаем все сегменты GPIOA->ODR |= digitsp[digit]; //Зажигаем нужные //Небольшая задержка. Пусть цифра погорит некоторое время delay_ms(1000); } } } Большую задержку поставил, чтобы глазом было видно результат. Число 123 отображается: сначало 33, потом 22, потом 111. Почему загорается несколько разрядов, хотя GPIOA->ODR &= ~catods;?