Jump to content

    
Sign in to follow this  
MAXvaLL

Проектирование USB аудиокарты

Recommended Posts

Уважаемый brag,а не могли бы вы выложить проект здесь, либо на почту cbv22@mail.ru. Буду очень признателен!!! :)

Мне Cypress тоже очень понравился, тока вот времени небыло разобратся со связью Cypress с АЦП .

Share this post


Link to post
Share on other sites

Каков протокол аудиоданных на компьютере?

Как их софт понимает? А то без этих знаний и схему не нарисовать!

Share this post


Link to post
Share on other sites
Ну и что что 30мбайт, частота всеравно около 500МГц, вне зависимости от скорости. Или я не прав?

Конечно работает, но вы же сами на глюки жаловались... Или там глюки другого рода?

Я писал в чем были глюки. С самой плисиной.. Там сльно большие задержки. На дорожке клок уже пришел.пока долез до стейт-машин в плисе,пока изменилось состояние машины и пока оно вылезло наружу(на дорожку), так клок уже упал,или даже собрался подыматься. Вобщем переделывал машины...

В железе глюк был только один - генератор для аналогового тракта был на 5в,я их переводил в 3в полевиком. полевикаа чет колбасило,я резанул дорогу,подал на генер 3в и пустил клок на прямую.а аналоговая часть и 3вольтовый клок прохавывает без проблем.

Частота то 480мгц,но там ей и место :)

 

Выше предлагали использовать неизохронный режим USB. Какая макс. скорость возможна?

Из за чего могут быть потери в изохронном режиме? (если используем хороший экранированный USB кабель, и нормально разведена плата)

Изохрон имиет высокий приоритет, но не имеет коррекции ошибок. Он гарантирует, кажись 80%(не помню) пропускной способности шины. Но он не гарантирует доставку информации в ее исходном виде,те могут быть ошибки.

Дорога вам на usb.org

Кстати вы не ответели что есть такое MAX3000 и MAX2?

Это семейства плисов. Как было написано выше, altera.com все скажет ;)

 

Уважаемый brag,а не могли бы вы выложить проект здесь, либо на почту cbv22@mail.ru

К сожалению, пока нет. Проект имеет возможность принести денег, почему бы ею не воспользоватся. Ведь это все таки должен быть мой хлеб.

Да и зачем он вам? вы же свое делаете. Тем более инфы много в инете,а ее особо там и не надо много. Даташитов достаточно.

По драйверам сам помочь не могу,тк сам еще баран в них.

На вопросы отвечу ;)

 

Каков протокол аудиоданных на компьютере?

Как их софт понимает? А то без этих знаний и схему не нарисовать!

НА каком компютере? :) на моем?

Почему не нарисовать? вам надо доставить даные на комп,а что дальше с ними делать - проблеммы вашего драйвера.

Вобще я гоню, как есть. 8bit dummy+24bit Signed big endian msb first. те всего у нас 8 байт. первые 4-левый,вторые-правый.первый байт ис каждого канала лишний,остальные идут в порядке от старшего к младшему. вот и все.

Мне Cypress тоже очень понравился, тока вот времени небыло разобратся со связью Cypress с АЦП .

Только через плисочку,если ацп с последовательным интерфейсом ;)

Edited by brag

Share this post


Link to post
Share on other sites
К сожалению, пока нет. Проект имеет возможность принести денег, почему бы ею не воспользоватся. На вопросы отвечу ;)

Если можно немного подробнее. Через какой ендпоинт гонится поток? Поток изохронный? Можете ли поделится дескриптором устройства? Формат и скорость жестко забиты или ими можно управлять с компа?

Частота кварца?

Очень большое пожалуста ответить.

Share this post


Link to post
Share on other sites
Изохрон имиет высокий приоритет, но не имеет коррекции ошибок. Он гарантирует, кажись 80%(не помню) пропускной способности шины. Но он не гарантирует доставку информации в ее исходном виде,те могут быть ошибки.

Дорога вам на usb.org

 

Только через плисочку,если ацп с последовательным интерфейсом ;)

