Имеется устройство с USB хост стороннего производителя.
Также имеются стандартные USB устройтсва клиенты того же производителя.
Они вместе взаимодействуют.
Мне нужно сделать подобное устройство. Документация на протокол имеется.
Но никак не получается начать обмен по USB.
Раньше с USB работал (использовал CDC и libusb) но всегда все сразу работало даже не разбирался в USB стеке.
Хост запрашивает дескрипторы я на них отвечаю.
В регистр USB_DADDR записывается 0x81.
Вроде этого достаточно чтобы сказать что энумерация прошла успешно.
Дескриптор эндпойнтов вот такой
Код
bLength = 0x07
bDescriptorType = 0x05
ENDPOINT
bEndpointAddress = 0x02
D7 : Direction
0 = OUT endpoint
D6...4 : Reserved
000
D3...0 : The endpoint number
2
bmAttributes = 0x02
D7...6 : Reserved
00
D5...4 : Usage Type
00 = Data endpoint
D3...2 : Synchronization Type
00 = No Synchronization
D1...0 : Transfer Type
10 = Bulk
wMaxPacketSize = 64
bInterval = 0
bLength = 0x07
bDescriptorType = 0x05
ENDPOINT
bEndpointAddress = 0x81
D7 : Direction
1 = IN endpoint
D6...4 : Reserved
000
D3...0 : The endpoint number
1
bmAttributes = 0x02
D7...6 : Reserved
00
D5...4 : Usage Type
00 = Data endpoint
D3...2 : Synchronization Type
00 = No Synchronization
D1...0 : Transfer Type
10 = Bulk
wMaxPacketSize = 64
bInterval = 0
Из него я вижу что у нас EP1_IN и EP2_OUT.
Согласно протокола я должен отправить валидные данные хосту только после этого он мне ответит.
Для работы использую либы от ST, пишу так
Код
USB_SIL_Write(EP1_IN, answer, sizeof(answer));
SetEPTxValid(ENDP1);
Но в регистре USB_EP1R в STAT_TX статус NAK.
Похоже данные не уходят и прерыание EP2_OUT тоже не возникает.
Есть подозрение что я напутал IN и OUT ендпойнты.
Но не могу понять где хранится атрибут эндпойнта. Как понять настроен он на IN или OUT?