Не все так просто, если нужна не "хрюкалка", а более-менее достойный звук.
В CLK, который выдает RTL, присутствует большой джиттер. Он не может не присутствовать,
ибо этот CLK генерится с помощью PLL. Этот джиттер превращает звук с любого, даже супер-пупер "другого одиночного DAC для I2S" в полное дерьмо.
Для того и пользуют в нормальном аудио отдельные генераторы с малым джиттером для сетки 44.1кгц и для сетки 48кгц.
Я много чего пощупал, чтобы было и максимально просто, и паябельно, и дешево, и хорошо звучало с автоакустикой 4*25 Вт.
Остановился на UDA1334
ATS + LPC1758, ибо в "ATS" имеется встроенный тактовый генератор, с подстройкой частоты и фазы по сигналу "WS". За счет интегрирования в цепи подстройки получается вполне достойное качество. Цена - меньше 1 бакса. Обвязки минимум.
Требуется всего два(!) сигнала I2S - WS (word select) и Data.
Ну еще до-кучи сигнал "mute" c GPIO, чтобы без плавно без щелчков выключать/включать звук.
К нему добавить тот же
PAM8303 или какой-нить копеечный аналоговый TDAxxxx для более притязательных слушателей.
Кстати, в LPC1758 декодирование стерео MP3 c USB флэшки при битрейте 320 заняло около 65% ресурсов при тактовой 72 МГц. Что позволило добавить цифровой регулируемый "фильтр присутствия". В RTL наверное можно и программный регулятор громкости прикрутить вместе с "темброблоком"...
TDA1543, кстати, не прокатил по тем же критериям. К тому же там нужен дополнительный активный фильтр на выходе, который в UDA уже встроен.
Топикстартеру может подойти, например, CS43L22 (применяется в STM32F4DISCOVERY).
https://www.cirrus.com/cn/pubs/proDatasheet/CS43L22_F2.pdf
Но там QFN40 и лошадиная цена в розницу.
О чем, собственно, и было сказано в стартовом топике...
PS: В связи с особенностью UDA пришлось изобразить вот такой "финт ушами"
при произвольном изменении sample rate, чтобы не рвалась цепь OC ФАПЧ
(не было щелчков):
Код:
void SetI2S_SR(int sr)
{
int beg;
int end=0;
if (CurrSR==sr) return;
CurrSR=sr;
beg = I2S->I2STXBITRATE & 0x003F ; // текущий делитель
if (sr % 1000)
{
I2S->I2STXRATE = 256*53+169; //11.2896 //72 mhz // нечетное
}
else
{
I2S->I2STXRATE = 256*71+208; //12.288 //72 mhz
}
Host_DelayMS(2);
switch(sr)
{
case 8000:
end=47;
break;
case 12000:
end=31;
break;
case 16000:
end=23;
break;
case 24000:
end=15;
break;
case 32000:
end=11;
break;
case 48000:
end=7;
break;
case 11025:
end=31;
break;
case 22050:
end=15;
break;
case 44100:
end=7;
break;
case 96000: // в железе не поддержано (нога UDA на GND)
end=3;
break;
default: end=23;
}
if (end == beg) return;
if (end > beg)
{
for(; beg <= end; beg++)
{
I2S->I2STXBITRATE= beg;
Host_DelayMS(2);
}
}
else
{
for (; beg >= end; beg--)
{
I2S->I2STXBITRATE= beg;
Host_DelayMS(2);
}
}
}