Jump to content
Sign in to follow this  
German Churilin

шум на выходе внешнего dac-а

Recommended Posts

Posted (edited)

Добрый день всем! Столкнулся с проблемой, над решением которой бьюсь уже месяц - суть в том, что при пересылке аудио данных с контроллера в внешний цап на выходе цапа звучит белый шум(именно когда летят данные). Уже перепробовал разные конфигурации и параметры, да даже другой цап ставил - всё равно та же самая проблема. Может кто сталкивался, или у кого есть идеи почему так происходит?
Контроллер stm32f407ve китайский, но вроде как рабочий, цап - pcm1606, вытащенный из двд-плеера.

код инициализации i2s

	RCC_PLLI2SCmd(DISABLE);

	RCC_I2SCLKConfig(RCC_I2S2CLKSource_PLLI2S);
	RCC_PLLI2SConfig(200,5);

	RCC_PLLI2SCmd(ENABLE);

	while(RCC_GetFlagStatus(RCC_FLAG_PLLI2SRDY) == RESET){};

	//WS - word clock output
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_SPI2);
	GPIO_StructInit(&gpioInit);

	gpioInit.GPIO_Pin = GPIO_Pin_9;
	gpioInit.GPIO_Mode = GPIO_Mode_AF;
	gpioInit.GPIO_OType = GPIO_OType_PP;
	gpioInit.GPIO_PuPd = GPIO_PuPd_NOPULL;
	gpioInit.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_Init(GPIOB, &gpioInit);

	//BCLK - shift clock output
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_SPI2);
	gpioInit.GPIO_Pin = GPIO_Pin_10;
	GPIO_Init(GPIOB, &gpioInit);

	//SD - serial audio data
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2);
	gpioInit.GPIO_Pin = GPIO_Pin_3;
	GPIO_Init(GPIOC, &gpioInit);

	//MCO - master clock output
	GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_SPI2);
	gpioInit.GPIO_Pin = GPIO_Pin_6;
	GPIO_Init(GPIOC, &gpioInit);

	I2S_StructInit(&i2sInit);

	i2sInit.I2S_CPOL = I2S_CPOL_Low;
	i2sInit.I2S_Mode = I2S_Mode_MasterTx;
	i2sInit.I2S_MCLKOutput = I2S_MCLKOutput_Enable;
	i2sInit.I2S_Standard = I2S_Standard_Phillips;
	i2sInit.I2S_AudioFreq = I2S_AudioFreq_48k;
	i2sInit.I2S_DataFormat = I2S_DataFormat_24b;
	I2S_Init(SPI2, &i2sInit);

	SPI2->I2SPR = (uint16_t)((uint16_t)512 | (uint16_t)12 | (uint16_t)1);	//for 48k Fs

	SPI_I2S_DMACmd(SPI2, SPI_I2S_DMAReq_Tx, ENABLE);
	I2S_Cmd(SPI2, ENABLE);

 

код инициализации dma

	DMA_InitTypeDef dmaInit;
	NVIC_InitTypeDef nvicInit;

	DMA_DeInit(DMA1_Stream4);
	DMA_Cmd(DMA1_Stream4, DISABLE);
	while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE){};
	__ISB();

	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA1, ENABLE);

	//To
	dmaInit.DMA_PeripheralBaseAddr = (uint32_t) &(SPI2->DR);
	//From
	dmaInit.DMA_Memory0BaseAddr = (uint32_t)&AUDIO_SAMPLE;
	dmaInit.DMA_BufferSize = 20480;

	dmaInit.DMA_Channel = DMA_Channel_0;
	dmaInit.DMA_DIR = DMA_DIR_MemoryToPeripheral;
	dmaInit.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	dmaInit.DMA_MemoryInc = DMA_MemoryInc_Enable;
	dmaInit.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	dmaInit.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
	dmaInit.DMA_Mode = DMA_Mode_Circular;
	dmaInit.DMA_Priority = DMA_Priority_High;
	dmaInit.DMA_FIFOMode = DMA_FIFOMode_Enable;
	dmaInit.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
	dmaInit.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	dmaInit.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
	while(DMA_GetCmdStatus(DMA1_Stream4) == ENABLE);
	DMA_Init(DMA1_Stream4, &dmaInit);

	DMA_ITConfig(DMA1_Stream4, DMA_IT_TC | DMA_IT_HT, ENABLE);

	//configure interrupt
	nvicInit.NVIC_IRQChannel = DMA1_Stream4_IRQn;
	nvicInit.NVIC_IRQChannelPreemptionPriority = 0;
	nvicInit.NVIC_IRQChannelSubPriority = 0;
	nvicInit.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&nvicInit);

	DMA_Cmd(DMA1_Stream4, ENABLE);
	while(DMA_GetCmdStatus(DMA1_Stream4) != ENABLE){};

