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

 
 
 
Reply to this topicStart new topic
> 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
_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
nameless
сообщение Jan 10 2007, 15:13
Сообщение #6


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

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



Не могли бы Вы показать как AIC при этом настраивать? У меня никак не получается.
Go to the top of the page
 
+Quote Post
Master
сообщение Jan 11 2007, 01:36
Сообщение #7


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

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



Цитата(nameless @ Jan 10 2007, 15:13) *
Не могли бы Вы показать как AIC при этом настраивать? У меня никак не получается.

Восприму вопрос о моих возможностях как просьбу.
Например вот так:
Код
    // open UDP interrupt
    AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, m_ID, m_uPriority, AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, IrqHandler );
    AT91F_AIC_EnableIt( AT91C_BASE_AIC, m_ID );
Перед этим нужно настроить события, по которым AIC будет генерить прерывание:
Код
    AT91F_UDP_DisableIt( pstUDP, ~m_uEvents );                // Disable all events
    AT91F_UDP_InterruptClearRegister( pstUDP, (UINT)-1 );     // Clear all events
    AT91F_UDP_EnableIt( pstUDP, m_uEvents );                  // Enable events
Возможно, первые две строки - лишние, добавил на всякий случай.
Всё вышеописанное - строго IMHO. И вообще проект пока не готов, и находится в стадии отладки. Например, я пока не добился корректного отрабатывания прерывания от конечных точек.
Интересный исходник написал jjoannic -> на странице AT91SAM Application Notes лежит архив AT91 USB Framework - Core 1.02 + MSD 1.0, в котором есть файл udp.c. В нём есть обработчик прерывания. Жаль проект не для IAR EWARM smile.gif
Go to the top of the page
 
+Quote Post
ivstech
сообщение Jan 11 2007, 07:11
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



Цитата(Master @ Jan 11 2007, 04:36) *
Интересный исходник написал jjoannic -> на странице AT91SAM Application Notes лежит архив AT91 USB Framework - Core 1.02 + MSD 1.0, в котором есть файл udp.c. В нём есть обработчик прерывания. Жаль проект не для IAR EWARM smile.gif

Я думал, BasicUSB(где его взять?) это то же самое, что и "AT91 USB Framework - Core 1.02 ....". Значит, я заблуждался. Framework откомпилировал под IAR 4.30, но он не заработал. MASS STORAGE переделывал под MMC, работает нормально, только медленно, ~300КБайт в секунду чтение, хотя просто чтение карточки без USB -до 1700КБайт в секунду.

Сообщение отредактировал ivstech - Jan 11 2007, 07:13
Go to the top of the page
 
+Quote Post
ivstech
сообщение Jan 23 2007, 18:31
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 204
Регистрация: 5-01-06
Пользователь №: 12 860



У меня BasicUSB тоже вешает терминал, но контроллер переходит в DataAbort не всегда
Go to the top of the page
 
+Quote Post
Ivan.
сообщение Apr 12 2007, 20:38
Сообщение #10





Группа: Участник
Сообщений: 7
Регистрация: 13-02-07
Пользователь №: 25 325



Привет. Интересная у вас тема.
Я тоже по этому вопросу. Мне нужно связать SAM7 с PC по USB, есть у Вас какие нибудь наработки (примеры) для SAM7 и PC.
Если не жалко, вышлитен на ivashka_s@mail.ru


--------------------
Я могу ВСЁ, вопрос, сколько времени у меня это займет.
Go to the top of the page
 
+Quote Post

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

 


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


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