Автор Тема: О Xmos+Sabre9018 и других дешевых китайских ЦАПах  (Прочитано 1010714 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Ну пока ничего неожиданного. Рад, что получилось снюхать! У меня это заняло пару недель урывками.
Надо бы расковырять весь дамп, но я не думаю найти там тайну Вселенной. Если б тогда, в марте, нашел, успел бы тут раструбить. :)
Такое ощущение (по коротким строчкам), что кое-где срывается распознайзер старт-стопа, может, стоит задержки в сниффере покрутить?

и добавил...
О, ты уже сам предположил что-то похожее. Там есть переменные/константы, отвечающие за частоту на шине?

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
А вот и полный дамп.

и добавил...
А вот и код Сниффера:

#define MAX_EVENTS 512
int SCL_PIN = 2;
int SDA_PIN = 3;

char data[MAX_EVENTS];
int dp = 0;

void setup()   
{               
   pinMode(SCL_PIN, INPUT); 
   pinMode(SDA_PIN, INPUT);
   Serial.begin(115200);
}

void loop()                     
{
   unsigned char s;
   dp = 0;
   
   //byte inputByte = PIND;
 
   lookForStart:
   
   // Expect both SCL and SDA to be high
   while ((PIND & 0b00001100) != 0b00001100);
   // both SLC and SDA high at this point
 
   // Looking for START condition. Ie SDA transitioning from
   // high to low while SLC is high.
   while ((PIND & 0b00001100) != 0b00000100);
   
   data[dp++] = 'S';

   // wait for SCL low
   while ((PIND & 0b00000100) != 0);
 
lookForData:
 
   while (dp < MAX_EVENTS)
   {
      // wait for SCL low
      while ((PIND & 0b00000100) != 0);
   
      // Wait for SCL to transition high
      while ((PIND & 0b00000100) == 0);
   
      // Sample SDA at the transition point
      s = PIND & 0b00001000;
      data[dp++] = (s == 0 ? '0' : '1');
   
      // Wait for SCL to transition low while looking
      // for start or stop condition. A START or STOP
      // means the previous bit isn't a data bit. So will
      // write START, STOP condition into the same memory slot
      if (s == 0)
      {
         while ((PIND & 0b00000100) != 0)
         {
            if ((PIND & 0b00001000) != 0)
            {
               // detected STOP condition
               data[dp-1] = 'P';
               goto lookForStart;
            }
         }
      }
      else
      {
         while ((PIND & 0b00000100) != 0)
         {
            if ((PIND & 0b00001000) == 0)
            {
               // detected START condition
               data[dp-1] = 'S';
               goto lookForData;
            }
         }
      }
   }

   // have exceed storage. Dump to serial port and restart.
   writeData();
}

void writeData ()
{
   int i;
   for (i = 0; i < dp; i++)
   {
      Serial.print (data);
      if (data == 'P')
      {
         Serial.println ("");
      }
   }
   Serial.println ("");
}


и добавил...
Никаких переменных, отвечающих за частоту на шине нет. Программа просто читает пины синхронизации и данных.

и добавил...
У тебя не было таких проблем?

и добавил...
Я считаю, что это большое продвижение за несколько часов работы :)

Интересно, что китаец выставил Quantizer на 8 бит. Я заметил, что лучший звук для моей платы можно получить с Quantizer 8 или 9 бит.
« Последнее редактирование: 15 Июля 2014, 01:05:50 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
У меня был сниффер с первой ссылки в топике. Он с бешеной скоростью сливал с шины что есть в буфер, потом его расковыривал с помощью моей нехитрой процедурки и выливал в компорт. Проверкой было совпадение пары-тройки интерпретаций подряд, у меня совпадало где-то процентов 70.
Беда в том, что я отложил это дело (и выкинул из головы) пока занимался железом, надеясь потом не спеша и со вкусом заняться софтиной.  Не вспомню даже частоту шины. Не 100кГц?

и добавил...
Продвижение вправду эпическое, я пару недель потратил.
Ты прокури протокол еще раз: с виду тот сниффер обточен именно под датчик из статьи: может, стоит глянуть шире. Я пока вижу в дампе запись в Сабрю, а чтения не вижу.

