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

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

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


Вы здесь » Микроконтроллеры » STM32: USART, I2C, USB » USB full-speed device интерфейс в STM32F1 (L1, F3)


USB full-speed device интерфейс в STM32F1 (L1, F3)

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

61

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

В программе Ctrl+O - открыть файл, навигация мышкой, для быстрого поиска в окошке Decoded Protocols в поле поиска введи например SETUP и он покает их все.

Мне смотреть не надо, мне нужны текстовые файлы после декодирования, вернее не мне, а скриптику )

62

Ок, сейчас сохраню в csv
Лежать будут там же.

Отредактировано sobs (2017-05-01 21:27:15)

63

Забрал, спасибо, выкладывай ещё если будет возможность, будет коллекция примеров для топика про enumeration

64

vt340 добавил WIN XP

65

Как ни странно, но USB в STM32F103 работает и без кварца, от HSI - сегодня развлекался )
Требования для full speed вроде как 0.25%.
Проверил HSI по usb-шным же SOF-пакетам, которые приходят каждую миллисекунду - по дефолту -0.2%
Изменил на единичку HSITRIM в RCC_CR, вроде как это должно соответствовать изменению где-то на 40 КГц, так и есть - стало +0.2%
USB работал и в том, и в другом случае.
Я довёл HSITRIM до 0x18 (половина всей шкалы), получилось где-то +2% - всё работало.
Уменьшил до 8 (полшкалы в обратную сторону), получилось где-то -3% - всё работало.
Поставил 0x1F (максимум)  - получилось где-то +5%, девайс определялся, но данные передавались уже со сбоями.

Update
Проверил ещё три МК - всё то же самое - HSI по дефолту плюс-минус 0.2-0.3% и перестраивается по 0.4-0.5% на единицу изменения HSITRIM.
USB естессно также работает

Отредактировано vt340 (2017-06-13 21:15:58)

66

Тема интересная для меня, сам в своё время встал в тупик перед USB. Сотворил ресурс https://yadi.sk/i/kQfoeUJ8iicDi . В принципе там многое поясняется.
Про энумерацию, необходимо реализовывать как конечный автомат, а не как процедуру. Что касается HID, то есть замена LibUSB и WinUSB. WinUSB имеет
цифровые подписи и работает на последних версиях Windows. Не согласен, что надстройки классов не нужны, нужны и очень, например MSD или CDC.
Новые версии Wireshark хорошо поддерживают USB, на своей Ubuntu 16 пробовал. Сейчас занимаюсь реверс инжинирингом примеров для stm32 ,
библиотеки usb-fs-4.0. Очень ценная инфа про USB в STM, никак не мог понять адресацию буферов конечных точек. Спасибо автору опубликовал ценный
опыт.

67

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

Про энумерацию, необходимо реализовывать как конечный автомат, а не как процедуру.

linuxbergi, так ф-ция USBPoll в моём примере и есть конечный автомат

68

USB->EP0R ^= 0xB0A0;  // rx0:valid tx0:nak
    USB->EP1R ^= 0xB0A0;  // rx1:valid tx1:nak
 

Не могу сообразить, установка буферов конечныхт точек в valid и nak. Насколько я понимаю при x ^ 1 будет происходить переключение x на противоположное значение?
Как ты писал эти биты типа t, при записи 1 сотояние переключается на противоположное, более безопасно проверять состояние и
в зависимости от результата переключать или не переключать? Пустяк, но почему здесь не используешь битовые поля, которые раньше
применяешь?

Отредактировано linuxbergi (2017-07-03 15:18:58)

69

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

Не могу сообразить, установка буферов конечныхт точек в valid и nak. Насколько я понимаю при x ^ 1 будет происходить переключение x на противоположное значение.

Хоть вопрос не мне, отвечу. Все правильно, здесь как раз установка бита:
Пусть бит был равен 0 - 0 ^ 1 = 1, то есть бит изменит свое значение. И наоборот 1 ^ 1 = 0, бит значение не изменит. И с 0 аналогично.

70

И ещё вопрос. Файл stm32f103.h сам писал? Вообще, в частности одобряю создание. В CMSIS почему-то не нашёл описания регистров USB. А битовые флаги есть. Странно. Другое дело что привычка занимает не последнее место в работе программиста. Если человек привык работать с CMSIS, то переучиваться проблемно. Хочу взять для работы часть файла с описанием USB.

