Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Архив » USB интерфейс в STM32F103


USB интерфейс в STM32F103

Сообщений 31 страница 60 из 99

31

Кидай книжку.

32

Положил рядом с примером на яндекс диске

33

Спасибо, слил.

34

Попытался немного облагородить код, и есть небольшие успехи
http://sh.uploads.ru/t/m6eRN.jpg
Не могу только понять почему через один.
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 Ссылка

35

sobs написал(а):

vt340 не мог бы ты поподробней рассказать про DTOG_{RX|TX}, а то я в них все врубиться не могу?..
...
Исходники тут, в папке и архиве с суффиксом _v2 Ссылка

sobs, значит пора книжку читать )
http://sg.uploads.ru/0TdIM.png
http://s4.uploads.ru/tHpFa.png

У меня нет цели кого-то учить и тем более в чужих исходниках ошибки искать
Я делюсь идеями и решениями и, наоборот, надеюсь, что кто-нибудь что-нибудь оптимизирует, улучшит, расширит, портирует, в этом и будет мой профит, а не в том что я тут в гуру поиграю )
Кстати, ты вот уже обнаружил ошибку с адресацией в f0, я не проверял вживую на f0 и не заметил

И кстати, да, в тексте у меня про data toggle плохо и непонятно написано, давай придумаем и сформулируем как понятней, и я исправлю

Отредактировано vt340 (2017-04-26 08:11:55)

36

dosikus
Ты про готовые дефайны спрашивал, я вспомнил, в стелларисваре usblib был usbbulk - это оно и есть
Посмотрел, и в tivaware остался только называется usbdbulk - https://github.com/yuvadm/tiva-c/tree/m … lib/device

Аа, дошло до меня, что ты не про дескрипторы )

Отредактировано vt340 (2017-04-26 21:22:50)

37

И кстати, да, в тексте у меня про data toggle плохо и непонятно написано, давай придумаем и сформулируем как понятней, и я исправлю

Когда полностью разберусь, попробую сформулировать. Пока понял, что их надо чередовать (DATA0 и DATA1).
Столкнулся еще с проблемой 8 битного доступа к памяти буферов. По 8 бит читается нормально, а вот пишется только по 16. При попытке записи 8 бит, каждый 2й записанный байт затирает предыдущий. Создал тему на изиэлектроникс, чтобы не дублировать добавлю ссылку сюда. Если нарушил какие-нибудь правила, то извиняюсь.

38

sobs, пришлось выйти, я совершенно не уверен что там кто либо откликнется. Ибо поэтому мы здесь.

vt340, совершенно верно сказал- мы не собираемся играть в гуру или кого-то учить, мы делимся своими наработками и даем лишь тему для размышлений подобным нам.
Ждем халявы ? Возможно...

Так что зря извиняешься , мы так же в многом плаваем...

39

sobs, пришлось выйти, я совершенно не уверен что там кто либо откликнется. Ибо поэтому мы здесь

Неужели все так плохо? Я его считал одним из лучших форумов по этой тематике. Хотя это оффтоп.

По теме, нет никаких мыслей по поводу некорректной записи при 8-битном доступе? Читается отлично, а вот пишется с ошибками. Если не додумаюсь, придется при отправке данные упаковывать в 16-бит)

40

Популярные форумы - попса, по определению, иначе они не будут популярными )

41

Победил) Тест проходит
http://s0.uploads.ru/t/ZJmPD.jpg
Все достаточно красиво работает на прерываниях, зла пока не увидел)
Исходник тут в архиве Ссылка, постарался подробно откомментировать.

42

sobs написал(а):

Исходник тут в архиве Ссылка

Код:
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);    	//Пишем
...

А если не просто эхо?

43

vt340 написал(а):

А если не просто эхо?

Например?

44

Ну ты же не просто эхо гонять собираешься )
Как это будет выглядеть если принимать, что-то делать и передавать?
Если только принимать и что-то делать (без передачи)?
Если что-то делать и только передавать (без приёма)?

45

Ну ты же не просто эхо гонять собираешься )

Нет конечно) Но не вижу особых трудностей. Не предусмотрел, правда удобного интерфейса передачи извне прерывания (неудобства в сбросе флагов). Доработаю.
А если просто принимать и что-то делать, то вообще без проблем. В прерывании принял и если действия из разряда "зажечь светодиодик", то прямо там же и выполню. Если посложнее, то выставлю флаг.

Пока заметил, что в windows 8.1, windows 10 и linux энумерация не проходит. В xp и 7 все хорошо. Оставил анализатор на работе, завтра если будет время - исправлю.

46

sobs написал(а):

Если посложнее, то выставлю флаг.

И дальше что? )
Снова тут же поставишь ep в valid?
Ну хост тебе тут же ещё пришлёт, и куда складывать будешь?
Не будешь сразу выставлять ep в valid в прерывании, а выставишь когда-то после обработки?
Зачем тогда тебе прерывание - чтоб из usb ram в обычную ram перекладывать и оно бы там лежало до обработки?
В этом нет смысла

