реклама на сайте
подробности

 
 
> Работа с USBExpress от Silabs, детали использования USB-MCU серии C8051F32х
alvol
сообщение Jan 23 2007, 23:10
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



На сколько я понял Silabs предоставил собственный набор API функций и библиотеки для программирования со стороны компьютера и MCU (AN169 и AN220).

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

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

3. Почему строчка описания устройства, которая находится в памяти MCU игнорируется и при подхватывании устройства отображается строка записанная в ini файлах драйвера?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
alvol
сообщение Feb 9 2007, 20:11
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



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


еще на всяк случай подкину ссылку на
Custom Driver Wizard
и доку к нему:
an220.pdf
Go to the top of the page
 
+Quote Post
Dmitriy_V
сообщение Feb 10 2007, 01:28
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 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. Контроль за ошибками при передаче обязан
осуществлять драйвер устройства и хоста. Если это не происходит и данные которые отмечены как
переданные теряются, то это очень прискорбно. cranky.gif У меня проблем с пропажей пакетов
не возникало.
Go to the top of the page
 
+Quote Post
alvol
сообщение Feb 12 2007, 00:26
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



Почитал тут англоязычный форум, судя
по этой теме
выходит, что использование функции Block_Write() приводит к монопольному ее использованию ресурсов процессора и ничего другого не может происходить, пока происходит передача данных. Это такой компромис легкости использования USBXpress с независимой работой процессора. Обидно... Чем выше скорость передачи--тем меньше времени остается процессору на выполнение других задач.
Go to the top of the page
 
+Quote Post
Dmitriy_V
сообщение Feb 16 2007, 02:46
Сообщение #5


Участник
*

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



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


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

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

Может сработает biggrin.gif

Сообщение отредактировал Dmitriy_V - Feb 16 2007, 02:50
Go to the top of the page
 
+Quote Post
alvol
сообщение Feb 16 2007, 18:35
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 153
Регистрация: 15-05-06
Из: Николаев
Пользователь №: 17 119



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

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

Может попробуем поменяться программами для вычитывания? wink.gif Нужно узнать в чем проблема.
Go to the top of the page
 
+Quote Post
Dmitriy_V
сообщение Feb 16 2007, 20:52
Сообщение #7


Участник
*

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



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

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

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


У меня скорость передачи всего 22 кбайт в секунду. Передача по 64 байта.
В связи с этим, проблем такого рода у меня и быть не могло.
Советую задать этот вопрос на форуме SiLabs.
Можно попробовать на рускоязычном, правда там редко чего отвечают. Сайт дистрибьюторов SiLabs
Там же есть переведенное руководство по C8051F320.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- alvol   Работа с USBExpress от Silabs   Jan 23 2007, 23:10
- - vladec   1. По моему, USBExpress никаких таймеров при своей...   Jan 24 2007, 11:28
|- - Dmitriy_V   Цитата(vladec @ Jan 24 2007, 11:28) 1. По...   Jan 24 2007, 21:25
|- - alvol   Цитата(Dmitriy_V @ Jan 24 2007, 20:25) 1 ...   Jan 24 2007, 23:58
|- - Warlord   Цитата(Dmitriy_V @ Jan 24 2007, 21:25) 2 ...   Jan 25 2007, 09:56
|- - alvol   Цитата(Warlord @ Jan 25 2007, 08:56) иниц...   Jan 25 2007, 12:12
||- - Warlord   Цитата(alvol @ Jan 25 2007, 12:12) а если...   Jan 25 2007, 12:46
||- - alvol   спасибо, попробуем на практике )   Jan 25 2007, 13:16
|- - Dmitriy_V   Цитата(Warlord @ Jan 25 2007, 09:56) Поче...   Jan 30 2007, 11:33
|- - alvol   ага, спасибо есть и на русском и на ихнем родном (...   Feb 16 2007, 22:44
|- - alvol   Решил проблему передачи написав другой вариант про...   Feb 20 2007, 16:17
- - Tarkin   зравствуйте! назрела проблема: возможно ли изм...   Jan 20 2009, 19:05
- - _Sam_   Цитатавозможно ли изменение размера пакета в USBXp...   Jun 13 2012, 13:43


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 02:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.01426 секунд с 7
ELECTRONIX ©2004-2016