Comments 37
как бы рассмотреть проект, РАБОЧИЙ девайс для СКОРОСТНОГО обмена по USB(USB3), так сказать на максималках…
лучше с использованием HAL…
В некоторое время назад, пробовал реализовать такой обмен, но по замерам скорости, результат был исключительно плачевным…
причем и помощь «вселенского» разума не помогла, все сошлись что дескрипторы верные… НО...((((, кристаллы пробовал F1,F4,F7+USB3 модуль навесной…
в общем не вышел каменный цветок у Данилы…
РАБОЧИЙ девайс для СКОРОСТНОГО обмена по USB(USB3), так сказать на максималках…У контроллера едва на 12 Мб/с скорости хватает, а вы гигабиты хотите. Да и типичная память — SD-карта — может не потянуть. Вон в той статье автор уперся не столько в USB, сколько в карту.
MSD на контроллерах имеет смысл скорее для другого — представлять произвольные данные в виде файлов на лету. С этим тоже, конечно, хочется повозиться, но придется долго файловые системы копать.
лучше с использованием HAL…Однозначно нет.
Ну а именно в случае MSD добавляется предписанное стандартом ограничение пропускной способности (вроде как там какой-то процент канала резервируется на прерывания и контролы). Так что да, больше 800 — 900 кБ/с вряд ли возможно выжать даже теоретически.
Не постесняюсь процитировать свою же статью:
В любом случае, делать полноценную флешку на контроллере общего назначения не самая удачная идея
Здесь можно выехать на нестандартных задачах вроде переходника для чтения с перфокарт, ЦМД-памяти и прочей дичи, для которой готовых железяк просто нет. Ну и эмуляция какого-нибудь fat12 — fat64 чтобы отображать на файлы какие-то другие параметры. Ну не знаю, настройки там.
Здесь можно выехать на нестандартных задачах вроде переходникУ меня спросили простой логгер на 8-10 каналов ADC 16КSPS с поключением к PC подешевле. Так вот я и накидал товарищу код на STM32F103C8T6 (Blue pill) за день. Со стороны PC тоже.
увы, нет. Размер файликов будет ограничен файловой системой. То есть данные вы будете снимать хоть до бесконечности, но рано или поздно закончатся свободные кластеры того же fat'а. А обновлять в реальном времени ОС может и не захотеть — это же флешка.
Тут лучше CDC как предлагает Sdima1357, либо, как делал я, HID (но у меня измерения "по запросу" и редкие), либо вообще изобразить аудиоустройство или что-то подобное.
Вот только эмулировать модобное железом уже странно. Как минимум, некоторые системы могут… удивиться… трем десяткам накопителей, на которых не хватит букв латинского алфавита.
1 Бесплатный Manufacturer::product ID
2 Простой и гибкий USER SPACE interface. Типовые демоны не стремятся его подергать
Короче кончилось тем, что секретарша послала на этот параллельный порт, по ошибке, печатать документ. Вообщем все отлично напечаталось бетоном на машинках. Так что не стоит приспосабливать выход на не предназначенные для этого порты.
void HAL_ADC_ConvHalfCpltCallback(ADC_HandleTypeDef* hadc)
{
if(speedReady>115200)
{
CDC_Transmit_FS(&ADC_BUFF[0],HSAMPLES/2*sizeof(ADC_BUFF[0]));
}
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
if(speedReady>115200)
{
CDC_Transmit_FS(&ADC_BUFF[HSAMPLES/2],HSAMPLES/2*sizeof(ADC_BUFF[0]));
}
}
Там товарищу не важно потерять часть данных. Да и код накидал просто для примера. Можно добавить коррекцию ошибок или ретрансмит.
а почему бы и нет? надо данные — открыл файл и читай.
там единственные грабли это заставить винды каждый раз при новом обращении не из кэша данные брать, а с "флэшки".
ну вот если бы не костыли с файловым кэшем в виндах, то с масстораджем никаких протоколов со стороны ПК не надо вообще, хоть каким-угодно матлабом/математикой/гнуплотом сразу файл открывай да смотри данные.
да хоть по сети шарь, cdc да и usb вообще тоже конечно можно, но не без плясок с бубном.
Может быть проблема если данные будут нужны разным софтинам. Ну там канал 0 заберет себе, скажем, датчик температуры, а канал 1 уже программа логирования чего-то там. Но тут аппаратные решения вряд ли помогут, проще написать драйвер и уже он пусть отображает хоть на файлы, хоть на память.
мешает виндовс у пользователей железки.
ну и какой-то протокол городить всё равно придётся.
да, именно так и сделано, некая измерительная железка которая время от времени около килобайта данных за раз отдаёт по нажатию пользователем кнопки, CDC, скрипт на lua обработки/сохранения и gnuplot для отображения.
но тут граждане учОные какой только дичью не пользуются вроде origin, igor, labview,… так вот выдать им тупо "флэшку" с которой надо только файл с данными открыть было бы куда проще, чем делать всякие разные обёртки для каждого случая.
cat /dev/ttyACM0 | feedgnuplot --lines --domain --stream
драйвера писать совсем не хочется.
речь была про виндовс.
gnuplot конечно здорово, а теперь давайте это будет, например, вольфрамовская математика, где можно было бы сделать
data=Import["F:\data.txt"]
без вызова всяких дополнительных обёрток которые данные заберут из CDC и положат в файл.
и такая "эмуляция" MSD будет на самом деле работать кроссплатформенно, хоть в OS/2 без дополнительных плясок с бубном.
То есть если нам нужно взаимодействие с прибором, представление его в виде замороженного слепка на файловой системе не годится. Нужно ему какие-то параметры задавать (это как раз через MSD возможно) и читать (а вот это уже нет).
Иначе говоря, данные с прибора это обычно поток. Реже состояние и совсем редко событие. Первое неплохо отображается на CDC или аудио, второе и третье — на HID. На MSD не ложится ничего.
Зато с сокетами все дружат, а сетевую карту реализуют CDC ECM / EEM / NCM без доп. драйверов. Соответственно, все абстракции сетевые доступны.
ну не то что бы совсем не позволяют, есть костыли которыми с кэшами ФС в виндах вроде побороться можно.
https://www.uwe-sieber.de/ntcacheset_e.html
и "поток", и уж тем более "состояние" можно было бы и из "файла" с MSD забирать с отключенным кэшем. да и события поллить можно.
так что на MSD оно вполне ложится: параметры поправил прямо в конфиг файле на "устройстве",
созданием/удалением всяких lock файлов (с обоих сторон) можно всякими небыстрыми процессами управлять, а если прибор быстрый, то просто по получению SCSI_READ можно всё что надо померить и данные сразу же отдать.
да, со стороны железки немного коряво выглядит, зато со стороны ПК вообще ничего не надо: "проводником" виндовс последовательный порт не откроешь, наследие ДОСа в виде copy //./COM1 ххх, в обе стороны одновременно плохо работает.
а вот файл открыть чем угодно можно не написав ни строчки кода для этого.
ну и если не MSD, следующий "шаг" это поднять "сетевую карту" через USB и там уже через http/nfs/samba/… отдавать данные.
ну не то что бы совсем не позволяют, есть костыли которыми с кэшами ФС в виндах вроде побороться можно.Насколько код такого отключения окажется больше простой работы с COM-портами? Что-то мне подсказывает, что оно того не стоит. Плюс вспоминаем ограничение на количество букв дисков и любовь винды иногда привязку устройства к букве терять. Если для человека это просто неприятно, то для автоматики смертельно.
Так что у Вас вполне нормальный результат.Напомнили вы мне первые опыты с этим протоколом. Уже не помню где именно я накосячил, но скорость составляла что-то около 1 кБ/с. Кажется, какой-то запрос криво обрабатывался, так что операционка поминутно пыталась «флешку» ребутнуть и дочитать наконец память. На тот момент меня даже это радовало, мол «я наконец-то научился изображать слоупочную флешку, не сохраняющую данные при отключении, классно!». Даже прикидывал сколько дней через нее будет записываться 4-гигабайтная SD-карта. Результат почему-то не вдохновлял :)
USB3 — это в основном удел cortex-a многоядерных. STM32 даже от потока USB high-speed поперхнётся при обработке. Он только копировать куда -то данные успеет с такой скоростью. А так, есть же cyusb3014 и ft600, вот, пожалуй, и всё почти.
в сети много «многомудрых героев», бъющих себя пяткой в грудь, в том, что немерянное количество мегабайт пропихивают через USB… но НИ ОДНОГО реального теста нетути…
дабы было чтобы пощупать, подумать… Вобщем закинуто было в долгий ящик, НО возможно, это кому то нужно прямо сейчас…
ЗЫ…
либо барыги сплошные… бабок хотят…
А чем вас девборды и примеры от производителей не устраивают? На тот же fx3 есть и исходник тестовой прошивки, и исходник утилиты для компа. Вчера запускал — 300 с копейками мегабайт в секунду на fx3, 43 мегабайта в секунду на fx2lp.
а будь добр, имя проектов озвучь..., а то ноут сдох, на нем все болталось…
что то у меня опять интерес возник обкатать попробовать…
USB на регистрах: bulk endpoint на примере Mass Storage