AUDIO_SAMPLE просто wav скопированный через hex редактор и живущий в памяти контроллера, крутиться по кругу. Вроде как, в теории всё должно работать(снизу скрин из pulseview - снято логическим анализатором), к сожалению осциллограф пока что не приобрёл, так что проверить правильность частот не представляется возможнымб но всё же всё вроде как красиво.
Формат i2s на контроллере совпадает с форматом на цапе - первый бит передаётся через 1 тик sck после смены ws

 

П.С. подозреваю сразу вопросы про MSB/LSB - wav файл сам по себе little-endian, собственно как и контроллер, то есть тут не должно быть проблем, а i2s стандарт передаёт MSB первым, соответственно если у меня в памяти записано 0x64, 0x61, 0x61, 0x66, 0x02, 0x00, 0x85... то, судя по скрину всё передаётся правильно? или я что то не понимаю в этом всём? Но не в этом суть - в один момент тоже подумал что порядок не тот, но, к сожалению, попытки свапать байты местами(и побайтово, и по словам) не дали ни какого результата

pusleviewscreen.jpg

Edited by German Churilin

Share this post


Link to post
Share on other sites

есть вероятность, что шум не программный. Разводку платы надо внимательно смотреть конкретно по цифровым и аналоговым землям. На внешних ЦАП-ах это охренеть как важно

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Similar Content

    • By n_angelo
      Привет, знатоки. Написал свою первую программу для контроллера STM8L152C6T6 (STM8L-Discovery). Это, собственно, моя первая программа для контроллеров вообще. Я многого не знаю и не понимаю. Возможно ваш ответ на мой вопрос будет банален.
      Используемая периферия: DAC, DMA, TIM4, CLK, GPIO
      Задача у программы такая:
      В EEPROM зашит один период синусоиды с дискретизацией 44100Гц. Период занимает ровно 101 байт, что по сути должно быть равно 2,29мс (1/44100*101). В коде программы только конфигурация периферии, одно прерывание на кнопке и пустой бесконечный цикл, который ничего не делает. Всю работу выполняет таймер, который настроен выдавать запрос к DMA на каждые 1/44100 (ядро тактируется 2мГц, таймер считает до 45). В свою очередь DMA забирает из EEPROM по одному байту на каждый запрос от таймера и передаёт его в DAC. Далее DAC выводит бесконечную синусоиду на ногу PF0. Прерывание на кнопке запускает весь этот механизм и зажигает светодиод.
      Проблема:
      Измеряя ногу PF0 осциллографом было замечено, что период синусоиды занимает около ≈4мс. Фото под катом.
      Меня это расстроило. Экспериментально выяснилось, что стоит только вписать в бесконечный цикл какую-нибудь проверку, например, [если значение текущего байта синусоиды = 0xFF, то зажечь светодиод, если 0x00, то потушить], то осциллограф показывает правильный тайминг в 2(с копейками)мс. В принципе в теле цикла может быть что угодно, кроме пустоты, и тайминг налаживается.
      Я не могу отдебажить дизассемблер, т.к. его не знаю. Это у меня в планах. Но я очень хочу понять, что происходит и почему пустой цикл рушит тайминг.
      Спасибо.
       
       
       
       
    • By maxssau
      Продам адаптеры USB-I2S. 

       
      Возможности:
       
      стерео ввод/вывод PCM 16-32 бита, 44.1-384 кГц. Ввода DSD нет, как и драйверов для ввода DSD.
      вывод DSD в режиме DoP 64-128, в режиме Native 64-256. Native доступен в Linux без "хитрых" драйверов.
      Тактирование от платы ЦАП/АЦП, частоты 512 fs (22.5792/24.576 МГц). Теоретически возможно и 1024fs(скорости 768кГц и DSD512 Native), но это не опробовано.
      Гальваническая изоляция на Si8662/Si8640.
      Питание возможно как Self так и Bus Powered. В режиме Bus Powered необходимо самостоятельно позаботиться о мастерклоке, т.к. возможны сильные глюки при выключенном генераторе мастерклока.
       
      Тема: 
      срок изготовления 3-5 недель (сильно зависит от поставок процессоров).
      На данный момент полностью реализован интерфейс Legacy. Для отладки Native режима пока нет платы ЦАП, в процессе разработки, будет не раньше осени.
      Цена 6000 + пересылка (в среднем 250 р.).
    • By maxssau
      Добрый день!
      Хотелось бы рассказать об очередном своём девайсе: USB аудио интерфейс UI-01.
      Устройство представляет собой USB-I2S адаптер с возможностью вывода PCM/DSD потоков, а так же ввода PCM I2S данных.
      Краткие характеристики:
      - Процессор XMOS XUF208, 8 логических ядер, 500 MIPS.
      - USB 2.0 High speed
      - 2 линии ввода/вывода (2 стерео входа + 2 стерео выхода или 4 входа/выхода)
      - Вывод: PCM 16-32 бита 44.1-384 кГц, DSD Dop 64-128, DSD Native 64-256 (linux)
      - Ввод: PCM 16-32 бита 44.1-384 кГц
      - Тактирование мастерклока от платы ЦАП/АЦП, частоты 512fs
      - Формат входа/выхода I2S
      - Питание Self Power (т.е. от внешнего источника, не от USB)
      - 8 конфигурируемых линий GPIO, возможные варианты от 8 выходов, до 4 входа + 4 выхода
      - Все линии гальванически изолированны с помощью изоляторов SiLabs Si8662, Si8640
      - 2 линии I2C, одна из которых изолирована с помощью ADUM1250 для управления ЦАП/АЦП и подключения дисплея/кнопок/EEPROM.
       
      Внешний вид:


       
      На плате присутствует разъем full XTAG для прошивки и отладки firmware.
      Схемотехника по даташитам и в общих чертах повторяет схемы evolution board от XMOS с некоторыми изменениями.
      Планируется 3 режима работы: Legacy, Soft и Native.
      Legacy режим.
      Параллельный режим работы, при котором управляющие команды выдаются как статические сигналы (MUTE, RESET, DSD, F0,F1). Этот режим позволяет работать интерфейсу без платы управления.

       
      Soft режим.
      Режим, при котором управление ИМС ЦАП/АЦП осуществляется по шине I2C или SPI. Конфигурация выбирается из меню. Необходима плата управления.

       
      Native режим.
      Режим, при котором конфигурация управления хранится в EEPROM памяти на плате ЦАП/АЦП. Наиболее функциональный режим, при котором всё управление осуществляется с процессора интерфейса. Управляющие сигналы на плате ЦАП/АЦП формируются с помощью I2C экспандера. Этот режим позволит использовать самую различную периферию на плате преобразователя (регулятор громкости и т.п.) без необходимости настройки, т.к. конфигурация будет храниться в EEPROM. Разъем 10 пиновый, т.к достаточно только I2S и I2C сигналы. Этот режим позволяет работать интерфейсу как с платой управления, так и без неё.

      Программируется плата с помощью специализированного адаптера XA-XTAG.

       
      Выводы сгруппированы по функциональному назначению, поэтому в случае неиспользуемых функций (например не нужен SPI), изолятор отвечающий за эту группу сигналов может не устанавливаться на плату.
      Распиновка разъема I2S:

      Полнофункциональные драйверы подходят отсюда:
      http://jlsounds.com/drivers.html
      На данный момент полностью реализован режим Legacy. Так же исправлены большинство "детских" болезней. В процессе работы удаление щелчков при переключении PCM-DSD и обратно.
      Вопросы:
      Что необходимо добавить или убрать к данной плате?
      Какие ИМС ЦАП необходимо добавить в список поддерживаемых в прошивку, для работы в SOFT режиме и с какими протоколами? Сейчас доступны I2C и SPI.
       
    • By aitras
      Продам немного обновленные платы ЦАПа Mercury. Комплектуются мелкой платой для генераторов с управлением от МК.
       
       
       
      Отличие от последней ревизии в том, что добавлен сигнал переключения генераторов и футпринт под трансформаторы сделан универсальным для серий ТП и TEZ.
      Цена 600р за штуку. Отправлю по России.
      В наличии 6 шт и есть 2 шт с косметическим дефектом - поцарапанной внизу маской. Они по 450р.
  • Сообщения

    • доброго времени суток!!! Помер БП ZALMAN ZM1000GVM. После отгорания нуля на счетчике перестал работать БП. Вскрытие показало что в ИИП сгорел один транзистор и один диод. Диод QH12TZ600  транзистор 24N60C3, подскажите на какие аналоги можно заменить и куда ещё посмотреть что могло ещё сгореть. Есть в наличии парочка SPW35N60C3    
    • Мощную нагрузку без дросселей не подключал,ссыкотно.
    • я в общет про тоже говорил - и статьи привел- он будет примерно- в динамике -приводить равенство потенциалов и усе - стабилизации как таковой не даст - здесь же -в схеме это не предусмотрено- потому - без стаба- в динамике-будет -жесть -что на практике и выяснил серый мастер - еще раз обращу внимание - не задействованы оба потенциала напряжений - и это является обычным дросселем .
    • Только что провел эксперимент:отмотал дроссель немного-индуктивность получил 31мкГн,подал мощную нагрузку(чуть больше 3А) на каждое плечо,напряжение просело равномерно на 4,5в в каждом плече.До отмотки проседало всего на 1,5-2в в каждом плече.Вывод напрашивается один-домотать.Логично же.
    • Да какая разница... Главное  найти что надо.. по душе, так сказать. А то там такие жопы встречаются... ужасных размеров, копчёные и вдобавок расписные... Нормальный человек, если  увидит, с ума сойдёт:  
    • Теперь, БП работает нормально? Под нагрузкой просадки какие?   Номинал большой. Вот для стабилизированного варианта, он больше подходит
    • Ламптест свидетельствует только о стабильности яркости свечения ламп. И ни капелюшечки об их надежности.
  • Покупай!

×
×
  • Create New...