|
Работа с USBExpress от Silabs, детали использования USB-MCU серии C8051F32х |
|
|
|
Jan 24 2007, 21:25
|
Участник

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217

|
Цитата(vladec @ Jan 24 2007, 11:28)  1. По моему, USBExpress никаких таймеров при своей работе не использует. 2. Работа может быть организована только по инициативе ПК, путем подачи с ПК потока команд чтения и записи. 1 - полностью согласен. 2 - не совсем так. Действительно для начала работы с устройством его надо сначала открыть. Потом можно переслать один пакет со служебной информацией для устройства. После этого устройство в автоматическом режиме начинает передавать данные на компьютер. Компьютерная программа проверяет буфер приема и если есть данные для получения то считывает их. Когда работа с устройством закончена, от компьютера посылается пакет на прекращение передачи. Вот один из примеров алгоритма работы. 3 - отображается только та информация, которая записана в драйвере для соответствующих VID, PID. Классифицировать подключенное оборудование можно по серийному номеру, который берется из самого устройства.
|
|
|
|
|
Jan 24 2007, 23:58
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(Dmitriy_V @ Jan 24 2007, 20:25)  1 - полностью согласен.
2 - не совсем так. Действительно для начала работы с устройством его надо сначала открыть. 1. Т.е. выходит USBEXPRESS работает немного не так, как это описанно при полной ручной настройке и назначении всех ендпонитов и пайпов? Т.е. могу ли я полноценно использовать оба таймера для своих целей, инициализировать их, занимать их прерывания совершенно не мешая работе USB? 2. По сути нужно хотя бы раз зайти в прерывание и уже крутиться в нем (используя конечный автомат) после передачи каждого пакета и подвязывать к нему новые? Выходит это можно инициализировать каждый раз очисткой буфера USB? Еще такой вопрос. Там указано, что для передачи данных необходимо указать область памяти, откуда начинается блок для передачи и собственно количество байт. Я передаю указатель на первый элемент массива, который я заранее заготовил. Начинаю передачу 64 байт, но почему-то принимаю эти же байты прореженные значениями 0x00. От чего это может быть? Подобна ли передача по USB с форматом строки идентификатора (где после каждого символа идет 0х00)? Или эта строка сама по себе просто указана Unicode и поэтому там нужны нули, а в моем случае нули передаются из-за дефекта программы?
|
|
|
|
|
Jan 25 2007, 09:56
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

|
Цитата(Dmitriy_V @ Jan 24 2007, 21:25)  2 - не совсем так. Действительно для начала работы с устройством его надо сначала открыть. Потом можно переслать один пакет со служебной информацией для устройства. После этого устройство в автоматическом режиме начинает передавать данные на компьютер. Компьютерная программа проверяет буфер приема и если есть данные для получения то считывает их. Когда работа с устройством закончена, от компьютера посылается пакет на прекращение передачи. Вот один из примеров алгоритма работы. Почему же не совсем, именно так, инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему. И ни в каком "автоматическом режиме" устройство не будет "передавать данные на компьютер". Работа строится так: Комп шлет информационный пакет "начать передачу", девйас заполняет свою EP(IN) данными и ждет пока комп ее не считает. Комп посылает запрос на считывание, если в EP есть данные, то они пересылаются в буфер драйвера, а оттуда в аппликуху, если нет, то либо железяка отвечает STALL, и драйвер возвращает ошибку, либо ничего не отвечает и комп повторяет запрос, пока железка ему не ответит. Отсюда вывод, чтобы шла непрерываная передача потока на комп, аппликухе необходимо ПОСТОЯННО запрашивать очередную порцию данных. Обычно это дело выносится в отдельный поток.
|
|
|
|
|
Jan 25 2007, 12:12
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Цитата(Warlord @ Jan 25 2007, 08:56)  инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему а если контроллером просто шпарить на выдачу? у компютреа же есть буфер который просто нужно успевать вычитывать в отдельном потоке, там же после вычитывание можно узнать сколько вычиталось т.е. вычитывать постоянно независимо знаем мы о передачи с контроллера или нет?
|
|
|
|
|
Jan 25 2007, 12:46
|
Частый гость
 
Группа: Свой
Сообщений: 121
Регистрация: 23-09-05
Из: Москва
Пользователь №: 8 874

|
Цитата(alvol @ Jan 25 2007, 12:12)  а если контроллером просто шпарить на выдачу? Шпарить нужно не просто, а только тогда, когда знаешь что предыдущая пачка забрана, иначе можешь потерять данные. Цитата(alvol @ Jan 25 2007, 12:12)  у компютреа же есть буфер который просто нужно успевать вычитывать в отдельном потоке, там же после вычитывание можно узнать сколько вычиталось т.е. вычитывать постоянно независимо знаем мы о передачи с контроллера или нет? Здесь все зависит от драйвера железки. Если он поддерживет асинхронный ввод/вывод, и таймауты, то можешь вычитывать, а если нет, то тогда ты рискуешь навсегда зависнуть в попытке чтения, если вдруг передачи с контроллера нет.
|
|
|
|
|
Jan 30 2007, 11:33
|
Участник

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217

