Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Работа с USBExpress от Silabs
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > RS232/LPT/USB/PCMCIA/FireWire
alvol
На сколько я понял Silabs предоставил собственный набор API функций и библиотеки для программирования со стороны компьютера и MCU (AN169 и AN220).

1. При работе с USBExpress используется написанный ими драйвер. Для MCU реализовано виртуальное прерывание и есть возможность определения источника этого прерывания от USB.
В описании работы процессора написано, что для работы с USB используется либо Timer2, либо Timer3.
Интересно какой из этих таймеров нужен для обеспечения работы при использовании библиотек USBExpress?

2. В примерах, которые идут в комплекте с пакетом USBExpress (передача файла FileTransfere) инициализация передачи данных процессора организовывается командой от компьютера (байтовая последовательность), в зависимости от которой процессор отвечает своей посылкой. Необходимо обеспечить непрерывный поток данных с MCU на компьютер. Как организовать работу, при которой ведущим является MCU? Возможно ли это реализовать непрерывным считыванием байтов (отдельным потоком) и специальным управляющим заголовком пакета?

3. Почему строчка описания устройства, которая находится в памяти MCU игнорируется и при подхватывании устройства отображается строка записанная в ini файлах драйвера?
vladec
1. По моему, USBExpress никаких таймеров при своей работе не использует.
2. Работа может быть организована только по инициативе ПК, путем подачи с ПК потока команд чтения и записи.
Dmitriy_V
Цитата(vladec @ Jan 24 2007, 11:28) *
1. По моему, USBExpress никаких таймеров при своей работе не использует.
2. Работа может быть организована только по инициативе ПК, путем подачи с ПК потока команд чтения и записи.


1 - полностью согласен.

2 - не совсем так.
Действительно для начала работы с устройством его надо сначала открыть.
Потом можно переслать один пакет со служебной информацией для устройства.
После этого устройство в автоматическом режиме начинает передавать данные на компьютер.
Компьютерная программа проверяет буфер приема и если есть данные для получения
то считывает их.
Когда работа с устройством закончена, от компьютера посылается пакет на прекращение
передачи.
Вот один из примеров алгоритма работы.

3 - отображается только та информация, которая записана в драйвере для соответствующих VID, PID.
Классифицировать подключенное оборудование можно по серийному номеру, который берется из самого устройства.
alvol
Цитата(Dmitriy_V @ Jan 24 2007, 20:25) *
1 - полностью согласен.

2 - не совсем так.
Действительно для начала работы с устройством его надо сначала открыть.


1. Т.е. выходит USBEXPRESS работает немного не так, как это описанно при полной ручной настройке и назначении всех ендпонитов и пайпов? Т.е. могу ли я полноценно использовать оба таймера для своих целей, инициализировать их, занимать их прерывания совершенно не мешая работе USB?

2. По сути нужно хотя бы раз зайти в прерывание и уже крутиться в нем (используя конечный автомат) после передачи каждого пакета и подвязывать к нему новые? Выходит это можно инициализировать каждый раз очисткой буфера USB?


Еще такой вопрос. Там указано, что для передачи данных необходимо указать область памяти, откуда начинается блок для передачи и собственно количество байт. Я передаю указатель на первый элемент массива, который я заранее заготовил. Начинаю передачу 64 байт, но почему-то принимаю эти же байты прореженные значениями 0x00. От чего это может быть? Подобна ли передача по USB с форматом строки идентификатора (где после каждого символа идет 0х00)? Или эта строка сама по себе просто указана Unicode и поэтому там нужны нули, а в моем случае нули передаются из-за дефекта программы?
Warlord
Цитата(Dmitriy_V @ Jan 24 2007, 21:25) *
2 - не совсем так.
Действительно для начала работы с устройством его надо сначала открыть.
Потом можно переслать один пакет со служебной информацией для устройства.
После этого устройство в автоматическом режиме начинает передавать данные на компьютер.
Компьютерная программа проверяет буфер приема и если есть данные для получения
то считывает их.
Когда работа с устройством закончена, от компьютера посылается пакет на прекращение
передачи.
Вот один из примеров алгоритма работы.

Почему же не совсем, именно так, инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему. И ни в каком "автоматическом режиме" устройство не будет "передавать данные на компьютер". Работа строится так: Комп шлет информационный пакет "начать передачу", девйас заполняет свою EP(IN) данными и ждет пока комп ее не считает. Комп посылает запрос на считывание, если в EP есть данные, то они пересылаются в буфер драйвера, а оттуда в аппликуху, если нет, то либо железяка отвечает STALL, и драйвер возвращает ошибку, либо ничего не отвечает и комп повторяет запрос, пока железка ему не ответит.
Отсюда вывод, чтобы шла непрерываная передача потока на комп, аппликухе необходимо ПОСТОЯННО запрашивать очередную порцию данных. Обычно это дело выносится в отдельный поток.
alvol
Цитата(Warlord @ Jan 25 2007, 08:56) *
инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему


