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

 
 
> Конфигурация 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



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

 


RSS Текстовая версия Сейчас: 5th July 2025 - 13:34
Рейтинг@Mail.ru


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