Кидай книжку.
USB интерфейс в STM32F103
Сообщений 31 страница 60 из 99
Поделиться322017-04-25 11:09:23
Положил рядом с примером на яндекс диске
Поделиться332017-04-25 11:18:43
Спасибо, слил.
Поделиться342017-04-25 22:05:05
Попытался немного облагородить код, и есть небольшие успехи
Не могу только понять почему через один.
vt340 не мог бы ты поподробней рассказать про DTOG_{RX|TX}, а то я в них все врубиться не могу?..
Вот функция приема/передачи для EP1 (вызывается из прерывания)
void EP1_Handler(ep_t ep){ if ((ep.rx_flag) && ((USB -> ISTR & USB_ISTR_DIR))){ //CTR_RX = 1 && TOKEN OUT EP_Read(1, buffer, ep.rx_cnt, 0xD090); //читаю буфер и сбрасываю CTR_RX, устанавливаю DTOG_RX, //STAT_RX=STALL, сбрасываю CTR_TX и STAT_TX=STALL LED_ON; EP_Write(1, buffer, ep.rx_cnt, 0x9030); //отправляю буфер и STAT_RX = STALL, STAT_TX = VALID } else if ((ep.tx_flag) && ((USB -> ISTR & USB_ISTR_DIR)) == 0){//CTR_TX = 1 && TOKEN IN LED_OFF; USB -> EPnR[1] ^= 0x30D0; //STAT_RX = VALID, STAT_TX = STALL, сбрасываю CTR_TX //и устанавливаю DTOG_TX. } ep.tx_flag = 0; ep.rx_flag = 0; ep.setup_flag = 0; }
Заработало только так. При попытке заменить STALL на NAK или изменять DTOGи, в лучшем случае проходит первое эхо, а дальше тишина...
Исходники тут, в папке и архиве с суффиксом _v2 Ссылка
Поделиться352017-04-25 23:24:01
vt340 не мог бы ты поподробней рассказать про DTOG_{RX|TX}, а то я в них все врубиться не могу?..
...
Исходники тут, в папке и архиве с суффиксом _v2 Ссылка
sobs, значит пора книжку читать )
У меня нет цели кого-то учить и тем более в чужих исходниках ошибки искать
Я делюсь идеями и решениями и, наоборот, надеюсь, что кто-нибудь что-нибудь оптимизирует, улучшит, расширит, портирует, в этом и будет мой профит, а не в том что я тут в гуру поиграю )
Кстати, ты вот уже обнаружил ошибку с адресацией в f0, я не проверял вживую на f0 и не заметил
И кстати, да, в тексте у меня про data toggle плохо и непонятно написано, давай придумаем и сформулируем как понятней, и я исправлю
Отредактировано vt340 (2017-04-26 08:11:55)
Поделиться362017-04-26 12:50:04
dosikus
Ты про готовые дефайны спрашивал, я вспомнил, в стелларисваре usblib был usbbulk - это оно и есть
Посмотрел, и в tivaware остался только называется usbdbulk - https://github.com/yuvadm/tiva-c/tree/m … lib/device
Аа, дошло до меня, что ты не про дескрипторы )
Отредактировано vt340 (2017-04-26 21:22:50)
Поделиться372017-04-26 16:00:51
И кстати, да, в тексте у меня про data toggle плохо и непонятно написано, давай придумаем и сформулируем как понятней, и я исправлю
Когда полностью разберусь, попробую сформулировать. Пока понял, что их надо чередовать (DATA0 и DATA1).
Столкнулся еще с проблемой 8 битного доступа к памяти буферов. По 8 бит читается нормально, а вот пишется только по 16. При попытке записи 8 бит, каждый 2й записанный байт затирает предыдущий. Создал тему на изиэлектроникс, чтобы не дублировать добавлю ссылку сюда. Если нарушил какие-нибудь правила, то извиняюсь.
Поделиться382017-04-26 21:28:09
sobs, пришлось выйти, я совершенно не уверен что там кто либо откликнется. Ибо поэтому мы здесь.
vt340, совершенно верно сказал- мы не собираемся играть в гуру или кого-то учить, мы делимся своими наработками и даем лишь тему для размышлений подобным нам.
Ждем халявы ? Возможно...
Так что зря извиняешься , мы так же в многом плаваем...
Поделиться392017-04-26 21:46:14
sobs, пришлось выйти, я совершенно не уверен что там кто либо откликнется. Ибо поэтому мы здесь
Неужели все так плохо? Я его считал одним из лучших форумов по этой тематике. Хотя это оффтоп.
По теме, нет никаких мыслей по поводу некорректной записи при 8-битном доступе? Читается отлично, а вот пишется с ошибками. Если не додумаюсь, придется при отправке данные упаковывать в 16-бит)
Поделиться402017-04-27 07:34:54
Популярные форумы - попса, по определению, иначе они не будут популярными )
Поделиться412017-04-27 16:03:15
Победил) Тест проходит
Все достаточно красиво работает на прерываниях, зла пока не увидел)
Исходник тут в архиве Ссылка, постарался подробно откомментировать.
Поделиться422017-04-27 17:42:05
Исходник тут в архиве Ссылка
Код:uint16_t EP1_Handler(ep_t ep){ if (ep.rx_flag){ //Пришли новые данные EP_Read(1, buffer, ep.rx_cnt); //Читаем EP_Write(1, buffer, ep.rx_cnt); //Пишем ...
А если не просто эхо?
Поделиться432017-04-27 17:50:13
А если не просто эхо?
Например?
Поделиться442017-04-27 18:09:00
Ну ты же не просто эхо гонять собираешься )
Как это будет выглядеть если принимать, что-то делать и передавать?
Если только принимать и что-то делать (без передачи)?
Если что-то делать и только передавать (без приёма)?
Поделиться452017-04-27 18:30:09
Ну ты же не просто эхо гонять собираешься )
Нет конечно) Но не вижу особых трудностей. Не предусмотрел, правда удобного интерфейса передачи извне прерывания (неудобства в сбросе флагов). Доработаю.
А если просто принимать и что-то делать, то вообще без проблем. В прерывании принял и если действия из разряда "зажечь светодиодик", то прямо там же и выполню. Если посложнее, то выставлю флаг.
Пока заметил, что в windows 8.1, windows 10 и linux энумерация не проходит. В xp и 7 все хорошо. Оставил анализатор на работе, завтра если будет время - исправлю.
Поделиться462017-04-27 19:03:59
Если посложнее, то выставлю флаг.
И дальше что? )
Снова тут же поставишь ep в valid?
Ну хост тебе тут же ещё пришлёт, и куда складывать будешь?
Не будешь сразу выставлять ep в valid в прерывании, а выставишь когда-то после обработки?
Зачем тогда тебе прерывание - чтоб из usb ram в обычную ram перекладывать и оно бы там лежало до обработки?
В этом нет смысла
Поделиться472017-04-27 19:17:50
EP в Valid выставлю потом, после обработки. А данные можно оставить и в usb ram, пока в valid не поставлю она не испортится. Смысл в том, чтобы не пулить флаги прерывания, хотя тогда надо пулить флаги события. Скажу так, разницы не вижу. И так и так будет работать. Возможно замечу разницу, когда что-то практическое начну делать)
С EPnR ST конечно намутили. Могли дать просто битовый доступ, как BSRR в GPIO, вместо toggle битов...
Отредактировано sobs (2017-04-27 19:20:51)
Поделиться482017-04-27 19:33:17
А данные можно оставить и в usb ram, пока в valid не поставлю она не испортится. Смысл в том, чтобы не пулить флаги прерывания, хотя тогда надо пулить флаги события. Скажу так, разницы не вижу.
Да ну? )
Городить прерывания, парсить istr чтоб найти вызвавшую перывание ep и по итогу выставлять некий флаг для этой ep, который проверять в поллинге, вместо того чтоб просто проверять бит в epnr - это никакой разницы? )
С epnr нужна атомарная операция, toggle более красивое решение чем bsrr, имхо
Поделиться492017-04-27 19:40:49
Городить прерывания, парсить istr чтоб найти вызвавшую перывание ep и по итогу выставлять некий флаг для этой ep, который проверять в поллинге, вместо того чтоб просто проверять бит в epnr - это никакой разницы? )
Это если одна/две конечные точки, а если 8? Все равно парсить istr. А как с читабельностью?
toggle не понравилась тем, что надо и DTOGи жестко выставлять, а они в большинстве случаев сами правильно тогглятся)
Останемся каждый при своем мнении, может народ рассудит))
Отредактировано sobs (2017-04-27 19:44:25)
Поделиться502017-04-27 20:18:02
Останемся каждый при своем мнении
Естессно, но чур тогда больше не домогаться почему прерывания зло )
Поделиться512017-04-27 20:19:25
Естессно, но чур тогда больше не домогаться почему прерывания зло )
Окей)
Поделиться522017-04-28 10:18:40
Исправил энумерацию, проверил в windows 8.1 и linux. На 10 вечером проверю. Дело было в том, что в них обмен на шине намного плотнее, и не надо было при энумерации RX в STALL ставить.
Изменил немного интерфейс функций обработки прерывания, отправки и приема пакетов. Теперь можно отправлять данные извне прерывания. Показал оба способа, выбираются дефайном.
Исходник _v4 Ссылка
upd. Windows 10 полет нормальный.
Отредактировано sobs (2017-04-28 17:48:14)
Поделиться532017-04-28 21:07:29
sobs
По поводу того, что ты в своих сорцах костылём называешь
Можно не заморачиваться типом массива данных, пусть аргумент ф-ции uint_16*, а в программе union этого массива и любой структуры
И можно будет любые структуры, а не только массивы байтов или слов пересылать
Имхо, usb и-фейс в stm32 больше похож на параллельную шину шириной 512 бит (64x8), чем на последовательный и-фейс )
Поделиться542017-04-28 21:36:35
vt340 согласен)
Теперь в планах разобраться с HID, CDC и MassStorage. Больше всего HID интерисует, так как не нужны драйвера.
Отредактировано sobs (2017-04-28 21:41:12)
Поделиться552017-04-28 22:56:23
Теперь в планах разобраться с HID, CDC и MassStorage. Больше всего HID интерисует, так как не нужны драйвера.
Имхо, в этих классах нет никакого практического смысла, ну разве что для развлечения или из спортивного интереса )
Поделиться562017-04-29 07:16:27
Имхо, в этих классах нет никакого практического смысла, ну разве что для развлечения или из спортивного интереса )
Не согласен. Из MassStorage неплохой бутлоадер сделать можно - девайс как флешка определился, скидываешь бинарник и он прошивается. У HID плюс в отсутствии драйверов, настройку девайса через него можно сделать. Ну а CDC позволит работать с девайсом как с обычным COM портом, что тоже во многих случаях удобно. Это мое имхо)
Поделиться572017-04-29 07:51:35
Ну, всё что ты перечислил и есть развлечения самого себя
Хотя обычно маскируется рассуждениями об "удобстве" для сферического "пользователя" )
Поделиться582017-04-29 08:00:03
И тут мы останемся каждый при своем мнении)
Поделиться592017-05-01 10:22:49
sobs
А вот этот лог твой анализатор прямо в таком виде в файл сохраняет?
1)
SYNC
PID SETUP
ADDR = 0x00, ENDP = 0x00
CRC OK
EOP
2)
SYNC
PID DATA0
bmRequestType = 0x80
bRequest=0x06 GET_DESCRIPTOR
wValue=0x0100
wIndex=0x0000
wLength=0x0040
CRC OK
EOP
Если да, то было б интересно если б ты выложил файлы для разных систем и разных классов
Я бы попробовал из них вытащить последовательности enumeration в упрощённо-наглядном виде
Поделиться602017-05-01 16:35:21
vt340, не прямо в таком, но похоже. Скинул сюда первые 3 секунды подключения термометра к Windows 7 и KDE Neon 5.9.5. Но как я и говорил, у меня плавает частота, поэтому много Error Packet вместо осмысленных данных (сделал несколько попыток, скинул самые удачные). Надо будет платку новую сделать, добавить кварц.
Программу качай отсюда Ссылка
Файлы Ссылка
В программе Ctrl+O - открыть файл, навигация мышкой, для быстрого поиска в окошке Decoded Protocols в поле поиска введи например SETUP и он покает их все.