конечно же я это всё изучил и прекрасно понимаю, о чём вы. Меня интересует работа с протоколом в связке с аппаратной реализацией в stm32.[/uquote]Я вас и не называл д... Я написал, что в первом вопросе у вас - каша. Трудно понять о чём там речь.
Так как нет никаких setup-запросов. Есть setup-транзакция в начале control-запроса. data-stage этой транзакции всегда имеет одно направление - от хоста. Квитируется (ACK-ается) эта транзакция USB-периферией ведомого автоматически. Программа стека тут ничего не должна делать.
После setup-транзакции control-запроса как правило идёт IN или OUT транзакция (какая именно - в зависимости от bmRequestType.бит7). data-stage этой транзакций имеет направление - или "к хосту" или "от хоста". Возможно эта транзакция может вообще отсутствовать, если длина в setup==0, а может в этом случае быть IN или OUT нулевой длины (тут не уверен, но думаю - зависит от реализации стека хоста). В случае IN-транзакции вы обязаны отправить пакет данных хосту (хотя-бы нулевой длины. В случае OUT-транзакции - никакой пакет данных вы отправить не можете, можете отправить только ACK или NACK. Ну и в любом случае (IN/OUT) можете выставить STALL.
Вот и всё о завершении control-запроса. Из чего совершенно непонятно - о чём идёт речь в вашем 1-м вопросе? data-stage в control-запросе как правило - две штуки. И они могут иметь разное направление. И ни данными ни пустым пакетом вы на OUT-транзакцию ответить не можете (тем более - на setup-транзакцию). Только ACK или NACK. Возможно в том стеке, который вы ковыряли, при вызове функции отправки ZLP-кадра для OUT-транзакции, в реальности отправляется просто ACK. Но (если так) это просто - вариант реализации стека, о которой нам тут ничего не известно, так как вашего кода мы не видим и угадать не можем. Ведь тема-то - о стеке своими руками, а не о какой-то готовой реализации.
Разве я не прав?