|
Цитата(Warlord @ Jan 25 2007, 09:56)  Почему же не совсем, именно так, инициатором передачи пакета по usb может быть исключительно хост, т.е. комп. А железка в зависимости от алгоритма отвечает ему. И ни в каком "автоматическом режиме" устройство не будет "передавать данные на компьютер". Работа строится так: Комп шлет информационный пакет "начать передачу", девйас заполняет свою EP(IN) данными и ждет пока комп ее не считает. Комп посылает запрос на считывание, если в EP есть данные, то они пересылаются в буфер драйвера, а оттуда в аппликуху, если нет, то либо железяка отвечает STALL, и драйвер возвращает ошибку, либо ничего не отвечает и комп повторяет запрос, пока железка ему не ответит. Отсюда вывод, чтобы шла непрерываная передача потока на комп, аппликухе необходимо ПОСТОЯННО запрашивать очередную порцию данных. Обычно это дело выносится в отдельный поток. При использовании USBXpress можно не вникать во все эти тонкости. Драйвер автоматом посылает запрос на очередную порцию данных. Если данные есть, он добавляет их в буфер драйвера. Если частота отправки пакетов меньше предельной, то данные теряться не будут. Из самой программы постоянно посылать запрос на прием не обязательно. Вроде так ?  Цитата(Warlord @ Jan 25 2007, 12:46)  Шпарить нужно не просто, а только тогда, когда знаешь что предыдущая пачка забрана, иначе можешь потерять данные. У контроллера с USBXpress есть прерывание по завершению отправки очередной порции данных.
Сообщение отредактировал Dmitriy_V - Jan 30 2007, 11:30
|
|
|
|
|
Feb 9 2007, 20:11
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Интересно, что прерывание в контроллере по факту завершения передачи наступает, когда из очереди вычитываются данные на хосте. А вот в буфер хоста данные ложаться не зависимо наступило прерывание или нет. Т.е. данные можно спать, они не будут вычитываться софтом некоторое время, накапливаясь в буфере (спасибо драйверу) без прерывания (даже если его запретить совсем). Но тогда нужно подгадывать, чтоб передача закончилась наверняка (иначе пакеты пропадают, хотя вроде не рвутся). Кста, совсем недавно вышла новая версия драйвера USBXpress version 3.0.5в которой исправлен глюк у функции CheckRXQueue (теперь количество байт в очереди указывается корректно) еще на всяк случай подкину ссылку на Custom Driver Wizardи доку к нему: an220.pdf
|
|
|
|
|
Feb 10 2007, 01:28
|
Участник

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217

|
Цитата(alvol @ Feb 9 2007, 20:11)  Интересно, что прерывание в контроллере по факту завершения передачи наступает, когда из очереди вычитываются данные на хосте. А вот в буфер хоста данные ложаться не зависимо наступило прерывание или нет. Т.е. данные можно спать, они не будут вычитываться софтом некоторое время, накапливаясь в буфере (спасибо драйверу) без прерывания (даже если его запретить совсем). Но тогда нужно подгадывать, чтоб передача закончилась наверняка (иначе пакеты пропадают, хотя вроде не рвутся). Кста, совсем недавно вышла новая версия драйвера USBXpress version 3.0.5в которой исправлен глюк у функции CheckRXQueue (теперь количество байт в очереди указывается корректно) еще на всяк случай подкину ссылку на Custom Driver Wizardи доку к нему: an220.pdfВ описании AN169 говорится, что прерывание возникает после отправки всех данных. Количество переданных данных возвращает функция Block_Write. Контроль за ошибками при передаче обязан осуществлять драйвер устройства и хоста. Если это не происходит и данные которые отмечены как переданные теряются, то это очень прискорбно.  У меня проблем с пропажей пакетов не возникало.
|
|
|
|
|
Feb 12 2007, 00:26
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Почитал тут англоязычный форум, судя по этой темевыходит, что использование функции Block_Write() приводит к монопольному ее использованию ресурсов процессора и ничего другого не может происходить, пока происходит передача данных. Это такой компромис легкости использования USBXpress с независимой работой процессора. Обидно... Чем выше скорость передачи--тем меньше времени остается процессору на выполнение других задач.
|
|
|
|
|
Feb 16 2007, 02:46
|
Участник

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217

