реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Делаем AVR USB (software) правильно, уровень схемы
Petka
сообщение Nov 29 2008, 14:12
Сообщение #16


Профессионал
*****

Группа: Свой
Сообщений: 1 453
Регистрация: 23-08-05
Пользователь №: 7 886



Цитата(MAXvaLL @ Nov 29 2008, 10:25) *
Мне надо сделать 2 устройства, но это не значит что абы-как.

Ставить ФТДИ просто смешно для данного проекта и не оправданно.

Вот как раз для 2х устройств FTDI ставить и оправданно.
+ Просто + надёжно.
Цитата
Между прочим, скажите, чем вариант 3 при правильной реализации хуже хардварного ЮСБ?

1) Оверклокинг.
2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка.
Go to the top of the page
 
+Quote Post
ukpyr
сообщение Nov 29 2008, 14:28
Сообщение #17


Профессионал
*****

Группа: Участник
Сообщений: 1 264
Регистрация: 17-06-08
Из: бандустан
Пользователь №: 38 347



Цитата
Оверклокинг.

для 2.7В - да, для 3.6В - нет (12МГц)
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 29 2008, 14:52
Сообщение #18


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Ставить ФТДИ просто смешно для данного проекта и не оправданно.


Так возьмите AT90USB162. Около $3 в глубокой рознице у наших торгашей. Можно и дешевле найти.

Для упрощения своей жизни мы сымитировали софтом саму FTDI. Т.е. наше железо выглядит как последовательный порт с FTDI'шными дровами. Только самой FTDI нету wink.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Nov 29 2008, 18:10
Сообщение #19


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Цитата(ukpyr @ Nov 29 2008, 15:17) *
вроде АВР выдает АСК независимо от правильности полученных данных (на проверку нет времени)


Не могу так просто с вами согласиться.
Вот функция вычисления 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


Цитата(Petka @ Nov 29 2008, 17:12) *
Вот как раз для 2х устройств FTDI ставить и оправданно.
+ Просто + надёжно.

1) Оверклокинг.
2) Не полное соответствие спецификации USB. Как физический протокол, так и реализация стэка.


Ну это кому как. Физически фтди сложнее поставить ( tqfp с шагом 0.5 против dip8 smile.gif )
Мне и это просто, хотя немного менее надежно - да.
Я не против НОРМАЛЬНОГО юсб, просто это решение тоже имеет право на жизнь.

1) Нет.
Цитата(ukpyr @ Nov 29 2008, 17:28) *
для 2.7В - да, для 3.6В - нет (12МГц)

+1

2) Поясните поподробнее, что имеется ввиду. (про стек)
А физика в чем не та? Ну вместо дифф. передатчика 2 обычных, ну и что?
Go to the top of the page
 
+Quote Post
Rst7
сообщение Nov 29 2008, 18:23
Сообщение #20


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(MAXvaLL @ Nov 29 2008, 20:10) *
Не могу так просто с вами согласиться.
Вот функция вычисления crc16. Она что, для мебели просто?!

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


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Nov 29 2008, 18:29
Сообщение #21


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Цитата(Rst7 @ Nov 29 2008, 21:23) *
Функция эта используется для создания пакета для передачи и для проверки целостности пакета при приеме, но уже после того, как хосту сказано, что пакет принят нормально. Поэтому нет перепосылки неправильно принятого пакета. Еще раз повторюсь, ищите мои правки драйвера и доводите их до ума. Там контрольная сумма считается на ходу и хост ставится в известность о необходимости перепосылки.


Ясно.

Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз.

Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана?

Более того, даже если некоторые (главное чтоб не все smile.gif ) ответы пропадут, это не важно.

Так что то что ущербно для одной задачи, вполне приемлимо для другой!

Да, ваш опыт интересен, но нет возможности гонять МП на 20 МГц (питать буду от 3.3В и гонять на 12.8МГц, обеспечивая максимум аппаратной совместимости)
Да и нет необходимости.
Go to the top of the page
 
+Quote Post
vvvvv
сообщение Nov 30 2008, 12:34
Сообщение #22


Местный
***

Группа: Свой
Сообщений: 342
Регистрация: 21-06-04
Пользователь №: 85



У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232
Go to the top of the page
 
+Quote Post
Jhohn
сообщение Nov 30 2008, 19:00
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 65
Регистрация: 12-11-08
Пользователь №: 41 579



Цитата(MAXvaLL @ Nov 29 2008, 21:29) *
Но у меня используются только управляющие транзакции, и если устройство не ответит на запрос, программа просто пошлет запрос еще раз.


похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО sad.gif

Цитата(MAXvaLL @ Nov 29 2008, 21:29) *
Вопрос: а если обнаружена ошибка, UsbSetup будет вызвана?


вопрос не понял.

Цитата(MAXvaLL @ Nov 29 2008, 21:29) *
Более того, даже если некоторые (главное чтоб не все smile.gif ) ответы пропадут, это не важно.