а если контроллером просто шпарить на выдачу? у компютреа же есть буфер который просто нужно успевать вычитывать в отдельном потоке, там же после вычитывание можно узнать сколько вычиталось
т.е. вычитывать постоянно независимо знаем мы о передачи с контроллера или нет?
Warlord
Цитата(alvol @ Jan 25 2007, 12:12) *
а если контроллером просто шпарить на выдачу?

Шпарить нужно не просто, а только тогда, когда знаешь что предыдущая пачка забрана, иначе можешь потерять данные.

Цитата(alvol @ Jan 25 2007, 12:12) *
у компютреа же есть буфер который просто нужно успевать вычитывать в отдельном потоке, там же после вычитывание можно узнать сколько вычиталось
т.е. вычитывать постоянно независимо знаем мы о передачи с контроллера или нет?

Здесь все зависит от драйвера железки. Если он поддерживет асинхронный ввод/вывод, и таймауты, то можешь вычитывать, а если нет, то тогда ты рискуешь навсегда зависнуть в попытке чтения, если вдруг передачи с контроллера нет.
alvol
спасибо, попробуем на практике smile.gif)
Dmitriy_V
Цитата(Warlord @ Jan 25 2007, 09:56) *
Почему же не совсем, именно так, инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему. И ни в каком "автоматическом режиме" устройство не будет "передавать данные на компьютер". Работа строится так: Комп шлет информационный пакет "начать передачу", девйас заполняет свою EP(IN) данными и ждет пока комп ее не считает. Комп посылает запрос на считывание, если в EP есть данные, то они пересылаются в буфер драйвера, а оттуда в аппликуху, если нет, то либо железяка отвечает STALL, и драйвер возвращает ошибку, либо ничего не отвечает и комп повторяет запрос, пока железка ему не ответит.
Отсюда вывод, чтобы шла непрерываная передача потока на комп, аппликухе необходимо ПОСТОЯННО запрашивать очередную порцию данных. Обычно это дело выносится в отдельный поток.


При использовании USBXpress можно не вникать во все эти тонкости. Драйвер автоматом посылает запрос на очередную порцию данных. Если данные есть, он добавляет их в буфер драйвера. Если частота отправки пакетов меньше предельной, то данные теряться не будут. Из самой программы постоянно посылать запрос на прием не обязательно. Вроде так ?smile.gif

Цитата(Warlord @ Jan 25 2007, 12:46) *
Шпарить нужно не просто, а только тогда, когда знаешь что предыдущая пачка забрана, иначе можешь потерять данные.


У контроллера с USBXpress есть прерывание по завершению отправки очередной порции данных.
alvol
Интересно, что прерывание в контроллере по факту завершения передачи наступает, когда из очереди вычитываются данные на хосте. А вот в буфер хоста данные ложаться не зависимо наступило прерывание или нет. Т.е. данные можно спать, они не будут вычитываться софтом некоторое время, накапливаясь в буфере (спасибо драйверу) без прерывания (даже если его запретить совсем). Но тогда нужно подгадывать, чтоб передача закончилась наверняка (иначе пакеты пропадают, хотя вроде не рвутся).
Кста, совсем недавно вышла новая версия драйвера
USBXpress version 3.0.5
в которой исправлен глюк у функции CheckRXQueue (теперь количество байт в очереди указывается корректно)


еще на всяк случай подкину ссылку на
Custom Driver Wizard
и доку к нему:
an220.pdf
Dmitriy_V
Цитата(alvol @ Feb 9 2007, 20:11) *
Интересно, что прерывание в контроллере по факту завершения передачи наступает, когда из очереди вычитываются данные на хосте. А вот в буфер хоста данные ложаться не зависимо наступило прерывание или нет. Т.е. данные можно спать, они не будут вычитываться софтом некоторое время, накапливаясь в буфере (спасибо драйверу) без прерывания (даже если его запретить совсем). Но тогда нужно подгадывать, чтоб передача закончилась наверняка (иначе пакеты пропадают, хотя вроде не рвутся).
Кста, совсем недавно вышла новая версия драйвера
USBXpress version 3.0.5
в которой исправлен глюк у функции CheckRXQueue (теперь количество байт в очереди указывается корректно)