и добавил...
А еще подтяни-ка sda/scl к 5 вольтам поближе к снифферу... Вдруг фронты почетче станут. Килоом по 10 воткни?
« Последнее редактирование: 15 Июля 2014, 01:14:59 от cu6apum »

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Так как я программист а не электроннщик, последний совет не понял :)
Между чем воткнуть 10 килоом?

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
SDA->10k->+5v,
SCL->10k->+5v.
И не забудь, что при чтении из Сабри она оттягивает клок до готовности данных; вот в твоем коде это может быть причиной ложных срабатываний.
http://en.wikipedia.org/wiki/I%C2%B2C ищем clock stretching.

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Завтра проверю Сниффер по твоей ссылке. Может результат будет интереснее.

и добавил...
Мне кажется, первый Сниффер намного примитивнее, поэтому он должен работать лучше.

и добавил...
Я не знал, что I2C - это multi-master, multi-slave шина!!!

Значит может быть больше одного мастера.
« Последнее редактирование: 15 Июля 2014, 01:28:23 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Может, может. Но китаец об этом может и не знать. Впрочем, спалить, конечно, ничего не спалишь... ;)

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Думаю, можно написать простую програмку, которая только читает регистры...

Правда, есть мысли, что это может как-то навредить Сабре, если будет какой-то collision.

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Не спалишь, говорю. Хотя жесткий пук в динамики получить сможешь, если полезешь в нее одновременно с китайцем. Дык отключи усилок на время ковырялок.
Нюанс только в том, что данные, записываемые в Сабрю, зависят от текущего состояния и ее самой, и контроллера. Не запутайся.

и добавил...
Да, выхлоп-то твикнул? Или пока со штатным мучаешь?
« Последнее редактирование: 15 Июля 2014, 01:40:55 от cu6apum »

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
До выхлопа пока руки не дошли. Оно играло не очень, но когда я поставил четыре LME49710NA, а на выход  две AD744AH в железных корпусах, то звук улучшился в разы!!!

Но выхлоп я буду делать обязательно.

и добавил...
Я сегодня нашел свободный час и написал программу под Windows, которая берет дамп и парсит его. Вот что получилось ис того дампа:

write 0x0CF into Register 0x0A
write 0x0AA into Register 0x0F
write 0x02 into Register 0x019
write 0x0F9 into Register 0x0E
write 0x0CF into Register 0x0A
write 0x0CF into Register 0x0A
write 0x020 into Register 0x0C
write 0x020 into Register 0x0C
write 0x00 into Register 0x00
write 0x00 into Register 0x00
write 0x00 into Register 0x01
write 0x00 into Register 0x02
write 0x00 into Register 0x02
write 0x00 into Register 0x04
write 0x00 into Register 0x04
write 0x00 into Register 0x05
write 0x00 into Register 0x06
write 0x00 into Register 0x06

« Последнее редактирование: 15 Июля 2014, 18:52:56 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Осталось дописать, что это означает. :)
Респект и уважуха за проделанную работу! А читать разве не читает?

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Что это означает, дописать не проблема. Проблема в том, что это не полная информация. Большая часть информации моя программа пока прочитать не может.

Попробовал запустить программу по твоей ссылке. Без переделки она вообще не дает никакой информации.

Написал еще одну программу, которая подключается к I2C шине как мастер и читает значения регистров Сабри. Она дает случайные значения:

Opening port
Port open
Initializing Sniffer
Status Register:0
Register 10 (0x0A):206
Register 15 (0x0F) Quantizer bit depth:0
Status Register:1
Register 10 (0x0A):0
Register 15 (0x0F) Quantizer bit depth:0
Status Register:0
Register 10 (0x0A):0
Register 15 (0x0F) Quantizer bit depth:0
Status Register:0
Register 10 (0x0A):0
Register 15 (0x0F) Quantizer bit depth:0
Status Register:0
Register 10 (0x0A):0
Register 15 (0x0F) Quantizer bit depth:0



и добавил...
Вот ее код:

void setup()
{
   Serial.begin(115200);
   Wire.begin();        // Join the I2C bus as a master
   Serial.println("Initializing Sniffer");
}

