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

 
 
 
Reply to this topicStart new topic
> Конфигурация SPI_I2S prescaler register STM32F40xx
flopix
сообщение Jul 31 2013, 17:59
Сообщение #1


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

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Колупаю пример Audio_playback_and_record идущий с STM32F4Discovery и заметил что частота воспроизведения файлов заметно отличается от 44100 в меньшую сторону. Как физически замерить реальную частоту не придумал.

Вот что генерирует утилита STM32F4xx_Clock_Configuration_V1.1.0.xls

Код
  *-----------------------------------------------------------------------------
  *        I2S input clock(Hz)                    | 86000000
  *                                               |
  *        To achieve the following I2S config:   |
  *         - Master clock output (MCKO): OFF     |
  *         - Frame wide                : 16bit   |
  *         - Audio sampling freq (KHz) : 44,1    |
  *         - Error %                   : 0,0967  |
  *         - Prescaler Odd factor (ODD): 0       |
  *         - Linear prescaler (DIV)    : 2       |
  *-----------------------------------------------------------------------------


Не пойму как тут получается частота 44100 да еще и с погрешностью 0,0967.

Согласно даташита если ODD = 0 то real divider value is = I2SDIV *2

86000000/256/(2*2) = 83984,375

Нужно еще делить на 2 канала или на 2 байта так как ширина потока данных 16 бит?
Ну и все равно погрешность получается достаточно большой 44100/41992,1875*100-100 = 5,02%.




А вот как рассчитывается значения делителя в функции I2S_Init

Код
    tmp = (uint16_t)(((((i2sclk / 256) * 10) / I2S_InitStruct->I2S_AudioFreq)) + 5);
/* Remove the flatting point */
    tmp = tmp / 10;
/* Check the parity of the divider */
    i2sodd = (uint16_t)(tmp & (uint16_t)0x0001);
  
    /* Compute the i2sdiv prescaler */
    i2sdiv = (uint16_t)((tmp - i2sodd) / 2);
  
    /* Get the Mask for the Odd bit (SPI_I2SPR[8]) register */
    i2sodd = (uint16_t) (i2sodd << 8);


Тут рассчет понятный за исключением того что такое 5 в первой формуле??
В результате получаются те же
i2sdiv = 2
i2sodd = 0

В чем я не прав? Как мне подобрать наименьшую погрешность частоты на выходе учитывая что МК тактируется от внешнего кварца 8МГц?

Сообщение отредактировал flopix - Jul 31 2013, 18:07
Go to the top of the page
 
+Quote Post
Flexz
сообщение Aug 1 2013, 07:30
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 9-10-08
Из: Московская обл.
Пользователь №: 40 797



Поигрался сейчас еще с тулзой, так вот - считает она вроде бы верно. При 8МГц кварце получил такие параметры
CODE

*-----------------------------------------------------------------------------
* System Clock source | PLL (HSE)
*-----------------------------------------------------------------------------
* SYSCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* HCLK(Hz) | 168000000
*-----------------------------------------------------------------------------
* AHB Prescaler | 1
*-----------------------------------------------------------------------------
* APB1 Prescaler | 4
*-----------------------------------------------------------------------------
* APB2 Prescaler | 2
*-----------------------------------------------------------------------------
* HSE Frequency(Hz) | 8000000
*-----------------------------------------------------------------------------
* PLL_M | 8
*-----------------------------------------------------------------------------
* PLL_N | 336
*-----------------------------------------------------------------------------
* PLL_P | 2
*-----------------------------------------------------------------------------
* PLL_Q | 7
*-----------------------------------------------------------------------------
* PLLI2S_N | 271
*-----------------------------------------------------------------------------
* PLLI2S_R | 6
*-----------------------------------------------------------------------------
* I2S input clock(Hz) | 45000000
* |
* To achieve the following I2S config: |
* - Master clock output (MCKO): ON |
* - Frame wide : 16bit |
* - Audio sampling freq (KHz) : 44,1 |
* - Error % : 0,0000 |
* - Prescaler Odd factor (ODD): 0 |
* - Linear prescaler (DIV) : 2 |
*-----------------------------------------------------------------------------

Так вот, если посмотреть внимательно на окно экселя и вывод в файл - видим что в файое I2S input clock(Hz) 45000000, однако в экселе - 45.1667МГц, да и если просто посчитать - 1Мгц * 271 / 6 = 45166666Гц и 45166666Гц/ (256 * 4) = 44108Гц, что довольно близко к искомым 44100.
Go to the top of the page
 
+Quote Post
flopix
сообщение Aug 1 2013, 10:43
Сообщение #3


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

Группа: Участник
Сообщений: 105
Регистрация: 21-06-12
Пользователь №: 72 429



Наверно ексель скрипты ожидают другой разделитель дробной части в системе. Сейчас изменю и проверю.

Да после установки в региональных настройках точки как разделитель целой и дробной части скрипт стал работать нормально.

Со следующими настройками воспроизведения происходит полностью синхронно с ПК. sm.gif

Код
  *-----------------------------------------------------------------------------
  *        I2S input clock(Hz)                    | 45166700
  *                                               |
  *        To achieve the following I2S config:   |
  *         - Master clock output (MCKO): ON      |
  *         - Frame wide                : 16bit   |
  *         - Audio sampling freq (KHz) : 44.1    |
  *         - Error %                   : 0.0183  |
  *         - Prescaler Odd factor (ODD): 0       |
  *         - Linear prescaler (DIV)    : 2       |
  *-----------------------------------------------------------------------------


Вот почему ST выкладывает заведомо некорректно настроенные примеры.
Go to the top of the page
 
+Quote Post

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

 


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


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