Petka 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Мне надо сделать 2 устройства, но это не значит что абы-как. Ставить ФТДИ просто смешно для данного проекта и не оправданно. Вот как раз для 2х устройств FTDI ставить и оправданно. + Просто + надёжно. Между прочим, скажите, чем вариант 3 при правильной реализации хуже хардварного ЮСБ? 1) Оверклокинг. 2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ukpyr 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Оверклокинг. для 2.7В - да, для 3.6В - нет (12МГц) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Ставить ФТДИ просто смешно для данного проекта и не оправданно. Так возьмите AT90USB162. Около $3 в глубокой рознице у наших торгашей. Можно и дешевле найти. Для упрощения своей жизни мы сымитировали софтом саму FTDI. Т.е. наше железо выглядит как последовательный порт с FTDI'шными дровами. Только самой FTDI нету ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба вроде АВР выдает АСК независимо от правильности полученных данных (на проверку нет времени) Не могу так просто с вами согласиться. Вот функция вычисления crc16. Она что, для мебели просто?! Кстати, о чем речь собственно? Лично я про http://www.obdev.at/products/avrusb/index.html И кстати драйвер не стоит на месте, а развивается. ; extern unsigned usbCrc16(unsigned char *data, unsigned char len); ; data: r24/25 ; len: r22 ; temp variables: ; r18: data byte ; r19: bit counter ; r20/21: polynomial ; r23: scratch ; r24/25: crc-sum ; r26/27=X: ptr usbCrc16: mov ptrL, argPtrL mov ptrH, argPtrH ldi resCrcL, 0 ldi resCrcH, 0 ldi polyL, lo8(0xa001) ldi polyH, hi8(0xa001) com argLen; argLen = -argLen - 1 crcByteLoop: subi argLen, -1 brcc crcReady ; modified loop to ensure that carry is set below ld byte, ptr+ ldi bitCnt, -8; strange loop counter to ensure that carry is set where we need it eor resCrcL, byte crcBitLoop: ror resCrcH; carry is always set here ror resCrcL brcs crcNoXor eor resCrcL, polyL eor resCrcH, polyH crcNoXor: subi bitCnt, -1 brcs crcBitLoop rjmp crcByteLoop crcReady: ret Вот как раз для 2х устройств FTDI ставить и оправданно. + Просто + надёжно. 1) Оверклокинг. 2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка. Ну это кому как. Физически фтди сложнее поставить ( tqfp с шагом 0.5 против dip8 :) ) Мне и это просто, хотя немного менее надежно - да. Я не против НОРМАЛЬНОГО юсб, просто это решение тоже имеет право на жизнь. 1) Нет. для 2.7В - да, для 3.6В - нет (12МГц) +1 2) Поясните поподробнее, что имеется ввиду. (про стек) А физика в чем не та? Ну вместо дифф. передатчика 2 обычных, ну и что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rst7 5 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Не могу так просто с вами согласиться. Вот функция вычисления crc16. Она что, для мебели просто?! Функция эта используется для создания пакета для передачи и для проверки целостности пакета при приеме, но уже после того, как хосту сказано, что пакет принят нормально. Поэтому нет перепосылки неправильно принятого пакета. Еще раз повторюсь, ищите мои правки драйвера и доводите их до ума. Там контрольная сумма считается на ходу и хост ставится в известность о необходимости перепосылки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 29 ноября, 2008 Опубликовано 29 ноября, 2008 · Жалоба Функция эта используется для создания пакета для передачи и для проверки целостности пакета при приеме, но уже после того, как хосту сказано, что пакет принят нормально. Поэтому нет перепосылки неправильно принятого пакета. Еще раз повторюсь, ищите мои правки драйвера и доводите их до ума. Там контрольная сумма считается на ходу и хост ставится в известность о необходимости перепосылки. Ясно. Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз. Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана? Более того, даже если некоторые (главное чтоб не все :) ) ответы пропадут, это не важно. Так что то что ущербно для одной задачи, вполне приемлимо для другой! Да, ваш опыт интересен, но нет возможности гонять МП на 20 МГц (питать буду от 3.3В и гонять на 12.8МГц, обеспечивая максимум аппаратной совместимости) Да и нет необходимости. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vvvvv 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Jhohn 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз. похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО :( Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана? вопрос не понял. Более того, даже если некоторые (главное чтоб не все :) ) ответы пропадут, это не важно. Так что то что ущербно для одной задачи, вполне приемлимо для другой! Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 30 ноября, 2008 Опубликовано 30 ноября, 2008 · Жалоба У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232 Теоретически да, нужно чтобы устройство имело 2 различных интерфейса, каждому из которых сопоставленны свои ендпоинты. (если в этом МК нет ограничений этому препятствующих, то можно и практически) Каждый интерфейс реализует свою задачу. похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО :( вопрос не понял. Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство". Я-то разобрался. А вот вы похоже пишете не поняв о чем я. И так и не разобравшись в чем суть темы вообще. Я говорю, что если управляющий пакет потеряется (т.к. МП всегда шлет ACK), то соответственно программа не получит ответ в течении заданного времени, и повторит запрос. Если вы не поняли, посмотрите выше - и поймете, что проверка ошибок реализованна ПОСЛЕ подтверждения приема пакета. Я о функции USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) из драйвера ObDev (ссылка выше) которая вызывается при приходе управляющей транзакции. Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция? Я не об этом. Нумерация у меня всегда проходит без вопросов. Я говорю уже про процесс обмена МОЕЙ программы с устройством. И я для этого использую ендпоинт 0. И меня это вполне устраивает. Задача: переодический запрос и получение нужного параметра. (всего несколько байт) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 1 декабря, 2008 Опубликовано 1 декабря, 2008 · Жалоба Знатоки AVR USB, отзовитесь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба Кстати, что-то я раньше не обращал внимания, но тут http://www.cesko.host.sk/IgorPlugUSB/IgorP...20(AVR)_eng.htm тоже разновидность варианта 1. Но резисторы по 68Ом, да еще и подтяжка 1.5кОм от 5В Удивительно, как это работает =) А оно и не работает... По твоей классификации вариант со стабилитронами я делал так: http://www.swordgreenline.narod.ru/IgorPlug2.html При правильной сборке - заводится сразу... (количество повторений превысило 2000, все возникшие проблемы решались.) Знатоки AVR USB, отзовитесь! И. Теоретически да, нужно чтобы устройство имело 2 различных интерфейса, каждому из которых сопоставленны свои ендпоинты. (если в этом МК нет ограничений этому препятствующих, то можно и практически) Сам то понял что написал? Нужно два дескриптора, а не "ендпоинты" пример - клава и мыша static const char hidReportDescriptor0[] PROGMEM = { /* partial keyboard */ 0x05, 0x01, /* Usage Page (Generic Desktop), */ 0x09, 0x06, /* Usage (Keyboard), */ 0xA1, 0x01, /* Collection (Application), */ 0x85, 0x01, /* Report Id (1) */ 0x95, 0x04, /* Report Count (4), */ 0x75, 0x08, /* Report Size (8), */ 0x15, 0x00, /* Logical Minimum (0), */ 0x25, 0x65, /* Logical Maximum(101), */ 0x05, 0x07, /* Usage Page (Key Codes), */ 0x19, 0x00, /* Usage Minimum (0), */ 0x29, 0x65, /* Usage Maximum (101), */ 0x81, 0x00, /* Input (Data, Array), ;Key arrays (4 bytes) */ 0xC0, /* End Collection */ /* mouse */ 0x05, 0x01, /* Usage Page (Generic Desktop), */ 0x09, 0x02, /* Usage (Mouse), */ 0xA1, 0x01, /* Collection (Application), */ 0x09, 0x01, /* Usage (Pointer), */ 0xA1, 0x00, /* Collection (Physical), */ 0x05, 0x09, /* Usage Page (Buttons), */ 0x19, 0x01, /* Usage Minimum (01), */ 0x29, 0x03, /* Usage Maximun (03), */ 0x15, 0x00, /* Logical Minimum (0), */ 0x25, 0x01, /* Logical Maximum (1), */ 0x85, 0x02, /* Report Id (2) */ 0x95, 0x03, /* Report Count (3), */ 0x75, 0x01, /* Report Size (1), */ 0x81, 0x02, /* Input (Data, Variable, Absolute), ;3 button bits */ 0x95, 0x01, /* Report Count (1), */ 0x75, 0x05, /* Report Size (5), */ 0x81, 0x01, /* Input (Constant), ;5 bit padding */ 0x05, 0x01, /* Usage Page (Generic Desktop), */ 0x09, 0x30, /* Usage (X), */ 0x09, 0x31, /* Usage (Y), */ 0x15, 0x81, /* Logical Minimum (-127), */ 0x25, 0x7F, /* Logical Maximum (127), */ 0x75, 0x08, /* Report Size (8), */ 0x95, 0x02, /* Report Count (2), */ 0x81, 0x06, /* Input (Data, Variable, Relative), ;2 position bytes (X & Y) */ 0xC0, /* End Collection, */ 0xC0, /* End Collection */ }; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба И. Сам то понял что написал? Нужно два дескриптора, а не "ендпоинты" Что, И? Вопрос задан: USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) из драйвера ObDev (ссылка выше) которая вызывается при приходе управляющей транзакции. Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция? Я-то понял, а вы? Я написал, что надо 2 ИНТЕРФЕЙСА. (а бывают интерфейсы без ЕП?!) Соответственно каждому интерфейсу по дескриптору. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба Вопрос задан: USB_PUBLIC uchar usbFunctionSetup(uchar data[8]) из драйвера ObDev (ссылка выше) которая вызывается при приходе управляющей транзакции. Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция? У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232 тебя спросили про два устройства. и не в теории а на практике. Соответственно каждому интерфейсу по дескриптору. и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MAXvaLL 0 2 декабря, 2008 Опубликовано 2 декабря, 2008 · Жалоба тебя спросили про два устройства. и не в теории а на практике. и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один. А я про это и ответил. На практике. Разговор про теорию был т.к. я не знаком конкретно с этим МК. И получиться 2 интерфейса, которые видяться виндой как 2 логических устройства. А зачем вы привели дескрипторы Hid Repport'ов? Это тут причем? Я говорю про общий случай, когда в одном физическом устройстве могут быть совершенно разные логические устройства, а не только хид клава и мышь. Хоть бы объяснили человеку (кто спросил) что это за дескрипторы! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
QuickWitted 0 3 декабря, 2008 Опубликовано 3 декабря, 2008 · Жалоба Хоть бы объяснили человеку (кто спросил) что это за дескрипторы! Это стандартный пример. у атмела есть кривая пояснялка doc7599.pdf doc7805.pdf Основная тонкость в секции usbFunctionSetup Т.е. как разрулить ReportID для разных устройств... а с докой на эту часть небольшой напряг. все делают стандартные связки... (кроме клава мышей в нете проектов с исходниками я невидел, хотя долго искал) если кому интересно поковыряться с этой частью предлагаю свернуться в мыло... uchar usbFunctionSetup(uchar data[8]) { usbRequest_t *rq = (void *) data; DBG1(0xa0, data, 8); if ((rq->bmRequestType & USBRQ_TYPE_MASK) == USBRQ_TYPE_CLASS) { /* class request type */ if (rq->bRequest == USBRQ_HID_GET_REPORT) { /* wValue: ReportType (highbyte), ReportID (lowbyte) */ if (rq->wValue.bytes[0] == 1) { usbMsgPtr = inputBuffer1; return sizeof(inputBuffer1); } else if (rq->wValue.bytes[0] == 2) { usbMsgPtr = inputBuffer2; return sizeof(inputBuffer2); } return 0; } else if (rq->bRequest == USBRQ_HID_SET_REPORT) { /* wValue: ReportType (highbyte), ReportID (lowbyte) */ /* we have no output/feature reports */ return 0; } else if (rq->bRequest == USBRQ_HID_GET_IDLE) { usbMsgPtr = &idleRate; return 1; } else if (rq->bRequest == USBRQ_HID_SET_IDLE) { idleRate = rq->wValue.bytes[1]; } return 0; } return 0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться