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

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

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


Вы здесь » Микроконтроллеры » STM32 » Вопросы » USB CDC для STM32F103


USB CDC для STM32F103

Сообщений 61 страница 90 из 94

61

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

RA, у меня уже давно была мысль, что самым удобным в некоторых случаях была бы псевдофайловая система. Т.е. МК должен эмулировать флешку. Только для этого мне нужно где-то достать рабочий код для поддержки ext2 или ext3, иначе самому копаться и все это делать — я так и за 10 лет не успею! Vfat сразу отметается как ущербный и как доступный "из коробки" в приставках, мне этого не нужно.

в определенное место на флеше мк(если не влезает то внешнею память) записать тупо бинарник, залочить от записи. и через любую терминалку по определенному коду выгрузить на пк, преобразовать в драйвер, и уже через него общаться с девайсом. а что именно это будет хид, ком и т.д., уже не важно. или не?

62

RA, ну чепуху же несешь! Скажем, объем кода модуля ядра будет 16КБ (и то, это мало), тебе придется столько флеша под него выделить. А потом вдруг выясняется, что у клиента ядро не а.б.в., а а.г.е, и нихрена твой модуль не собирается!
Единственный разумный вариант, не вызывающий геморроя на пустом месте, - эмулировать существующее и хорошо поддерживаемое устройство. Ну или выдумывать свое устройство и поддерживать его со всех сторон самостоятельно (вообще, для USB-устройств отдельный модуль ядра лепить необязательно: можно в юзерспейсе при помощи libusb все забульбенить).

63

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

вообще, для USB-устройств отдельный модуль ядра лепить необязательно: можно в юзерспейсе при помощи libusb все забульбенить

О! Голос разума )
Если вдруг будет топик про юсб в юзерспейсе, всяко поддержу и даже может спец терминал для приставки сделаю

64

Не, топика про USB  в юзерспейсе от меня не жди: у меня нет необходимости гонять по USB данные со скоростью в 50Мбит в секунду!
Для моих задач CDC за глаза. Разве что, как я упоминал, эмулятор флехи бы сделать еще..

65

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

Не, топика про USB  в юзерспейсе от меня не жди: у меня нет необходимости гонять по USB данные со скоростью в 50Мбит в секунду!

А CDC разве медленный? У меня на комп передает со скоростью 820КБ/c, это довольно близко к максимальной пропускной способности.

66

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

Ссылка на проект (может кто попробует или просто глянуть)
https://github.com/saewave/STM32F103-USB-CDC-CMSIS

Пробую. Не собирается: огромное количество ошибок.
Что у тебя за компилятор, в котором такие вольности как

Код:
volatile uint32_t     USBEP[EPCOUNT] __attribute__((at(USB_BASE)));

позволены?
Пытаюсь это переделать под gcc 7.3.0

67

Черт, там еще и malloc!
Ох, задолбаюсь я этот код переделывать в рабочий вид... Проще, наверное, будет готовый с F0 портировать!

68

Переделал под статические буферы. Скомпилялось. Не взлетело.
Странно, что нет инициализации ног USB, надо почитать мануалы. Пока что устройство даже енумерацию не проходит.

69

Если не ошибаюсь у вас видел проект одновременно CAN и USB. Если не прав удалю свое сообщение.
Для 103

http://s5.uploads.ru/t/IKQce.png

70

CERGEI, я в курсе, что одновременно CAN и USB под STM32F103 работать не могут. Поэтому в том проекте использовал STM32F042.
Здесь же мне нужно только USB завести.
И вот что странно: прерывания разрешаю, USB тактирую, однако, прерывание не отрабатывает! Похоже, что-то где-то не так сделал. На гитхаб пока не заливал этот код: не работает ничего. В общем, нужно скрупулезно подходить к этой проблеме. Я на прикручивание CDC к STM32F042 потратил больше недели. Эх, быстро меня из больницы выписали, если б там еще недельку проторчал, наверняка бы прикрутил USB к 103. А так придется выдумывать, когда свободное время для этого найти...

71

Добил эмулятор PL2303 на STM32F042. Работает и на компьютерах, и на приставках.

72

смысл от от серии f0 , когда f103 и выше не так дороги сейчас...

73

У F0: а) более приличная периферия (те же GPIO), б) тоньше RM и errata, в) STM32F030 вообще по цене уже к STM8 приближаются...
Насчет STM32F103 — я вот недельку с этим говном поработал, что-то вообще не хочется им пользоваться! Все через задницу.. Но все-таки ради спортивного интереса я CDC на нем тоже добью. А потом буду искать аналог (вроде 303) по сходной цене. Или попробую с GD103 поработать — китайцы вряд ли все худшее из 103 туда запихнули...

74

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

смысл от от серии f0 , когда f103 и выше не так дороги сейчас...

мне STM32F072 нравится больше чем F103.  возможностей больше. 
использую 103 потому что купил их в свое время 50 штук. не выбрасывать же...  (072 купил только 20 :) )

75

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

А потом буду искать аналог (вроде 303) по сходной цене.

Сколько ты за последние годы реализовал проектов на F1 учитывая, что основной камень - F0? Если бы вместо F1 там использовался в 2 раза более дорогой F3, то в год хотя бы доллар переплата получается?

76

Reflector, это  точно ☺
На F103 у меня только была система управления спектрографом (лет 5 назад делал) и хронометр для велосоревнований (делал года 4 назад)... Сейчас как-то в основном хватает F0 и STM8 (движки покрутить много мощей не нужно).
Даже не знаю уже, нужно ли мне что-то мощней F0... Все равно из "долгого ящика" я вряд ли выну такие проекты, как свой квадрокоптер, ЧПУшный станок или "дофигометр" (не говоря уже про ЭБУ — оно не только уйму времени на разработку требует, но и еще большей уймы полевых испытаний + подопытную машину, которую не жалко).

77

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

Даже не знаю уже, нужно ли мне что-то мощней F0... Все равно из "долгого ящика" я вряд ли выну такие проекты, как свой квадрокоптер, ЧПУшный станок или "дофигометр"

Иногда может потребоваться что-то и помощнее, но особого смысла экономить пару копеек раз в несколько лет я не вижу, для домашних поделок проще вместо F103 брать F303 у которого, помимо прочих преимуществ, периферия практически как у F0.

78

Сейчас сидел и экспериментировал с большими скоростями. Фигня какая-то получается: вроде как хост должен каждую миллисекунду отправлять запрос устройству, т.е. без ухищрений с буфером в 64 байта никак больше 512кбод не получить. Однако, соединяю pl2303 и ch340 перекрестно, настраиваю оба на 3Мбод, пихаю в один ~15кБ данных "за один присест" и получаю эти данные со второго! wireshark показывает, что последовательные запросы идут с интервалом в 10-20мкс!!!
Что ж за япона мать?
Ну и с конечной точкой прерывания: почему-то от нее вообще очень редко что-то приходит. Зачем же она тогда нужна для CDC, если обмен данными прекрасно идет и без нее???

79

Вот же черт подери!
Если я хочу "за один присест" передать на МК больше 64Б данных, получается полная лажа! Приходящие данные складываю в буфер 256 байт длиной, а в основном цикле проверяю: если какие-то данные в буфере есть, считываю их:

Код:
int USB_receive(char *buf, int bufsize){
    if(!bufsize || !idatalen) return 0;
    uint16_t epstatus = USB->EPnR[2];
    USB->EPnR[2] = SET_STALL_RX(epstatus);
    USB->CNTR = 0;
    int sz = (idatalen > bufsize) ? bufsize : idatalen, rest = idatalen - sz;
    memcpy(buf, incoming_data, sz);
    if(rest > 0){
        memmove(incoming_data, &incoming_data[sz], rest);
        idatalen = rest;
    }else idatalen = 0;
    USB->CNTR = USB_CNTR_RESETM | USB_CNTR_CTRM;
    usb_isr();
    epstatus = USB->EPnR[2];
    USB->EPnR[2] = SET_VALID_RX(epstatus);
    return sz;
}

В начале пробовал установить NAK_RX - та же проблема: все, что дальше 64 байт тупо теряется. Т.е. пока я в этой функции копирую уже принятые предыдущие 64 байта, новые идут нафиг. Если с компьютера повторить отправку совершенно тех же данных, то "добьется" недостающее. Но если отправить другой буфер, ничего не пройдет.

Чертовщина какая-то! Как же правильно успевать обрабатывать-то эти данные?

80

Я тебя предупреждал, но ты предпочитаешь пробовать прочность граблей cdc своим лбом )
И это ты ещё не попадал на грабли виртуальных компортов в виндовс [да и в линуксе я предполагаю тоже не попадал]

MS тоже ненавязчиво предупреждает о всех виндовс до 10 )
In Windows 10, the driver has been rewritten by using the Kernel-Mode Driver Framework that improves the overall stability of the driver.
* Improved PnP and power management by the driver (such as, handling surprise removal).
* Added power management features such as USB Selective Suspend.

Отредактировано vt (2018-11-11 16:12:51)

81

Нормуль, "методом Монте-Карло" починил. Осталось еще немножко: реализовать отправку буфера больше чем 64 байта (это несложно) и причесать все.
В мастдайке оно частично (для мелких буферов) работает. Если полноценно не будет работать в мастдайке - не велика потеря, я с игровыми приставками не работаю.

82

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

Пробую. Не собирается: огромное количество ошибок.
Что у тебя за компилятор, в котором такие вольности как

позволены?
Пытаюсь это переделать под gcc 7.3.0

На приставке ж пишу в кейле :)
Разобрался?

ЗЫ: Я ж сюда редко захаживаю, если че, пиши в гитхабе или на изяэлектрониксе :)
ЗЫ2: Как тут включить уведомление на мыло о новых коментах в теме?

83

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

Черт, там еще и malloc!
Ох, задолбаюсь я этот код переделывать в рабочий вид... Проще, наверное, будет готовый с F0 портировать!

Все там работает и стабильно, но рефакторинг нужен, да :)
Девайс ушел в мелкую партию на 100+ шт. Не было ни единого разрыва, так что проверено жизнью :) Но из-за главного правила программера - работает не трожь, все никак не дойдут руки поламать отрефакторить ))

84

alexsam, а ты свой код проверял на передачу большого количества данных? Скажем, если на скорости b3000000 вольют пару килобайт? Или наоборот - отправить пару килобайт... Я долго мудрил со всеми этими NAK'ами, пока не сделал нормально прием.

85

Так чтоб одним потоком непрерывным - нет, но через него льются прошивки в МК - заливаю Intell HEX построчно, интервал между строками - время записи во флеш. Пока задачи не было протестить на скорость. Хотя надо конечно, но руки все не доходят.

86

Ну, как руки дойдут, буду опять ковырять. Для начала надо понять, почему у меня прерывания от USB не работают. Вполне возможно, что виноват не код, а плата: может, где-то подтяжка "того". Заказал на али парочку мелких девборд на 103, авось, там этой проблемы не будет. Фигово, конечно, что в 103 нет внутренней подтяжки, а на моей девборде никаких транзисторов управления подтяжкой не добавили - только перемычку. Вот я при включенном МК перемычку туда-сюда дергаю, а dmesg ничего не говорит (хотя даже если тупо резистором подтяжку сделать на пустом гнезде, ОСь начинает пытаться обнаружить, что ж там было).

87

Так а что там, нет пинов свободных чтоб резюк припаять и ногами дергать? Я у себя сделал подтяжку прямо на ногу и ничего, все нормально работает. В серию конечно уже через транзистор с обвязом как положенно пошло. А для прототипа самое оно.

З.ы. кстати заработали нотификации в теме, я их когда-то включал, но они почему-то отключились.

Отредактировано alexsam (2018-11-16 12:45:47)

88

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

ЗЫ2: Как тут включить уведомление на мыло о новых коментах в теме?

Внизу справа, и можно даже с полным текстом [это где-то в профиле], но на почту похоже идут только ответы, а не все комменты

89

Пытаюсь запустить код alexsam, есть вопрос.
Адреса и счетчики в PBTABLE описаны как 32 битные - usblib.h

Код:
typedef struct {
    uint16_t Value;
    uint16_t _res;
} USBLIB_PBElement;


Согласно RM0008 (Стр. 627) они должны быть 16 битные.

Each table entry is associated to an endpoint register and it is composed of four 16-bit words


alexsam, почему твой код работает? :)

90

Utuf, читай дальше 23.5.3 Buffer descriptor table
Там по дебильному организовано.
А объявлено так для простоты чтения.

Отредактировано alexsam (2018-12-10 12:19:24)


Вы здесь » Микроконтроллеры » STM32 » Вопросы » USB CDC для STM32F103