Jump to content

    

Eddy_Em

Участник
  • Content Count

    1389
  • Joined

  • Last visited

Everything posted by Eddy_Em


  1. Потому что это — полноценный преобразователь USB-serial, а стандартный CDC идет еще и как модем (но мне подсказали, что в дескрипторах писать, чтобы modemd не захватывал устройство, в "семипортовом" я так и сделал; но все равно мне больше нравится /dev/ttyUSBx, чем /dev/ttyACMx ☺). Я "смотрел в книгу и видел фигу": не нашел вообще в стандарте, что должно по interrupt передаваться, поэтому и в реализации CDC я просто игнорирую эту точку (хоть в дескрипторе она и есть — но ведь все равно она IN, так что компьютер по ней ничего не пришлет). Так в том-то и дело, что никто не парится реализацией преобразователей USB-serial, их же как грязи! Другое дело — как в вашем случае, когда можно добавить "виртуальные интерфейсы" для каких-либо целей (типа настройки и управления). Я как-то на коленке сниффер RS-232 делал, вот, как раз такую штуку очень даже удобно будет использовать: Rx одного USART будет слушать Rx, а Rx другого — слушать Tx. Но здесь уже надо будет внутри устройства это дело объединять, чтобы в один CDC всю информацию засылать... Вот это, кстати, — одна из причин, по которой эмулировать PL2303 может быть выгодно: во-первых, нет проблем с VID/PID; во-вторых, "из коробки" работает почти на всех дистрибутивах (ну, в генте или слаке нужно будет модуль ядра собрать, но это — дело пары минут). Можно, конечно, сделать "классический CDC" и использовать какие-нибудь незанятые VID/PID, но где гарантия, что через N лет их не займут? И в этом случае получится конфликт: udev создаст на чужую железку в вашей системе симлинк на /dev/ttyACMx, но фактически это будет какая-нибудь 3D-видеокамера…
  2. В моих поделках CDC используются исключительно для общения МК с компьютером. Я не делаю физических преобразователей с 232/485 на USB. В общем, мне и уведомления никакие не нужны. Кстати, при разработке эмулятора PL2303 я, чтобы не реверсить китайские подделки, взял всю необходимую информацию из модуля ядра. Понятно, что его делали по реверсу (иначе там бы не было комментариев вроде "ХЗ, зачем это нужно, но без этого не работает). Но вот конечная точка Interrupt там используется только номинально! Во многих других CDC она вообще не используется…
  3. Я уже в подобном споре участвовал. И прикола ради написал СЕМЬ CDC на одном STM32F103 (понятно, что без аппаратного коннекта с UART)!!! И протестировал их работу. Все ОК.
  4. В порядке бреда (а точней - ради разрешения спора) сделал 7 USB-CDC на одном STM32F103. Понятно, что из-за его малюсенького буфера USB, пришлось сильно ограничить буферы CDC. Но оно работало в простых тестах. Другое дело - что не нужно обычно так много. Вот два CDC на одном МК вполне можно запилить: скажем, один для коммуникации с МК, второй — для каких-либо настроек или отладки. Вот, кстати, подумал, что в моем переходничке CAN-USB можно было бы именно так разделить собственно работу с шиной и команды (при обильном потоке данных приходится набирать команды вслепую - по крайней мере, команду паузы).
  5. Какие именно? Я вот несколько раз брал на али по десятку STM32F103CBT6 и STM32F072CBT6. Первые - около 9 баксов за десяток, вторые - 10. 20-ногие F030 вообще урвал как-то по тридцатке, когда доллар был еще 70. Что до "али - это ж помойка", у меня есть небольшой самодельный стендик, на котором без пайки я могу проверить МК. Сразу же из партии беру несколько штук и проверяю. Пока что на брак ни разу не нарывался. Разве что покупал я эти МК обычно с маркировкой "C8", а приходили — "CB" (т.е. на них тоже написано 8, но флеша в реальности 128кБ, а не 64).
  6. У старых "малин" была же проблема: ethernet сидит на USB, поэтому при интенсивном обмене с какой-нибудь железякой по USB подвисает сеть. И наоборот. В общем, может - это ваш случай?
  7. Никто не мешает вам написать для него модуль ядра: udev при подключении создаст /dev/i2c, а модуль ядра будет обрабатывать запросы. Но на мой взгляд, проще таки CDC сделать и в юзерспейсе работать.
  8. С чего же "ужос", если он 25 рублей стоит? Или у вас на примете есть STM32 с USB за 25 рублей? Вот у меня, например, реально есть куча задач, где нужен дешевый маленький микроконтроллер с USB и несколькими ногами. А здесь есть аппаратный ШИМ, поддержка сенсорных кнопок… В общем, как соберусь с духом, перепишу прошивалку с питона на кошерный С и буду осваивать ch55x.
  9. Вот картинка. Жаль, конечно, что ST так сделали, что считать внешние импульсы или обрабатывать энкодер можно лишь на каналах 1 и 2… А еще всякие TIM14 и т.д. не умеют считать! В вышеприведенной железяке сам на это напоролся, разведя плату так, чтобы частоту вращения второго кулера считать первым каналом TIM14, пришлось делать это на EXTI.
  10. Вот здесь у меня STM32F072 считает импульсы от вентилятора первым каналом таймера 3. Так настраиваю: RCC->APB1ENR |= RCC_APB1ENR_TIM3EN; TIM3->SMCR = TIM_SMCR_TS_2 | TIM_SMCR_TS_0 | TIM_SMCR_SMS; // TS=101, SMS=111 - external trigger on input1 TIM3->CCMR1 = TIM_CCMR1_CC1S_0; // CC1 is input mapped on channel TI1 TIM3->CR1 = TIM_CR1_CE Так считаю: void sys_tick_handler(void){ static uint32_t actr = 0; ++Tms; if(++actr == 1000){ // RPM counter Coolerspeed[0] = TIM3->CNT/2; TIM3->CNT = 0; actr = 0; } }
  11. Я вчера вечером ковырялся с ch552g. Нашел на гитхабе несколько примеров (правда, писанных в "макаронном стиле", но работающих). Среди них был посредник I2C<>USB, представляющийся как раз CDC-ACM устройством. Его не проверял, но их реализацию CDC-ACM проверил: работает. В принципе, если не нужно это переделывать, то можно такой "макаронный" код и оставить без переделки. Я же хочу сначала все в порядок привести, чтобы глаза не вытекали, когда на это смотришь. Так что, подумайте насчет того, чтобы взять на али с пяток-десяток ch552g (вчера брал десяток: 225р отдал вместе с пересылкой), заказать на JLCPCB платы и наваять свой адаптер. А при необходимости и протокол можно будет под себя переделать (там достаточно сыро все: частота только 100 кГц и посылки по 16 бит).
  12. Классная штука, наверняка детям интересно будет. А еще можно на двух фотоэлементах и дискретной рассыпухе сделать простенькую тележку-робота, которая будет по контрастной полосе ехать (белой на черном фоне или черной на белом). Заодно дети поймут принцип работы фоторезистора и операционного усилителя. Можно пошукать по старым подборкам журналов "радио", "юный техник" и "моделист-конструктор" подобные несложные электрические игрушки. Еще рекомендую почитать подборку из разряда "555 схем на 555". На этом генераторе можно много интересных штук сделать: скажем, если резистором изменять заполнение ШИМ, можно эдакий сельсин на сервомоторчике собрать; а если резистором менять частоту меандра — управлялку шаговым двигателем (на каком-нибудь недорогом модуле с алиэкспресса, вроде DRV8825). Добавляем сдвиговый регистр - получаем "бегущий огонь" на линейке светодиодов. Тем же способом можно автоматический светофор сделать (когда я был маленький, мне приходилось делать из жести контактор, сажать его на вал двигателя и таким образом "автоматизировать" переключение лампочек игрушечного светофора; а сейчас все так просто). Дальше с игрушками: берем на алиэкспрессе радиоуправляемый блок релюшек, встраиваем его в готовую игрушку без радиоуправления (машинку, танк и т.п.) и получаем возможность дистанционно ее гонять. В общем, без программирования легко увлечь детей радиоэлектроникой. И ну ее нафиг, эту ардуину: тупая копипаста "скетчей" ничего хорошего не даст, дети таким образом не поймут принцип работы того, что "сделали"!
  13. А ведь за 3 дня можно было взять любую девборду с совершенно любым МК (лишь бы там были I2C и USB), да написать преобразователь самостоятельно. Заодно не пришлось бы изучать чужие даташиты на протокол: какой придумаешь сам, такой и будет!
  14. Если что, самый легкий язык - ассемблер. На втором месте — С. Чуть сложней С — бейсик, далее идет паскаль. После паскаля — фортран. Думаю, за фортраном можно javascript поместить. С++ уже, наверное, позиций через 10 после жабоскрипта (до него идут D и некоторые другие не популярные ЯП, вроде брейнфака). Еще позиций через 10 после С++ (в этом промежутке: C#, rust, go и т.п.) идет python. Ну и как назвать питон легким языком? А если детям захочется архитектуру операционных систем изучать, можно им дать код линукса 0.1 — там совсем немного, зато познавательно. А потом можно что-нибудь посложней — вроде RTOS — почитать.
  15. Удобней всего начинать с бейсика или паскаля. Они, конечно, сложней, чем С, но почему-то для обучения вполне прокатывают. А дальше - естественно, С! Можно фортран, но он уже сильно отстал, да и большинство математических библиотек уже с фортрана на С переписали. Как раз-таки с библиотеками у С проблем нет! Практически все библиотеки пишутся под С или С++. А вот под какой-нибудь паскаль нужную библиотеку еще подыскать надо! Каким боком это к программированию? Я уж молчу о том, что знакомство с компьютером дети должны начинать исключительно в консоли. Никаких иксов. И уж тем паче, никаких форточек!!! А уж если осилят в линуксе работать, то можно и форточки показать. Сто процентов уверен: они после линукса поржут, покрутят пальцем у виска и спросят: "папа, а как в этом болоте вообще можно работать?".
  16. Да нет в линуксе никакой проблемы с STM8! Я уже давно с ним ковырялся. Да, заголовочный файл пришлось фактически самому писать, но это несложно: не STM32 же! Вот - мои поделки на STM8 на гитхабе. Но больше мне STM32 нравится.
  17. Таки сделал: вот оно. Правда, USB буфер у F103 вообще малюсенький: всего лишь 512Б, из которых 64 уже занято данными конечных точек. Так что, пришлось уменьшить буферы rx/tx каждого канала до 16 байт. Еще одна проблема: когда так много устройств, по прерываниям на EP0 вроде SET_CONTROL_LINE_STATE невозможно определить, какие из каналов подключены. Поэтому приходится постоянно писать во все (но зато можно флаг ошибки выставлять, если канал не подключен; но это не гарантирует, что подключение не состоялось), как вариант, можно в начале послать во все каналы данные, а потом отслеживать в rxtx, когда данные дойдут до адресата (и в этом случае выставлять флаг подключения). Вот такая совершенно бесполезная фиговина получилась. На андроиде лень ставить специальное ПО (у меня обычный терминал стоит, но он работает лишь с известными устройствами, а городить эмуляцию семи PL2303 мне откровенно лень). Как его видит lsusb:
  18. Я смотрел исходники на CDC модули ядра. Там INTERRUPT точка вообще никак не используется! А раз не используется, то и незачем в МК ее мучить. Ее имеет смысл городить лишь если сам собираешься модуль писать для своей железки. Но тогда возникает вопрос: зачем ее делать как "расширенный CDC"?
  19. ОК, поковыряю эту поделку, доведу до ума (чтобы все 7 "портов" работали) и поищу где-нибудь компьютер с форточками. Правда, я в них вообще не разбираюсь, надо будет молодого инженера просить помочь.
  20. В вашем случае можно сделать 5 CDC на одном МК (если под "пользовательскими" — имеются в виду точки с номерами 1..5). INTERRUPT IN действительно должен быть в дескрипторах (иначе компьютер устройство "не опознает"), но физически он не нужен (т.к. не используется), поэтому просто назначаем для этих дел виртуальные конечные точки с номерами 8..15. Вообще, странно, что в ПК всего лишь 16 конечных точек, хотя по особенностям нумерации вполне можно было бы и 128 поддерживать.
  21. STM32F103. По аналогии можно будет легко на F0x2 перенести. Вчера заработали первые 2 из семи "портов", ночью что-то не очень программируется...
  22. Ух, намудрил: [34497.115652] usb 7-1: new full-speed USB device number 90 using uhci_hcd [34497.257700] usb 7-1: not running at top speed; connect to a high speed hub [34497.290698] usb 7-1: New USB device found, idVendor=0483, idProduct=5740, bcdDevice= 2.00 [34497.290701] usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [34497.290702] usb 7-1: Product: USB-Serial Controller [34497.290703] usb 7-1: Manufacturer: Eddy @ SAO RAS [34497.290704] usb 7-1: SerialNumber: 000001 [34497.293752] cdc_acm 7-1:1.0: ttyACM0: USB ACM device [34497.295880] cdc_acm 7-1:1.2: ttyACM1: USB ACM device [34497.296796] cdc_acm 7-1:1.4: ttyACM2: USB ACM device [34497.297788] cdc_acm 7-1:1.6: ttyACM3: USB ACM device [34497.298847] cdc_acm 7-1:1.8: ttyACM4: USB ACM device [34497.299849] cdc_acm 7-1:1.10: ttyACM5: USB ACM device [34497.300835] cdc_acm 7-1:1.12: ttyACM6: USB ACM device Не знаю, зачем это, но вот еще переделаю функции чтения/записи и обработчики (чтобы по массиву работали), и будет непонятно зачем сделанный композит из семи CDC ACM ☺
  23. Со слиянием обработчиков прерываний все оказалось просто: при передаче данных хосту я не оставлял валидным Rx, а сбрасывал. Надо так: static void rxtx_Handler(){ uint16_t epstatus = KEEP_DTOG(USB->EPnR[3]); if(RX_FLAG(epstatus)){ rxNE = 1; epstatus = (epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_RX)) ^ USB_EPnR_STAT_RX; // keep stat Tx & set valid RX, clear CTR Rx }else{ tx_succesfull = 1; epstatus = (epstatus & ~(USB_EPnR_STAT_TX|USB_EPnR_CTR_TX)) ^ USB_EPnR_STAT_RX; // keep stat RxTx, clear CTR Tx } USB->EPnR[3] = epstatus; } Теперь работает и можно "причесывать".
  24. Спасибо! Действительно, это все исправило. Что до модемманагера, у меня его нет: gentoo все-таки, здесь мусор не держат. Но вот во всяких дебианах/шапках с этим проблема, отчасти из-за этого я изначально и стал лепить эмуляцию PL2303, а не реализовывать простой CDC-ACM. Завтра почитаю, где у меня проблема с совмещением конечных точек.