| Электроника - это просто Теоретические и практические вопросы для начинающих электронщиков. |
Вопрос гуру USB (относительно USB CDC)
18.10.2018, 13:46
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Вопрос гуру USB (относительно USB CDC)
Пытаюсь из STM32F042 сделать "эмулятор" PL2303 (а потом и ch340 можно так же эмулировать). Отчасти рабочий код (сильно непричесанный, за основу взял чужой пример для HID, поэтому комментарии на русском пока еще).
При подключении МК ядро считает его PL2303, udev загружает соответствующий модуль и чтение/запись нормально работает. Однако, совершенно непонятными для меня остались две вещи:
1) каким образом менять скорость USART (ведь CDC можно использовать не только для общения с МК, но и для изменения параметров каких-нибудь его интерфейсов, в т.ч. какого-нибудь вспомогательного USART): ни до, ни после сообщения SET_LINE_CODING нет пакетов, хоть чем-то похожих на установку скорости;
2) зачем нужна EP1 (interrupt IN), если компьютер ее вообще не использует?
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
18.10.2018, 16:33
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Вопрос гуру USB (относительно USB CDC)
Смотрю wireshark'ом: после запроса SET_LINE_CODING идет нулевой запрос Control IN, у которого после 64 байт самого запроса еще 7 байт данных!
Как их вытащить?
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
19.10.2018, 19:32
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,684
Сказал спасибо: 116
Сказали Спасибо 823 раз(а) в 597 сообщении(ях)
|
Re: Вопрос гуру USB (относительно USB CDC)
Я - клинический идиот!
Убил целую неделю безрезультатно.
Все, не буду пытаться сделать то, что вообще не понимаю ни на йоту! Чтение RM, даташитов, исходников ST'шных библиотек ни к чему не привело. Как из SETUP-пакета извлечь не только данные самого пакета, но и дополнительно передаваемые данные, я не смог.
Похоже, водка дает о себе знать: мозг у меня совсем деградировал...
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
20.10.2018, 08:54
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
|
Re: Вопрос гуру USB (относительно USB CDC)
Сообщение от eddy
|
|
Как из SETUP-пакета извлечь не только данные самого пакета, но и дополнительно передаваемые данные, я не смог.
|
Смутно уже припоминаю, давненько было.
Но, вроде, в EP0 после SETUP_PACKET сразу же лежат данные, которые передаются вместе с ним. wLength в Setup пакете указывает, сколько данных нужно читать. Если данные не помещаются в одном пакете, то продолжение будет в следующем Setup пакете (вроде, называются data stage) и т.д.
https://www.keil.com/pack/doc/mw/USB...transfers.html
Как-то так.
P.S. Правильно вот так: первый setup пакет содержит только заголовок. Из него надо считать wLengths, а далее ждать следующего пакета и уже из него читать данные. Уже плохо помню, а рыться лень.
Последний раз редактировалось pambaru; 20.10.2018 в 09:35.
|
|
|
|
20.10.2018, 09:32
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 24.03.2007
Сообщений: 1,394
Сказал спасибо: 85
Сказали Спасибо 672 раз(а) в 392 сообщении(ях)
|
Re: Вопрос гуру USB (относительно USB CDC)
Да, похоже setup пакет всегда 8 байт, а далее идет нужное кол-во DATA пакетов.
Припоминаю, что для чтения данных из EP0 после получения Setup нужно было ждать следующего пакета.
1. The Setup Stage is where the request is sent.
2. The optional Data Stage consists of one or multiple IN or OUT transfers.
3. Status Stage reports the status of the overall request
https://www-user.tu-chemnitz.de/~heh...b4.htm#Control
Да, вот сейчас порылся в старом проекте на кипарисе.
После чтения SETUP пакета я читал wLength, потом ждал, пока в EP0 не наберется нужного кол-ва данных, потом считывал их и отправлял Handshake (ACK).
Вот что в мануале на кипарис написано:
The STATUS stage consists of an empty data packet with the opposite direction of the data stage, or
an IN if there was no data stage. This empty data packet gives the device a chance to ACK, NAK, or
STALL the entire CONTROL transfer.
Т.е. ACK надо отправлять не после получения первого пакета Setup, а после получения всего пакета данных, включая пакеты Data!!!
|
|
|
|
Сказали "Спасибо" pambaru
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:57.
|
|