Также имеются стандартные 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
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);
SetEPTxValid(ENDP1);
Но в регистре USB_EP1R в STAT_TX статус NAK.
Похоже данные не уходят и прерыание EP2_OUT тоже не возникает.
Есть подозрение что я напутал IN и OUT ендпойнты.
Но не могу понять где хранится атрибут эндпойнта. Как понять настроен он на IN или OUT?