С изохрлоном ясно. А ошибки-то вот откуда возьмутся, если используем хороший экранированный USB кабель, и нормально разведена плата? Вы изохрон пользуете?

 

А через регистр сдвига + триггер почему нет?

Share this post


Link to post
Share on other sites

В нормальных условиях взяться им неоткуда. Мы много разных деталей делаем на USB - нет там ошибок, пока не работаешь на электроподстанции. Там - есть, когда земля импульсно на десяток наносекунд киловольта на 2 подскакивает. Но в этом случае все кончается, как правило, переподключением устройства, чтобы подвисшие драйвера освободить. Но это экзотика.

Средней пропускной способности хватит как в изохроне, так и в балке, но в последнем никто не гарантирует равномерность потока. Если буфер в устройстве большой - без проблем магабайт 25-30 в секунду качается. Есть еще одна проблема. Если падать на микрософтовские драйвера, а не делать свои, то по спецификации USB-audio они требуют изохрона. Еще одна проблема с драйверами - Vista. У мелкомягкого как всегда семь пятниц на неделе. Вместо того, чтобы вылизать имеющееся - сделали новую спецификацию на драйвера. По мне, так лучше немного помучиться с железом, но лечь в стандарт, а дальше пусть микрософт разбирается, что он там нагородил.

Share this post


Link to post
Share on other sites
Если можно немного подробнее. Через какой ендпоинт гонится поток? Поток изохронный? Можете ли поделится дескриптором устройства? Формат и скорость жестко забиты или ими можно управлять с компа?

Частота кварца?

Очень большое пожалуста ответить.

Какая разница, через какой. через какой захотел,через такой и погнал. сейчас 2-OUT,4-IN. Сейчас Bulk. Причем сдесь скорость? или вы о частоте дискретизации? - тогда жестко. мне надо макс. разрешение.

Одного 24.000мгц. второго 24.576мгц. Тоже из серии - почитай даташит...

дескриптор:

// Device Descriptor
{
    0x12,    // bLength
    USB_DESCRIPTOR_DEVICE,    // bDescriptorType
    USBW(0x0200),    // USB 2.0
    0xFF,   // bDeviceClass
    0x00,   // bDeviceSubclass
    0x00,   // bDeviceProtocol
    0x40,    // bMaxPacketSize0
    USBW(USB_VENDOR_BRAG),    // idVendor
    USBW(USB_PRODUCT_BRAG_DD2),    // idProduct
    USBW(0x0001),    // bcdDevice    :Device Release Number
    0x01,    // iManufacturer
    0x02,    // iProduct
    0x00,    // iSerialNumber
    0x01    // bNumConfigurations
},

// Configuration Descriptor
{
  // std configuration descriptor
    0x09,    // bLength
    USB_DESCRIPTOR_CONFIG,    // bDescriptorType
    USBW(USB_CFGDESCSIZE),    // wTotalLength
    0x01,    // bNumInterfaces
    0x01,    // bConfigurationValue
    0x00,    // iConfiguration
    0xC0,    // bmAttributes
    0x00,    // bMaxPower

  // Interface descriptor
    0x09,    // bLength
    USB_DESCRIPTOR_IFACE,    // bDescriptorType
    0x00,    // bInterfaceNumber
    0x00,    // bAlternateSetting
    0x03,    // bNumEndpoints
    0xFF,    // bInterfaceClass
    0x00,    // bInterfaceSubClass
    0x00,    // bInterfaceProtocol
    0x00,    // iInterface

  // Endpoint descriptor (OUT EP2)
    0x07,    // bLength 
    USB_DESCRIPTOR_ENDPOINT,    // bDescriptorType
    0x02,    // bEndpointAddress    : D0..D3 - ep num; D7 - IN endpoint
    0x02,    // bmAttributes
    USBW(0x200),    // wMaxPacketSize
    0x01,    // bInterval

  // Endpoint descriptor (IN EP4)
    0x07,    // bLength 
    USB_DESCRIPTOR_ENDPOINT,    // bDescriptorType
    0x84,    // bEndpointAddress    : D0..D3 - ep num; D7 - IN endpoint
    0x02,    // bmAttributes
    USBW(0x200),    // wMaxPacketSize
    0x01,    // bInterval

  // Endpoint descriptor (IN EP1)
    0x07,    // bLength 
    USB_DESCRIPTOR_ENDPOINT,    // bDescriptorType
    0x81,    // bEndpointAddress    : D0..D3 - ep num; D7 - IN endpoint
    0x02,    // bmAttributes
    USBW(0x40),    // wMaxPacketSize
    0x80    // bInterval
},
#if USB_CFGDESCSIZE & 1
    0,