71

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

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

    Не могу сообразить, установка буферов конечныхт точек в valid и nak. Насколько я понимаю при x ^ 1 будет происходить переключение x на противоположное значение.

Хоть вопрос не мне, отвечу. Все правильно, здесь как раз установка бита:
Пусть бит был равен 0 - 0 ^ 1 = 1, то есть бит изменит свое значение. И наоборот 1 ^ 1 = 0, бит значение не изменит. И с 0 аналогично.


А 1 в 0 за одну команду?

72

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

1 в 0

Да, вот допустим toggle биты STAT_RX = 00. Переводим в VALID - 00 ^ 11 = 11 - биты переключатся, теперь STAT_RX = 11. Теперь переведем их в STALL - 11 ^ 01 = 10 - старший бит изменит значение, а младший останется, соответственно получится 01. То есть работет эта формула - EPnR ^= {нужные значения t-битов}. Но надо учитывать, что в регистре EPnR не все биты toogle, есть и простые rw и rc_rw0.

73

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

И ещё вопрос. Файл stm32f103.h сам писал? Вообще, в частности одобряю создание. В CMSIS почему-то не нашёл описания регистров USB. А битовые флаги есть. Странно. Другое дело что привычка занимает не последнее место в работе программиста. Если человек привык работать с CMSIS, то переучиваться проблемно. Хочу взять для работы часть файла с описанием USB.

Для 103 писал не я, а vt340, я для F0 писал.

74

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

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

    1 в 0

Да, вот допустим toggle биты STAT_RX = 00. Переводим в VALID - 00 ^ 11 = 11 - биты переключатся, теперь STAT_RX = 11. Теперь переведем их в STALL - 11 ^ 01 = 10 - старший бит изменит значение, а младший останется, соответственно получится 01. То есть работет эта формула - EPnR ^= {нужные значения t-битов}. Но надо учитывать, что в регистре EPnR не все биты toogle, есть и простые rw и rc_rw0.


Извиняюсь, нарисовал табличку, действительно, при записи единиц, сбрасывается в 1 , при записи 0 сбрасывается в 0. Дело в том, что USB-FS-Lib, для установки конечных точек используется целый огород, поэтому мне и показалось сомнительным. Ну спасибо разъяснил.

75

Работаю над BluePill , хочу создать полноценный self powered. Удалил регулятор, VBUS -> 5V и резистор R10 подключенный к D+. Вместо него подключил внешний резистор на один из пинов. Внёс некоторые изменния в дескриптор и пока работаю над примером из USB-FS-LIB , пока делаю обработчики стандартных запросов , конечно задействую и пример с форума, оцень ценная инфа. Хотя есть и замечания, лестничные if else трудны для восприятия, слишком аскетичный проект. Трудно читается, хотя это субъективно.

76

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

И ещё вопрос. Файл stm32f103.h сам писал?

Нет, это сгенерированный файл, там в начале файла подписано чем и из чего, генератор же сам и подписал

77

Заполнил пробел, из SVD файла сгенерирован. Спасибо за наводку.

78

Вопрос к vt340.Хочу доработать проект по USB, который ты выложил на форуме, добавить состояния attached и powered . Прибор self powered, при подключении к USB, обнаруживает VBUS, при отключении соответственно деактивирует. Не возражаешь?

Отредактировано linuxbergi (2017-07-04 18:51:46)

79

Можешь делать всё, что хочешь, покажусь занудой, но опять же там подписано в файле - public domain )
Только просьба  - заведи новый топик, если захочешь тут результаты обсудить
Этот топик не про софт для usb, а про и-фейс, про железо, по-хорошему его уже надо было бы располовинить где-то с третьей страницы
А мой пример на самом деле не проект, а просто иллюстрация как устроен usb и-фейс, скелет такой, без мяса и кожи )

80

vt340, libusb к TCL можно прикрутить?

81

Да, конечно
Тикль может вызывать ф-ции из любой сторонней dll - http://elf.org/ffidl

Для ф-ций из libusb тикль сначала создаёт новые команды:

Код:
package require Ffidl
ffidl::callout usb_init int int [
    ffidl::symbol libusb-1.0.dll libusb_init]
ffidl::callout usb_open {pointer uint16 uint16} pointer [
    ffidl::symbol libusb-1.0.dll libusb_open_device_with_vid_pid]
ffidl::callout usb_claim {pointer int} int [
    ffidl::symbol libusb-1.0.dll libusb_claim_interface]