47

EP в Valid выставлю потом, после обработки. А данные можно оставить и в usb ram, пока в valid не поставлю она не испортится. Смысл в том, чтобы не пулить флаги прерывания, хотя тогда надо пулить флаги события. Скажу так, разницы не вижу. И так и так будет работать. Возможно замечу разницу, когда что-то практическое начну делать)

С EPnR ST конечно намутили. Могли дать просто битовый доступ, как BSRR в GPIO, вместо toggle битов...

Отредактировано sobs (2017-04-27 19:20:51)

48

sobs написал(а):

А данные можно оставить и в usb ram, пока в valid не поставлю она не испортится. Смысл в том, чтобы не пулить флаги прерывания, хотя тогда надо пулить флаги события. Скажу так, разницы не вижу.

Да ну? )
Городить прерывания, парсить istr чтоб найти вызвавшую перывание ep и по итогу выставлять некий флаг для этой ep, который проверять в поллинге, вместо того чтоб просто проверять бит в epnr - это никакой разницы? )

С epnr нужна атомарная операция, toggle более красивое решение чем bsrr, имхо

49

Городить прерывания, парсить istr чтоб найти вызвавшую перывание ep и по итогу выставлять некий флаг для этой ep, который проверять в поллинге, вместо того чтоб просто проверять бит в epnr - это никакой разницы? )

Это если одна/две конечные точки, а если 8? Все равно парсить istr. А как с читабельностью?
toggle не понравилась тем, что надо и DTOGи жестко выставлять, а они в большинстве случаев сами правильно тогглятся)
Останемся каждый при своем мнении, может народ рассудит))

Отредактировано sobs (2017-04-27 19:44:25)

50

sobs написал(а):

Останемся каждый при своем мнении

Естессно, но чур тогда больше не домогаться почему прерывания зло )

51

vt340 написал(а):

Естессно, но чур тогда больше не домогаться почему прерывания зло )

Окей)

52

Исправил энумерацию, проверил в windows 8.1 и linux. На 10 вечером проверю. Дело было в том, что в них обмен на шине намного плотнее, и не надо было при энумерации RX в STALL ставить.
Изменил немного интерфейс функций обработки прерывания, отправки и приема пакетов. Теперь можно отправлять данные извне прерывания. Показал оба способа, выбираются дефайном.
Исходник _v4 Ссылка

upd. Windows 10 полет нормальный.

Отредактировано sobs (2017-04-28 17:48:14)

53

sobs
По поводу того, что ты в своих сорцах костылём называешь
Можно не заморачиваться типом массива данных, пусть аргумент ф-ции uint_16*, а в программе union этого массива и любой структуры
И можно будет любые структуры, а не только массивы байтов или слов пересылать
Имхо, usb и-фейс в stm32 больше похож на параллельную шину шириной 512 бит (64x8), чем на последовательный и-фейс )

54

vt340 согласен)
Теперь в планах разобраться с HID, CDC и MassStorage. Больше всего HID интерисует, так как не нужны драйвера.

Отредактировано sobs (2017-04-28 21:41:12)

55

sobs написал(а):

Теперь в планах разобраться с HID, CDC и MassStorage. Больше всего HID интерисует, так как не нужны драйвера.

Имхо, в этих классах нет никакого практического смысла, ну разве что для развлечения или из спортивного интереса )

56

Имхо, в этих классах нет никакого практического смысла, ну разве что для развлечения или из спортивного интереса )

Не согласен. Из MassStorage неплохой бутлоадер сделать можно - девайс как флешка определился, скидываешь бинарник и он прошивается. У HID плюс в отсутствии драйверов, настройку девайса через него можно сделать. Ну а CDC позволит работать с девайсом как с обычным COM портом, что тоже во многих случаях удобно. Это мое имхо)

57

Ну, всё что ты перечислил и есть развлечения самого себя
Хотя обычно маскируется рассуждениями об "удобстве" для сферического "пользователя" )

58

И тут мы останемся каждый при своем мнении)

59

sobs
А вот этот лог твой анализатор прямо в таком виде в файл сохраняет?

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 в упрощённо-наглядном виде

60

vt340, не прямо в таком, но похоже. Скинул сюда первые 3 секунды подключения термометра к Windows 7 и KDE Neon 5.9.5. Но как я и говорил, у меня плавает частота, поэтому много Error Packet вместо осмысленных данных (сделал несколько попыток, скинул самые удачные). Надо будет платку новую сделать, добавить кварц.
Программу качай отсюда Ссылка
Файлы Ссылка
В программе Ctrl+O - открыть файл, навигация мышкой, для быстрого поиска в окошке Decoded Protocols в поле поиска введи например SETUP и он покает их все.


Вы здесь » Микроконтроллеры » Архив » USB интерфейс в STM32F103