#endif

// LangID
    {USB_DESCRIPTOR_STRING_SIZE(1),USB_DESCRIPTOR_STRING,USB_LANG_EN_US},
// Manufacturer
{
    USB_DESCRIPTOR_STRING_SIZE(4),USB_DESCRIPTOR_STRING,
    'B',0,'r',0,'a',0,'g',0
},
// Product
{
     USB_DESCRIPTOR_STRING_SIZE(12),USB_DESCRIPTOR_STRING,
    'D',0,'i',0,'g',0,'i',0,'D',0,'e',0,'g',0,'a',0,'n',0,' ',0,'I',0,'I',0
}

Толку вам от него? Дескрипторов никогда не видели? ;) Где-то видел страницу - сборник дескрипторов популярных усб-устройств, типа для коллекции :D

С изохрлоном ясно. А ошибки-то вот откуда возьмутся, если используем хороший экранированный USB кабель, и нормально разведена плата? Вы изохрон пользуете?

Ошибки дажа на шинах ATA,SATA,DDR,... есть, не даром есть такие вещи,как ECC, CRC итп..а вы тут о usb..

Читайте доку с usb.org

 

Ошибки - это не подвисание драйвера. Это просто ошибки и они всегда могут встретится.

usb_20.pdf say:

isochronous transfers have the general implication of constant-rate, errortolerant

transfers. In the USB environment, requesting an isochronous transfer type provides the requester

with the following:

• Guaranteed access to USB bandwidth with bounded latency

• Guaranteed constant data rate through the pipe as long as data is provided to the pipe

• In the case of a delivery failure due to error, no retrying of the attempt to deliver the data

и еще

USB Communication Flow

Transfer |Bandwidth |Error Detection |Retrying

 

Control |Not guaranteed |Yes |Automatic

Isochronous |Guaranteed |Yes |No

Interrupt |Not guaranteed |Yes |Yes

Bulk |Not guaranteed |Yes |Yes

 

USB-audio мягкий не по карману.глючный он сильно,особенно в win2000

В FreeBSD он и то более-менее работает

Edited by brag

Share this post


Link to post
Share on other sites

На счет аудиоданных я имел ввиду чтобы стандартный драйвер все понимал. Да хоть чтоб Winamp :05: играл!

Как определить левый правый канал?

Edited by MegaElektronik

Share this post


Link to post
Share on other sites
Платку немного переделал.

За ссылки и дескриптор спасибо. Кому оно очевидно, а кое-кто и первый раз видит. К сожалению, как я понял, ваше устройство к аудиоклассу никаким боком не относится. Меня интересовали рабочие примеры дескриптора канала записи для устройств, совместимых с виндой. Доки конечно читал, но как-то криво оно работает.

По поводу платы. Я незря спрашивал про то, что дал Rightmark Audioanalyzer. Без него понять что и как шумит - невозможно. Я бы обязательно поставил между Альтерой и АЦП_ЦАП RC цепи по цифровым линиям. А возможно и предусмотрел место под гальваноразвязку. Запаять вместо нее перемычки никогда не поздно, а вот наоборот... Фильтр по питанию преобразователей как организован? Джиттер вы не меряли?

Share this post


Link to post
Share on other sites

Фильтр еще будем думать. О гальв.развязке..ее где-то ставят на более-менее крутых картах? сомневаюсь,что она нужна. тогда уж надо делать гальваническую развязку по 3.3в на питание цыфровой части :))

Да.даное устройство никаким боком к usb-audio class не относится.

Вот дескриптор для аудио класса.только ацп.