|
Цитата(alvol @ Feb 12 2007, 00:26)  Почитал тут англоязычный форум, судя по этой темевыходит, что использование функции Block_Write() приводит к монопольному ее использованию ресурсов процессора и ничего другого не может происходить, пока происходит передача данных. Это такой компромис легкости использования USBXpress с независимой работой процессора. Обидно... Чем выше скорость передачи--тем меньше времени остается процессору на выполнение других задач. (см. англ. форум) А зачем тебе использовать Block_Write внутри прерывания? Поставь в прерывание флаг и проверяй его в основной программе. При совпадении флага из основной программы вызывается Block_Write. Основные вычисления выполняй в прерываниях. МК при этом не простаивает. Если использовать Block_Write внутри прерывания, то текст основной программы также блокируется. И при этом вычисления могут выполняться только в прерываниях с большим приоритетом. Может сработает
Сообщение отредактировал Dmitriy_V - Feb 16 2007, 02:50
|
|
|
|
|
Feb 16 2007, 18:35
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Dmitriy_V  Вы задали в той теме мой вопрос немного раньше  Дальше задал вопрос просто для разъяснения ситуации. В прерываниях я делаю вычисления и получаю все данные. Отправку данных делаю в главном цикле. Отправляю все, что успело накопиться к моменту отправки. Вот только у меня возникла проблема следующего плана. Со стороны хоста, мне кажется, у меня не совсем корректно работает программа вычитывания данных. Посмотрел по осциллографу, как выполняется у меня передача данных. Пока я не начинаю их вычитывать софтом на компьютере--все передается гладко и без проблем. Но как только начинает работать моя процедура вычитывания (по таймеру), сразу видно что Block_Write неестественно затягивается! При этом пропадает несколько десятков пакетов. Сами пакеты--не портятся. Если уже ушел на отправку, то стабильно доходит. Как я понимаю все, что приходит с контроллера драйвер ложит в очередь, а потом это же должно просто вычитываться из буфера софтом и никак не влиять на работу процессора... Может попробуем поменяться программами для вычитывания?  Нужно узнать в чем проблема.
|
|
|
|
|
Feb 16 2007, 20:52
|
Участник

Группа: Новичок
Сообщений: 57
Регистрация: 31-07-06
Пользователь №: 19 217

|
Цитата(alvol @ Feb 16 2007, 18:35)  Dmitriy_V  Вы задали в той теме мой вопрос немного раньше  Дальше задал вопрос просто для разъяснения ситуации. В прерываниях я делаю вычисления и получаю все данные. Отправку данных делаю в главном цикле. Отправляю все, что успело накопиться к моменту отправки. Вот только у меня возникла проблема следующего плана. Со стороны хоста, мне кажется, у меня не совсем корректно работает программа вычитывания данных. Посмотрел по осциллографу, как выполняется у меня передача данных. Пока я не начинаю их вычитывать софтом на компьютере--все передается гладко и без проблем. Но как только начинает работать моя процедура вычитывания (по таймеру), сразу видно что Block_Write неестественно затягивается! При этом пропадает несколько десятков пакетов. Сами пакеты--не портятся. Если уже ушел на отправку, то стабильно доходит. Как я понимаю все, что приходит с контроллера драйвер ложит в очередь, а потом это же должно просто вычитываться из буфера софтом и никак не влиять на работу процессора... Может попробуем поменяться программами для вычитывания?  Нужно узнать в чем проблема. У меня скорость передачи всего 22 кбайт в секунду. Передача по 64 байта. В связи с этим, проблем такого рода у меня и быть не могло. Советую задать этот вопрос на форуме SiLabs. Можно попробовать на рускоязычном, правда там редко чего отвечают. Сайт дистрибьюторов SiLabsТам же есть переведенное руководство по C8051F320.
|
|
|
|
|
Feb 20 2007, 16:17
|
Частый гость
 
Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119

|
Решил проблему передачи написав другой вариант программы опроса с отдельным потоком. Перестал открывать и закрывать устройство при каждой операции как это делалось в примере. Если кому-то понадобятся исходники--могу поделиться, так может кому-то проще будет  Добавил чуть позже: как раз от того что устройство закрывалось и открывалось--пропадали пакеты выходит, что когда устройство закрыто, буфер драйвера просто игнорирует все, что приходит (в принципе логично). Повелся на пример единоазовой передачей больших блоков данных.
|
|
|
|
|
Jan 20 2009, 19:05
|
Группа: Новичок
Сообщений: 3
Регистрация: 20-01-09
Пользователь №: 43 670

|
зравствуйте! назрела проблема: возможно ли изменение размера пакета в USBXpress с 64 до 256 байт? Можно ли средствами USBXpress работать не ЕР0 а с ЕР1, 2, 3? (правда работаю с контроллеромc8051f340) В руководстве про это не говориться.
Сообщение отредактировал Tarkin - Jan 20 2009, 19:07
|
|
|
|
|
Jun 13 2012, 13:43
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Цитата возможно ли изменение размера пакета в USBXpress с 64 до 256 байт Нельзя. В USBXpress реализован Bulk режим передачи. Максимальная скорость передачи FullSpeed. Согласно стандарту USB 2.0 максимальный размер данных в Bulk на FullSpeed 64 байта. Цитата Можно ли средствами USBXpress работать не ЕР0 а с ЕР1, 2, 3 В зависимости от типа микроконтроллера используется либо EP1, либо EP2 в split режиме. Читайте appnote
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|