Jump to content
Sign in to follow this  
German Churilin

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

Recommended Posts

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

  • Сообщения

    • Ясен пень, что надо читать и разбираться. Это везде так. А про настройку нечего сказки рассказывать. Отличия лишь в названии битов в регистрах. Принцип работы и настройки один в один.
    • Я  с  вами  полностью  согласен,  но  я  тоже  не  мальчик.  Транзисторы  испытывал.  Даже  при  напр.  вход  30в  выход   15в    6шт. держат  нормально 8А    конечно  с  охлаждением.  Пробовал  с  КРЕН.  без  переключения  обмоток.  навесн.  монтаж.   Потом  сделаю  коммутацию  обмоток.
    • За тобой разве угонишься, у меня резонансник  в состоянии полуготовности, а тут на тебе – варилка. С резонансником бросился в крайности. Сначала испытал на готовом макете автогенератора по топологии резонансный полумост с сетевым выпрямителем-удвоителем напряжения. Ключи FGH40T100SMD. Работает, но такой зверюга мало кому интересен. Понесло в другую сторону – резонансник на биполярах. Пустил в переделку электронный трансформатор, добавил ПОС по напряжению плюс незначительные доработки в базовых цепях. Подопытный кролик на фото, слабоват он, поэтому пришлось ограничиться мощностью 150-200Вт, но результат порадовал, ПНН-ПНТ во всём диапазоне нагрузок в диапазоне сетевого 160-250 Вольт. На следующей неделе постараюсь выложить осциллограммы и схему. У тебя в МУ что за баранки? Аморфные кобальтовые MSSA-18S, или наножелезки MSSN-18S?
    • заводская держала стабильные 12 в. косяка не было. т.к. схема была изменена на данный момент по минимуму. см.выше.  конденсатор на плате 470 пик , я кинул какой попал под руку, учитывая опытный ток нагрузки без управления 170мА. теперь поменял на 0.01 проверил на мин. нагрузке. теперь осталось приколхозить управление. делал для предыдущего БП. для этого надо адаптировать.
  • Similar Content

    • By kostake
      Продам ЦАП, на PCM5102, авторский. Выхлоп германиевый. Вход I2S.
      В роли транспорта подключен-Up2Stream Pro . Поддержка wifi ,bluetooth,ethernet,USB,Airplay, DLNA, UPnP. Может играть напрямую с флешки. 
      Цена : 11тыс руб. Отправка без проблем, за счет покупателя. 
    • By tishkanexx
      Продаю корпус для ЦАП (DAC) AK4490 / усилителя для наушников. Саму плату, если её нет, то можно купить на али ($36), фото платы прикладываю, могу дать ссылку на покупку.
      Корпус заказывал с завода breeze audio, минимально можно было заказать 2 корпуса ($30 два корпуса с доставкой), поэтому один продаю. Отдаю за $15, без наценки как есть. Если брать плату ЦАП-а и корпус, то получается $51, что дешевле, чем брать готовый ЦАП на том же ali за $60. Об этом писал здесь:
      На корпусе надпись: AKMDAC - HEADPHONE AMP (сделана по заказу вместо надписи breeze audio)
      Комплект: 4 силиконовые ножки, саморез для крепления "тюльпанов", 8 винтов для корпуса, сами части корпуса.
      Стоимость: 1000р или 15$. Пишите в лс.



    • 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 р.).
×
×
  • Create New...