Так что то что ущербно для одной задачи, вполне приемлимо для другой!


Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство".
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Nov 30 2008, 20:13
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Цитата(vvvvv @ Nov 30 2008, 15:34) *
У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232


Теоретически да, нужно чтобы устройство имело 2 различных интерфейса, каждому из которых сопоставленны свои ендпоинты. (если в этом МК нет ограничений этому препятствующих, то можно и практически)
Каждый интерфейс реализует свою задачу.

Цитата(Jhohn @ Nov 30 2008, 22:00) *
похоже вы не разобрались в USB. Если не получит подтверждения (ask, и т.п.) системное обеспечение уравляющее хост-контроллером вышлет повторный запрос, а потом если не будет ответа еще раз вышлет, а не ПО sad.gif

вопрос не понял.

Что ж у вас за задача? Вначале ОС определяет на своем уровне есть ли новое устройство и посылает всякие setup пакеты. Если ОС не определит то напишет "неизвестное устройство".


Я-то разобрался.
А вот вы похоже пишете не поняв о чем я. И так и не разобравшись в чем суть темы вообще.
Я говорю, что если управляющий пакет потеряется (т.к. МП всегда шлет ACK), то соответственно программа не получит ответ в течении заданного времени, и повторит запрос.
Если вы не поняли, посмотрите выше - и поймете, что проверка ошибок реализованна ПОСЛЕ подтверждения приема пакета.

Я о функции
USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
из драйвера ObDev (ссылка выше)
которая вызывается при приходе управляющей транзакции.
Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?

Я не об этом. Нумерация у меня всегда проходит без вопросов.
Я говорю уже про процесс обмена МОЕЙ программы с устройством.
И я для этого использую ендпоинт 0. И меня это вполне устраивает.
Задача: переодический запрос и получение нужного параметра. (всего несколько байт)
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Dec 1 2008, 18:51
Сообщение #25


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Знатоки AVR USB, отзовитесь!
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Dec 2 2008, 14:18
Сообщение #26


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(MAXvaLL @ Nov 28 2008, 21:03) *
Кстати, что-то я раньше не обращал внимания, но тут
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, отзовитесь!


И.


Цитата(MAXvaLL @ Dec 1 2008, 01:13) *
Теоретически да, нужно чтобы устройство имело 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 */
};


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Dec 2 2008, 17:42
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Цитата(QuickWitted @ Dec 2 2008, 17:18) *
И.

Сам то понял что написал?
Нужно два дескриптора, а не "ендпоинты"


Что, И?

Вопрос задан:
USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
из драйвера ObDev (ссылка выше)
которая вызывается при приходе управляющей транзакции.
Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?

Я-то понял, а вы?
Я написал, что надо 2 ИНТЕРФЕЙСА. (а бывают интерфейсы без ЕП?!)
Соответственно каждому интерфейсу по дескриптору.
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Dec 2 2008, 18:07
Сообщение #28


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(MAXvaLL @ Dec 2 2008, 22:42) *
Вопрос задан:
USB_PUBLIC uchar usbFunctionSetup(uchar data[8])
из драйвера ObDev (ссылка выше)
которая вызывается при приходе управляющей транзакции.
Интересует что будет, если обнаружиться ошибка приема пакета? Будет ли вызванна функция?


Цитата
У меня вопрос немного в сторону, но может кто знает, возможно ли в AT90USB162 настроить так, чтобы определялась в виндах как два устройства одновременно, например клава и RS232


тебя спросили про два устройства.
и не в теории а на практике.

Цитата
Соответственно каждому интерфейсу по дескриптору.


и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один.


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post
MAXvaLL
сообщение Dec 2 2008, 19:18
Сообщение #29


Местный
***

Группа: Свой
Сообщений: 221
Регистрация: 26-12-07
Пользователь №: 33 639



Цитата(QuickWitted @ Dec 2 2008, 21:07) *
тебя спросили про два устройства.
и не в теории а на практике.
и получится 2 интерфейса, а тебя просили "чтобы определялась в виндах как два устройства одновременно" т.е. на один.


А я про это и ответил. На практике. Разговор про теорию был т.к. я не знаком конкретно с этим МК.

И получиться 2 интерфейса, которые видяться виндой как 2 логических устройства.

А зачем вы привели дескрипторы Hid Repport'ов? Это тут причем?
Я говорю про общий случай, когда в одном физическом устройстве могут быть совершенно разные логические устройства, а не только хид клава и мышь.

Хоть бы объяснили человеку (кто спросил) что это за дескрипторы!
Go to the top of the page
 
+Quote Post
QuickWitted
сообщение Dec 3 2008, 02:35
Сообщение #30


Местный
***

Группа: Участник
Сообщений: 322
Регистрация: 21-06-07
Из: СНГ
Пользователь №: 28 596



Цитата(MAXvaLL @ Dec 3 2008, 00:18) *
Хоть бы объяснили человеку (кто спросил) что это за дескрипторы!


Это стандартный пример.

у атмела есть кривая пояснялка
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;
}


--------------------
Сайт с разработками http://www.mindrunway.ru/
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 16:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016