const struct usbDevDesc UsbDevDesc={
    sizeof(struct usbDevDesc),
    USB_DESCRIPTOR_DEVICE,
    0x0200,    // USB 2.0
    0xEF,   // bDeviceClass
    0x02,   // bDeviceSubclass
    0x01,   // bDeviceProtocol
    USB_EP0_MAXSIZE,
    USB_VENDOR_BRAG,
    USB_BRAG_PRODUCT_DD,
    0x0001,        // Serial
    0x01,    // iManufacturer
    0x02,    // iProduct
    0x00,    // iSerialNumber
    0x01    //bNumConfigurations
};

const struct usbAuCfgDesc UsbCfgDesc={
    {
        sizeof(struct usbStdCfgDesc),
        USB_DESCRIPTOR_CONFIG,
        sizeof(struct usbAuCfgDesc),
        1,    //interfaces
        1,    //bConfigurationValue
        0,    //iConfiguration
        0xC0,    //SelfPowered
        0    //bMaxPower
    },
   /* Audio Control Interface */
    {
        sizeof(struct usbStdIfDesc),
        USB_DESCRIPTOR_IFACE,
        0,    //bInterfaceNumber
        0,    //bAlternateSetting
        0,    //bNumEndpoints
        0x01,    //AUDIO
        0x01,    //AUDIOCONTROL
        0,    
        0    //iInterface
    },
    {
        sizeof(struct usbCsAcDesc),
        0x24,    //CS_INTERFACE
        0x01,    //HEADER
        0x0100,    //bcdADC
        sizeof(struct usbCsAcDesc)+sizeof(struct usbCsItDesc)+
            sizeof(struct usbCsOtDesc), //wTotalLength
        USB_AUDIO_IFS,
        1    //baInterfaceNr
    },
    {
        sizeof(struct usbCsItDesc),
        0x24,    //CS_INTERFACE
        0x02,    //INPUT_TERMINAL
        0x01,    //bTerminalID
        0x0200,    //Input Undefined term type
        0x00,    //bAssocTerminal
        2,    //bNrChannels
        0x00000003, //wChannelConfig
        0,    //iChannelNames
        0    //iTerminal
    },
    {
        sizeof(struct usbCsOtDesc),
        0x24,   //CS_INTERFACE
        0x03,    //OUTPUT_TERMINAL
        0x02,   //bTerminalID
        0x0101, //Usb Streaming
        0x00,    //bAssocTerminal
        0x01,    //bSourceID (from input terminal)
        0       //iTerminal
    },
   /* Zero Bandwidth (alt setting 0) */
    {
        sizeof(struct usbStdIfDesc),
        USB_DESCRIPTOR_IFACE,
        1,    //bInterfaceNumber
        0,    //bAlternateSetting
        0,    //bNumEndpoints
        0x01,    //AUDIO
        0x02,    //AUDIOSTREAMING
        0,
        0    //iInterface
    },
   /* Audio Streaming descriptor (alt setting 1) */
    {
        sizeof(struct usbStdIfDesc),
        USB_DESCRIPTOR_IFACE,
        1,    //bInterfaceNumber
        1,    //bAlternateSetting
        1,    //bNumEndpoints
        0x01,    //AUDIO
        0x02,    //AUDIOSTREAMING
        0,
        0    //iInterface
    },
    {
        sizeof(struct usbAuCsAsDesc),
        0x24,   //CS_INTERFACE
        0x01,    //AS_GENERAL
        0x02,    //bTerminalLink (Out Terminal)
        0x01,    //bDelay
        0x0001    //wFormatTag (PCM format)
    },
    {
        sizeof(struct usbAuCsFmt1Desc),
        0x24,    //CS_INTERFACE
        0x02,    //FORMAT_TYPE
        0x01,    //FORMAT_TYPE1
        0x02,    //bNrChannels
        0x03,    //3 bytes/frame
        24,    //24 bits/sample
        0x01,    //bSamFreqType - One frequency supported
        {B3VAL(96000)}    //tSamFreq
    },
   /* IN ISO Endpoint 1 */
    {
        {sizeof(struct usbAuStdAsIsoEpDesc),
        USB_DESCRIPTOR_ENDPOINT,
        0x81,    //IN endpoint 1
        0x01,    //Isochronous, No synchronous, Data endpoint
        64,    //wMaxPacketSize
        9},    //packets per frame
        0,0    //bRefresh, bSynchAddress
    },
    {
        sizeof(struct usbAuCsAsIsoEpDesc),
        0x25,    //CS_ENDPOINT
        0x01,    //EP_GENERAL
        0x00,    //bmAttributes
        0x00,    //bLockDelayUnits
        0x0000    //wLockDelay
    }
};

Также есть пару примеров в тех ссылках,что я давал. именно аудио.

Джиттер нечем мерять...

Edited by brag

Share this post


Link to post
Share on other sites

brag и Alex 11, благодарю за помощь! :)

 

Вот теперь такая платка ;)

Вижу, вы все же прислушались к моему совету доработать разводку USB :)

Эти изменения что-то дали?

 

Еще, как я вижу вы убрали X2. Я так понимаю вы через него программировали ЕЕПРОМ.

А теперь как?

 

По поводу платы. Я незря спрашивал про то, что дал Rightmark Audioanalyzer. Без него понять что и как шумит - невозможно. Я бы обязательно поставил между Альтерой и АЦП_ЦАП RC цепи по цифровым линиям. А возможно и предусмотрел место под гальваноразвязку. Запаять вместо нее перемычки никогда не поздно, а вот наоборот... Фильтр по питанию преобразователей как организован? Джиттер вы не меряли?

Полгостью согласен! Я уже давно про это говорил... Но это если вы особо заботитесь о качестве.

 

Помехи и джиттер могут испоганить результат самых лучших преобразователей.

Возможно выложу нашу разработку, когда заработает :)

 

За ссылки и дескриптор спасибо. Кому оно очевидно, а кое-кто и первый раз видит. К сожалению, как я понял, ваше устройство к аудиоклассу никаким боком не относится. Меня интересовали рабочие примеры дескриптора канала записи для устройств, совместимых с виндой. Доки конечно читал, но как-то криво оно работает.

По поводу платы. Я незря спрашивал про то, что дал Rightmark Audioanalyzer. Без него понять что и как шумит - невозможно. Я бы обязательно поставил между Альтерой и АЦП_ЦАП RC цепи по цифровым линиям. А возможно и предусмотрел место под гальваноразвязку. Запаять вместо нее перемычки никогда не поздно, а вот наоборот... Фильтр по питанию преобразователей как организован? Джиттер вы не меряли?

А вы умеете мерять джиттер? :)

Edited by MAXvaLL

Share this post


Link to post
Share on other sites
Вижу, вы все же прислушались к моему совету доработать разводку USB

Эти изменения что-то дали?

Да,немного разсунул,хотя там далеко нету тех параметров.зазор 0.7мм, расстояние до других макс 7мм.

Хз дало,не дало.плату еще не делал новую. пока дрова пишу.как все будет готово,в том числе и ламповая часть(вход,выход), тогда уже буду делать вторую плату, со всеми доработками...

 

Еще, как я вижу вы убрали X2. Я так понимаю вы через него программировали ЕЕПРОМ.

А теперь как?

Та не,я его просто так воткнул :) EEPROM самим же cypressom и шьется.

 

Гробик бы с удовольствием всунул,только нету таких гробиков. надо именно 24.576мгц

Share this post


Link to post
Share on other sites
...в том числе и ламповая часть(вход,выход)...

 

Та не,я его просто так воткнул :) EEPROM самим же cypressom и шьется.

Ну, ты зверь! :07: Круто!!! :a14:

Мы вот предвариловку на крутых опер.ах делаем :crying:

 

Через USB?

 

Кстати, возник вопрос: а зачем serial<->parallel преобразователь надо было на ПЛИСине делать? Есть ведь готовенькие...

 

PS А за дескрипторы спасибо большое! Темный мы народ... :)

Edited by MAXvaLL

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  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.

Sign in to follow this