void loop()
{
   byte statusReg = readRegister(27);  // Read status register
   Serial.print("Status Register:");
   Serial.print (statusReg);
   Serial.println(" ");
   
   byte Reg10 = readRegister(10);  // Register 10 (0x0A) (MC1)
   Serial.print("Register 10 (0x0A):");
   Serial.print (Reg10);
   Serial.println(" ");
   
   byte Reg15 = readRegister(15);  // Register 15 (0x0F) Quantizer bit depth
   Serial.print("Register 15 (0x0F) Quantizer bit depth:");
   Serial.print (Reg15);
   Serial.println(" ");   
   delay(1000);
}

byte readRegister(byte regAddr)
{
   Wire.beginTransmission(0x48); // Hard coded the Sabre/Buffalo device  address
   Wire.write(regAddr);          // Queues the address of the register
   Wire.endTransmission();       // Sends the address of the register
   Wire.requestFrom(0x48,1);     // Hard coded to Buffalo, request one byte from address
   
   // specified with Wire.write()/wire.endTransmission()
   // while(!Wire.available()) {  // Wait for byte to be available on the bus
   if (Wire.available())          // Wire.available indicates if data is available
      return Wire.read();         // Wire.read() reads the data on the wire
   else
      return 0;                   // In no data in the wire, then return 0 to indicate error
}

и добавил...
Самый перспективный вариант оказался первый. Собираюсь лучше разобраться в пртоколе I2C.
« Последнее редактирование: 15 Июля 2014, 22:39:04 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Ну все-таки 0x90(92), а не 48?..

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Ты хочешь сказать, что нужно:

Wire.beginTransmission(0x90)

т.е адрес Сабре 0x90, а не 0x48?

и добавил...
Так работает код Буффало...

и добавил...
 The device address of Sabre DAC Datasheet specifies the address as 0x90 which is an 8-bit value.
 The wire library in Arduino uses 7-bit device addresses and the 8th R/W bit is added automatically
 depending on whether you use the write call [beginTransmission()] or the read call [requestFrom()].
 Therefore, you will use the 7 most significant bits of the 8-bit address.
 In our example, 0x90 becomes 0x48 as follows:
 0x90: 10010000 (we eliminate the rightmost bit to get I2C address)
 0x48: 1001000
 When using dual-mono configuration, the other device can be set to addres 0x92
 0x92: 10010010 (we eliminate the rightmost bit to get I2C address)
 0x49: 1001001
 */
« Последнее редактирование: 15 Июля 2014, 22:49:01 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Стъянно. Я всегда юзал 90 и работало.

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Исходя из обьяснения выше Arduino использует 7-ми битные адреса, поэтому один бит теряется и 0x90 превращается в 0x48. Эти два адреса одинаковы (различаются только крайним правым битом), поэтому будет работать и так и так.

и добавил...
0х90: 10010000
0х48: 1001000
« Последнее редактирование: 15 Июля 2014, 22:59:19 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Anyway.
return(0) возвращает тебе 0 и при ошибке, и при нуле в регистре. Попробуй вернуть while на место.
Но есть ощущение, что вы с китайцем толкаетесь боками за роль мастера.

и добавил...
И всё ж таки лучше добить пассивный сниффер. Его много где еще заюзать можно.
« Последнее редактирование: 15 Июля 2014, 23:19:29 от cu6apum »

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Сделал, то, что ты сказал. Оно стало работать лучше, но в какой-то момент моя программа не может получить доступ к шине и бесконечно крутится в while цикле. Действительно я и китаец толкаемся локтями:

Initializing Sniffer
Status Register:0
Register 10 (0x0A):206
Register 15 (0x0F) Quantizer bit depth:0
Status Register:1
Register 10 (0x0A):2
Initializing Sniffer
Initializing Sniffer

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Бодаетесь с китайцем. А если без китайца включить?

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Если без китайца, я буду считывать дифолты Сабри.

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Ага, для контроля, что что-то не пошло не так.

и добавил...
Да, а где ты АД744 настоящие брал? Я с ног сбился, на ебее только липа.
« Последнее редактирование: 16 Июля 2014, 01:43:10 от cu6apum »

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
AD744 я брал на Ебее, здесь:
http://www.ebay.com/itm/130923594875?ssPageName=STRK:MEWNX:IT&_trksid=p3984.m1497.l2649

Может они и не настоящие, спорить я не буду, но звук они дают потрясающий. Я был на 100 процентов уверен, что это подделка, цена у них очень низкая. Когда получил, вставил в Сабрю и не поверил своим ушам!!! Я был удивлен и шокирован. Сразу заказал еще несколько штук. Если они не настоящие, интересно, как же звучат настоящие...

