Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: BasicUSB на AT91SAM7S
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Master
Здравствуйте!

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

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

Может кто в курсе, где собака порылась? cranky.gif
_4afc_
Цитата(Master @ Dec 15 2006, 10:51) *
Точнее, пример называется AT91SAM7S-BasicUSART_USB.

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


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

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

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

Кстати не забывайте всё время проверять статус или isconfigured перед выполнением команд USB.
Master
Цитата(_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 );    // Вот эта посылка добавлена
}

Что не правильно? Вообще могу ли я (...вспомнился анекдот...) вообще делать посылку хосту без предупреждения?
nameless
А Вы уже видели, что "терминалка" из примера хочет именно столько же байт сколько отправила.
про isconfigured уже сказали, но у меня другая проблема - не знаю как сделать все это по прерываниям. Нет ли "максимально простого" примера. Понять хотябы на какое именно событие вешать isconfigured и read......
Master
Цитата(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'ов.
Но это - уже другая тема для другой ветки сообщений. А данная тема, полагаю, закрыта.
nameless
Не могли бы Вы показать как AIC при этом настраивать? У меня никак не получается.
Master
Цитата(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
ivstech
Цитата(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
У меня BasicUSB тоже вешает терминал, но контроллер переходит в DataAbort не всегда
Ivan.
Привет. Интересная у вас тема.
Я тоже по этому вопросу. Мне нужно связать SAM7 с PC по USB, есть у Вас какие нибудь наработки (примеры) для SAM7 и PC.
Если не жалко, вышлитен на ivashka_s@mail.ru
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.