Перейти к содержанию
    

Конфигурация SPI_I2S prescaler register STM32F40xx

Колупаю пример 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

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


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

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

 *-----------------------------------------------------------------------------
 *        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.

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


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

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

 

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

 

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

 

  *-----------------------------------------------------------------------------
  *        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 выкладывает заведомо некорректно настроенные примеры.

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

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

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

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

×
×
  • Создать...