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

 
 
> BasicUSB на AT91SAM7S, Если забыть о прерываниях, какие замечены проблемы
Master
сообщение Dec 15 2006, 10:51
Сообщение #1


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

Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405



Здравствуйте!

Точнее, пример называется AT91SAM7S-BasicUSART_USB.

Никак не могу понять пока, в чём дело: чтение из USB проходит на ура, а вот запись при втором вызове вешает и проц, и терминалку.

Может кто в курсе, где собака порылась? cranky.gif
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_4afc_
сообщение Dec 19 2006, 10:04
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565



Цитата(Master @ Dec 15 2006, 10:51) *
Точнее, пример называется AT91SAM7S-BasicUSART_USB.

Никак не могу понять пока, в чём дело: чтение из USB проходит на ура, а вот запись при втором вызове вешает и проц, и терминалку.


Запись контроллером в терминалку? Незнаю.

У меня были проблемы если я не вычитал пришедшие байты, а ждал новых - естественно дальше ничего не шло. Так что возможно дело в вашем цикле обмена с терминалкой.

Вообще-то я пример не проверял, выдрал из него код и всё. USB чувствителен к частоте процессора и времени включения. У меня надёжней его было включать сразу с установкой ФАПЧ.

Кстати не забывайте всё время проверять статус или isconfigured перед выполнением команд USB.
Go to the top of the page
 
+Quote Post
Master
сообщение Jan 7 2007, 01:16
Сообщение #3


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

Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405



Цитата(_4afc_ @ Dec 19 2006, 10:04) *
У меня были проблемы если я не вычитал пришедшие байты, а ждал новых - естественно дальше ничего не шло. Так что возможно дело в вашем цикле обмена с терминалкой.

Вообще-то я пример не проверял, выдрал из него код и всё. USB чувствителен к частоте процессора и времени включения. У меня надёжней его было включать сразу с установкой ФАПЧ.

Кстати не забывайте всё время проверять статус или isconfigured перед выполнением команд USB.

Спасибо за ответ! Не ожидал, что кто-нибудь ответит smile.gif
Код - из примера. Считаем, что суть не менялась. Добавилась только посылка хосту:
Код
while( 1 ){
    length = pCDC.Read(&pCDC, data, MSG_SIZE);
    data[ length ]=0;
    Trace_Toggel_LED( LED1);
    AT91F_US_Put(data);
    if ( length != 0 )
        pCDC.Write( &pCDC, "\n\r012345678901234567890123456789", 32 );    // Вот эта посылка добавлена
}

Что не правильно? Вообще могу ли я (...вспомнился анекдот...) вообще делать посылку хосту без предупреждения?
Go to the top of the page
 
+Quote Post
nameless
сообщение Jan 8 2007, 14:51
Сообщение #4


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

Группа: Свой
Сообщений: 174
Регистрация: 9-07-04
Пользователь №: 305



А Вы уже видели, что "терминалка" из примера хочет именно столько же байт сколько отправила.
про isconfigured уже сказали, но у меня другая проблема - не знаю как сделать все это по прерываниям. Нет ли "максимально простого" примера. Понять хотябы на какое именно событие вешать isconfigured и read......
Go to the top of the page
 
+Quote Post
Master
сообщение Jan 8 2007, 15:54
Сообщение #5


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

Группа: Новичок
Сообщений: 170
Регистрация: 26-05-05
Из: Москва
Пользователь №: 5 405



Цитата(nameless @ Jan 8 2007, 14:51) *
А Вы уже видели, что "терминалка" из примера хочет именно столько же байт сколько отправила.
Не понял вопроса.
Цитата(nameless @ Jan 8 2007, 14:51) *
про isconfigured уже сказали...
Про isconfigured в частночти я уже упомянул, что пример практически не правился.
Цитата(nameless @ Jan 8 2007, 14:51) *
но у меня другая проблема - не знаю как сделать все это по прерываниям. Нет ли "максимально простого" примера.

Лично я о таком примере ничего не знаю.
Так или иначе, пример вроде заработал, но для этого пришлось почитать буржуйский форум на www.at91.com.
Итак, буржуи пишут:
1. Для корректной работы на разных чипсетах с поддержкой USB, нужно поменять тип конечной точки с AT91C_UDP_EPTYPE_ISO_IN на AT91C_UDP_EPTYPE_INT_IN в двух местах в функции CDC_Enumerate().
Ссылка на сообщение.
2. Для корректной работы функций Read() и Write() в функции IsConfigured() в обработку события End_Of_Bus_Reset нужно добавить строку обнуления текущей конфигурации:
Код
    pCdc->currentConfiguration=0
Ссылка на сообщение.
3. Для того, чтобы главный цикл не останавливался на функции Read, пока не прийдут данные от хоста, в функции Read я дописал условие:
Код
        if ( pstUDP->UDP_CSR[ AT91C_EP_OUT ] & currentReceiveBank ) {
        ...
        }
        else
            length = 0;    // <-=


А теперь я также взялся переделывать обработку событий под прерывания.
Кстати, наткнулся на забавный момент: после обработки прерывания по событию End_Of_Bus_Reset, регистр маски прерываний UDP_IMR сбрасывается в исходное состояние blink.gif Вероятно, это баг, но о нём господа из Atmel решили умолчать. Или выдать за фичу. Позднее smile.gif
Цитата(nameless @ Jan 8 2007, 14:51) *
Понять хотябы на какое именно событие вешать isconfigured и read......
А вот здесь-то как раз ничего сложного (IMHO): в функции isconfigured есть опрос регистра статуса по двум событиям - AT91C_UDP_ENDBUSRES и AT91C_UDP_EPINT0 - вот на них и надо настраивать прерывания. Что касается чтения и записи данных из/в FIFO, вероятно нужно разрешать и обрабатывать прерывания соответствующих EndPoint'ов.
Но это - уже другая тема для другой ветки сообщений. А данная тема, полагаю, закрыта.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 17:03
Рейтинг@Mail.ru


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