Вообще, я много заказывал на Ебее всего и только один раз попал на подделку: TDA1541A. Она звучала ужасно. Может я чего-то не понимаю, или уши у меня не такие, как у всех, но 90% всех деталей с Ебея у меня работают нормально.

и добавил...
Если почитать некоторые форумы, складывается впечатление, что настоящие детали выпускаются маленькими порциями по спецзаказу и стоят космических денег, а все что можно купить - подделка. Все это мне кажется неправдоподобным.

и добавил...
Еще я заказал на Ебее в Америке 20 штук LME49710NA за смешные деньги! Не думал, что за такую цену могут продавать настоящие ОУ, спросил у продавца, откуда они и получил ответ, что напрямую из Texas Instruments.
Работают они отлично.
« Последнее редактирование: 16 Июля 2014, 10:46:16 от Morpheus123 »

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Забавно.
Есть мнение, что откровенный шлак китайцы шлют в основном в банановые республики (к нам), а рейтинг делают на приличных людях. Ибо стойкое убеждение, что всё китайское - подделка, во многих странах вообще не известно. Но то ладно.
А что до 744-х стояло в выхлопе? Что так резко изменился звук. Вообще, именно для небуферизованного фильтра-вычитателя это не лучший ОУ, там лме49710 куда выигрышнее смотрится.

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Возможно в Израиль китайцы присылают оригинальные и качественные товары. В большинстве случаев я был доволен.

До 744-х там стояли разные ОУ, удовлетворительный звук был, когда стояли все 6 LME49710NA. Когда поставил 4 LME49710NA, а на выход 2 AD744 звук улучшился очень сильно. Именно поэтому я не спешу делать выхлоп, хотя звук конечно не идеальный, но удовольствие от музыки с такой конфигурацией получить можно.

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Чудеса да и только. :)

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Это мое субьективное мнение. Звук стал живой, обьемный, появилась атака, динамика, улучшились басы. Я слушаю на наушники, через ламповый усилитель для наушников.

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
А. Это меняет дело. 744 отличный опер, однако его нагрузочные характеристики оставляют желать лучшего. Если же он нагружен на "невесомую" лампу, это не так важно.

Оффлайн xar

  • Старожил
  • *****
  • Сообщений: 5224
  • Репутация: 16
  • Ренат
  • Поблагодарили: +271
Возвращайся домой, нехрен там делать...
Возможно в Израиль китайцы присылают оригинальные и качественные товары. В большинстве случаев я был доволен.
внезапно выяснилось что есть там чего делать :D

Оффлайн cu6apum

  • Старожил
  • *****
  • Сообщений: 4018
  • Репутация: 14
  • Естествоиспытатель
  • Поблагодарили: +366
Угу, а тут по тыще приходится баночные 744-е покупать. Найти бы побольше тех тыщ.

Оффлайн Morpheus123

  • Старожил
  • *****
  • Сообщений: 1562
  • Репутация: 7
  • Сергей, Тель-Авив
  • Поблагодарили: +4
Возвращайся домой, нехрен там делать...
Возможно в Израиль китайцы присылают оригинальные и качественные товары. В большинстве случаев я был доволен.
внезапно выяснилось что есть там чего делать :D

В Израиле очень сильный Хай-Тек, высокие зарплаты и низкий доллар! 90% доходов страна получает, продавая высокие технологии. У нас разработали уникальную и единственную в мире систему для защиты от ракет малой дальности: "Железный Купол". Она сегодня утром сбила ракету Хамаса прямо над моим домом. Сегодня утром по Тель-Авиву запустили 4 ракеты. Все были сбиты. Я опоздал на работу :)

 

Похожие темы

  Тема / Автор Ответов Последний ответ
19 Ответов
24226 Просмотров
Последний ответ 25 Декабря 2015, 15:07:02
от митяич
220 Ответов
192581 Просмотров
Последний ответ 31 Января 2017, 05:23:43
от den4
10 Ответов
14630 Просмотров
Последний ответ 11 Сентября 2016, 21:14:30
от xar
70 Ответов
26755 Просмотров
Последний ответ 22 Июня 2021, 19:07:30
от zorg
34 Ответов
3450 Просмотров
Последний ответ 24 Января 2024, 00:23:08
от GoRs