ffidl::callout usb_bulk {pointer uint8 pointer-var int pointer-var int} int [
    ffidl::symbol libusb-1.0.dll libusb_bulk_transfer]
ffidl::callout usb_release {pointer int} int [
    ffidl::symbol libusb-1.0.dll libusb_release_interface]
ffidl::callout usb_close {pointer} void [
    ffidl::symbol libusb-1.0.dll libusb_close]
ffidl::callout usb_exit int void [
    ffidl::symbol libusb-1.0.dll libusb_exit]


И потом ими можно пользоваться:

Код:
set VID 0x4444
set PID 1
set IEP 0x81
set OEP 1
set inum [binary format s 0]
set onum [binary format s 0]
set ibuf [binary format a64 0]

usb_init 0
set devh [usb_open 0 $VID $PID]
usb_claim $devh 0

foreach s {a b c d e f g h i j k l m n o p q r s t u v w x y z} {
    set obuf [binary format a64 $s$s$s]
    usb_bulk $devh $OEP obuf 64 onum 100
    usb_bulk $devh $IEP ibuf 64 inum 100
    binary scan $ibuf a64 b
    puts "$s$s$s $b"
}
usb_release $devh 0
usb_close $devh
usb_exit 0

82

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

Да, конечно
Тикль может вызывать ф-ции из любой сторонней dll - http://elf.org/ffidl

Отлично. А то я уже TinyC к Notepad++ прикрутил...

Упс, ни хрена не понял ни как ставить ни как юзать.

Распаковать в паку Tcl\lib ?
Подсунуть туда же DLL с хэдером ?
Запустить Ffidl  со скриптом что ты привел?
И потом можно юзать распарсенные имена функций?

83

Да, папку Ffidl0.6 в Tcl\lib
Скрипт в любое место, libusb-1.0.dll рядом со скриптом, хедер не нужен
И запускать скрипт - либо просто по щелчку если файлы .tcl ассоциированы с тиклем, либо source file.tcl из тиклевой консоли

84

Сделал папку ffidl в Tcl\lib , заускаю скрипт - получаю
can't find package Ffidl

85

Давай лучше в скайпе про тикль продолжим )
Ну или в личке

Отредактировано vt340 (2017-08-05 20:47:10)

86

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

Попробуй одновременно в программе для ПК измени, если не получится, то в понедельник сам проверю.

Попробую, но у меня визуал 2013 тормоз еще тот ...

vt340, твой пример для хоста падал у меня совсем не из-за разрядности .
Падало здесь :

Код:
libusb_claim_interface (devh, 0);


И падало и на 64 сборке если девайса не было в системе.
Изменил здесь :

Код:
    libusb_init (NULL);	
    devh = libusb_open_device_with_vid_pid (NULL, VID, PID);

	if(devh==0)
	{ 
      libusb_exit (NULL);
      printf("Error open device");
	  return 0;
     }
	else{
    libusb_claim_interface (devh, 0);
    libusb


Сейчас и 32 разрядная работает...

87

Да, по хорошему в реальном приложении после каждой ф-ции libusb надо проверять выполнилась она нормально или нет.
Ещё момент, здесь вот

Код:
libusb_bulk_transfer (devh, OEP, obuf, 64, &onum, 100);
libusb_bulk_transfer (devh, IEP, ibuf, 64, &inum, 100);

можно не по 64 байта, а больше, до 16384 байт
И тогда они полетят серией пакетов по 64 байт с полной скоростью до 12 Мбит/с

88

Перенёс всё, что касалось только f0 в новый топик USB в STM32F0

89

vt340 Привет разбираю тоже USB, перелапачиваю STM32_USB-FS-Device_Lib_V4.1.0, отличная идея на счет Видно, что {Запись} == {Было}^{Стало}, т.е. чтобы выставить нужные значения t-битов: EPnR ^= {нужные значения t-битов} просто гениально!!! в библиотеке такая муть что капец) В дополнение хочу сказать что если не все поля тогловские нужно менять их нужно обнулять по маске перед присвоением регистру. Ваши примеры пока не смотрел, есть у кого опыт работы с USB в Delphi? Максимум хочу вытянуть по скорости FS.

90

Про xor - это не я придумал, просто подсмотрел когда-то где-то, не помню уже где


Вы здесь » Микроконтроллеры » STM32: USART, I2C, USB » USB full-speed device интерфейс в STM32F1 (L1, F3)