еще на всяк случай подкину ссылку на
Custom Driver Wizard
и доку к нему:
an220.pdf


В описании AN169 говорится, что прерывание возникает после отправки всех данных. Количество
переданных данных возвращает функция Block_Write. Контроль за ошибками при передаче обязан
осуществлять драйвер устройства и хоста. Если это не происходит и данные которые отмечены как
переданные теряются, то это очень прискорбно. cranky.gif У меня проблем с пропажей пакетов
не возникало.
alvol
Почитал тут англоязычный форум, судя
по этой теме
выходит, что использование функции Block_Write() приводит к монопольному ее использованию ресурсов процессора и ничего другого не может происходить, пока происходит передача данных. Это такой компромис легкости использования USBXpress с независимой работой процессора. Обидно... Чем выше скорость передачи--тем меньше времени остается процессору на выполнение других задач.
Dmitriy_V
Цитата(alvol @ Feb 12 2007, 00:26) *
Почитал тут англоязычный форум, судя
по этой теме
выходит, что использование функции Block_Write() приводит к монопольному ее использованию ресурсов процессора и ничего другого не может происходить, пока происходит передача данных. Это такой компромис легкости использования USBXpress с независимой работой процессора. Обидно... Чем выше скорость передачи--тем меньше времени остается процессору на выполнение других задач.


(см. англ. форум)
А зачем тебе использовать Block_Write внутри прерывания?
Поставь в прерывание флаг и проверяй его в основной программе.
При совпадении флага из основной программы вызывается Block_Write.
Основные вычисления выполняй в прерываниях.
МК при этом не простаивает.

Если использовать Block_Write внутри прерывания, то текст основной программы также блокируется.
И при этом вычисления могут выполняться только в прерываниях с большим приоритетом.

Может сработает biggrin.gif
alvol
Dmitriy_V smile.gif
Вы задали в той теме мой вопрос немного раньшеsmile.gif Дальше задал вопрос просто для разъяснения ситуации.
В прерываниях я делаю вычисления и получаю все данные. Отправку данных делаю в главном цикле. Отправляю все, что успело накопиться к моменту отправки.

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

Может попробуем поменяться программами для вычитывания? wink.gif Нужно узнать в чем проблема.
Dmitriy_V
Цитата(alvol @ Feb 16 2007, 18:35) *
Dmitriy_V smile.gif
Вы задали в той теме мой вопрос немного раньшеsmile.gif Дальше задал вопрос просто для разъяснения ситуации.
В прерываниях я делаю вычисления и получаю все данные. Отправку данных делаю в главном цикле. Отправляю все, что успело накопиться к моменту отправки.

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

Может попробуем поменяться программами для вычитывания? wink.gif Нужно узнать в чем проблема.


У меня скорость передачи всего 22 кбайт в секунду. Передача по 64 байта.
В связи с этим, проблем такого рода у меня и быть не могло.
Советую задать этот вопрос на форуме SiLabs.
Можно попробовать на рускоязычном, правда там редко чего отвечают. Сайт дистрибьюторов SiLabs
Там же есть переведенное руководство по C8051F320.
alvol
ага, спасибо
есть и на русском и на ихнем родном (кста, там скорее ошибок нет) описание, но вот USBExpress пока не работает весь smile.gif
alvol
Решил проблему передачи написав другой вариант программы опроса с отдельным потоком. Перестал открывать и закрывать устройство при каждой операции как это делалось в примере. Если кому-то понадобятся исходники--могу поделиться, так может кому-то проще будет smile.gif

Добавил чуть позже:
как раз от того что устройство закрывалось и открывалось--пропадали пакеты
выходит, что когда устройство закрыто, буфер драйвера просто игнорирует все, что приходит (в принципе логично). Повелся на пример единоазовой передачей больших блоков данных.
Tarkin
зравствуйте!
назрела проблема: возможно ли изменение размера пакета в USBXpress с 64 до 256 байт? Можно ли средствами USBXpress работать не ЕР0 а с ЕР1, 2, 3?
(правда работаю с контроллеромc8051f340)
В руководстве про это не говориться.
_Sam_
Цитата
возможно ли изменение размера пакета в USBXpress с 64 до 256 байт

Нельзя. В USBXpress реализован Bulk режим передачи. Максимальная скорость передачи FullSpeed. Согласно стандарту USB 2.0 максимальный размер данных в Bulk на FullSpeed 64 байта.

Цитата
Можно ли средствами USBXpress работать не ЕР0 а с ЕР1, 2, 3

В зависимости от типа микроконтроллера используется либо EP1, либо EP2 в split режиме. Читайте appnote
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.