Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USB Device на AT91SAM7
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Страницы: 1, 2
Tahoe
Цитата(Kitsok @ Nov 14 2006, 10:03) *
Получается, что размер FIFO - 64 байта? А что за physical memory size associated?

А FIFO, это что такое по-твоему? ;)
Kitsok
Цитата(Tahoe @ Nov 14 2006, 11:17) *
А FIFO, это что такое по-твоему? wink.gif


Насколько я понял, FIFO - это вполне себе аппаратный кусок UDP, и соответственно, влиять на его размер я не могу. Так?

Вот еще вопрос.
Пытаюсь разобрать дескриптор репорта некого устройства. DT в этом не помогает ну ни разу. Пытаюсь в ручном режиме добавить запись, ввожу 15 (base 16), а получается 0x55.... Есть какие-нибудь тулы повменяемей?
Dron_Gus
Цитата(Kitsok @ Nov 14 2006, 10:03) *
Допустим, мне надо через EP1 передать больше 8 байт, поскольку я вроде как в Full Speed, то максимум - 64 байта. А вот какой размер FIFO в SAM7S256? В даташите написано


В доке на AT91SAM7S раздел USB Device Port с этого начинается. Первая конечная точка 8 байт. Если надо 64, то либо 8 пакетов, либо другую EP используйте.
Kitsok
Цитата(Dron_Gus @ Nov 15 2006, 01:33) *
В доке на AT91SAM7S раздел USB Device Port с этого начинается. Первая конечная точка 8 байт. Если надо 64, то либо 8 пакетов, либо другую EP используйте.


Все-таки, нулевая, а не первая. Первая - 64 байта.
Вчера поставил выстраданный Report Descriptor и пихаю без проверок и остановок 16 байт подряд, все доходит.

Спасибо всем, разобрался.
Handler
Помогите пожалуйста передать данные на комп или, кажите куда мне копать, если ли такие готовые проги для PC или надо разбираться и писать самому.
вот код
Код
uint32_t A[ARRAY_SIZE];
.....
AT91F_USB_Open();
    // Init USB device
    // Wait for the end of enumeration
    for(i=0;i<ARRAY_SIZE;i++)
    {   while (!pCDC.IsConfigured(&pCDC));
        pCDC.Write(&pCDC, (const char *)&A[i], 4);
    }

на стороне компа это все надо получить и сохранить в текстовый файл, или что то вроде того
сейчас пытался прошить пример AT91SAM7S256-BasicUSART_USB-IAR4_30A-1_21
и загрузить BasicUSB_6124.exe но с драйвером atm6124.Inf пишет нет устройства, а со вторым atm6124ser.inf, который как раз и эмулирует виртуальный ком порт вообще сразу вылетает.
Форум я почитал тут в принципе много на эту тему, но многие сами пишут драйвер, что мне не по силам.
KAlex
Цитата(Handler @ Jul 22 2007, 23:46) *
Форум я почитал тут в принципе много на эту тему, но многие сами пишут драйвер, что мне не по силам.

Можно прикинуться девайсом, под который уже есть написаные дрова.
Я сделал прикид под FTDI и спокойно работаю через ft2xx.dll
Pasha 111
А как реализовать обработку UDP через прерывания? Сделал как в примере USBWorkframe, который вместе с новым ИАРом еще (5.10) вместе идет. Пишу вот так:

Код
    // Настраиваем вызов прерываний
    AT91F_AIC_ConfigureIt(
        AT91C_BASE_AIC,
        AT91C_ID_UDP,
        USB_INTERRUPT_PRIORITY,
        0,
        USB_InterruptHandler);
    // Включаем прерывание
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_UDP);

    // На какие прерывания реагировать
    AT91C_BASE_UDP->UDP_IER |= AT91C_UDP_ENDBUSRES | AT91C_UDP_EPINT0;


Ничего не работает. Винда ждет свой таймаут и говорит, что неизвестное устройство.

А когда пишу вот так, то все работает

Код
int main()
{
    .................
    .................

    USB_Open(&usb);
    USB_SetPullUp(1);

    while(1)
    {    
        USB_InterruptHandler();
    }
}


Что не так с прерываниями?

Вот реализация самой функции USB_InterruptHandler:

Код
// Функция для обработки прерываний USB контроллера
void USB_InterruptHandler()
{
    // Считываем значение регистра статуса преривания
    AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR;
    // Маски прерываний, которые нужно удалить
    AT91_REG CSR = 0;

    // Обрабатываем все прерывания
    while(1)
    {
        // Маски прерываний, которые нужно удалить
        CSR = 0;

        // Если завершился сброс USB контроллера
        if (ISR & AT91C_UDP_ENDBUSRES)
        {
            // Очищаем маску этого прерывания
            CSR |= AT91C_UDP_ENDBUSRES;
            // Reset all endpoints
            AT91C_BASE_UDP->UDP_RSTEP = (unsigned int)-1;
            AT91C_BASE_UDP->UDP_RSTEP = 0;
            // Enable the function
            AT91C_BASE_UDP->UDP_FADDR = AT91C_UDP_FEN;
            // Включаем EndPoint 0 и устанавливаем режим
            // передачи данных Control
            AT91C_BASE_UDP->UDP_CSR[0] = AT91C_UDP_EPEDS |
                AT91C_UDP_EPTYPE_CTRL;
        }
    
        // Прерывание от EndPoint 0
        // Several signals can generate this interrupt.
        // The reason can be found by reading UDP_CSR[0]:
        // RXSETUP set to 1
        // RX_DATA_BK0 set to 1
        // RX_DATA_BK1 set to 1
        // TXCOMP set to 1
        // STALLSENT set to 1
        else if (ISR & AT91C_UDP_EPINT0)
        {
            // Очищаем маску этого прерывания
            CSR |= AT91C_UDP_EPINT0;
            // Если хост отправил Setup пакет и он доступен
            // в FIFO буфере EndPoint'а 0, то
            if((AT91C_BASE_UDP->UDP_CSR[0] & AT91C_UDP_RXSETUP))
            {
                // Отвечаем на запрос от хоста
                USB_RequestHandler();
            }
        }

        // Очищаем маску всех обработанных прерываний
        if(CSR)
        {
            AT91C_BASE_UDP->UDP_ICR = CSR;
        }

        // Если больше не обработали никаких прерываний, то
        if(CSR == 0)
        {
            // Все прерывания обработаны
            break;
        }
    
        // Опять считываем значение регистра статуса преривания
        AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR;
    }
}


P.S. Если чего, то код в функции USB_InterruptHandler не зависает: пробовал нажимать break во время выполнения - вылетал в бесконечный цикл, который в main().
Dron_Gus
Возможно прерывания "глобально" запрещены. void __enable_interrupt(void);
Kitsok
Цитата(Pasha 111 @ Aug 11 2007, 19:18) *
Вот реализация самой функции USB_InterruptHandler:

Код
// Функция для обработки прерываний USB контроллера
void USB_InterruptHandler()
{
    // Считываем значение регистра статуса преривания
    AT91_REG ISR = AT91C_BASE_UDP->UDP_ISR;
    // Маски прерываний, которые нужно удалить
    AT91_REG CSR = 0;

    // Обрабатываем все прерывания
    while(1)
    {
    <skipped>
                // Отвечаем на запрос от хоста
                USB_RequestHandler();

<skipped>


Я что-то не понял. Вы в обработчик прерывания воткнули while(1)????? Да еще и по прерыванию от USB что-то через USB шлете?

Хм...
brag
хи алл!
Мне тож пришлось связатся с усб..скачал доку,почитал,немного понял..но слабо. пробовал перелопатить BasicUSB,но не пошло..я через прерывания делал,чет не получилось..
Потом взял фреймворк,тоже перелопатил.вроде запустилось,но дело доходит до запроса 9(SET CONFIGURATION) и чет оси не нравится.(FreeBSD) пишет INVAL.
Что посоветываете? надо,чтоб жыло на прерываниях и занимало не более 4кб. кристал AT91SAM7S64...
Спасибо
Artem
To Pasha_111:
Не могли бы Вы послать USBWorkframe на Ctrl_Shift@ngs.ru
Заранее спасибо. А то в моей версии такого нет, а качать ради одного примера - не хотца smile.gif
Pasha 111
Artem, выслал

Dron_Gus, вставка #include <intrinsics.h> и вызов __enable_interrupt(); не помогли sad.gif

Kitsok, while(1) сделан на случай, кодга во время обработки одного прерывания успевает прийти второе, т.е. какбы за один вызов функции сразу несколько прерываний можно обработать.

2All, возникла такая проблема: в проекте BasicUSB почему-то не передаются пакеты, длина которых кратна 64. В программе под Windows вызывается WriteFile(), которая говорит, что записала 0 байт, если длина посылаемых данных ей казана равной 64 или кратной (128, 256..). Никто с этим не сталкивался? Уже 2 недели пытаюсь разобраться, ужас. Контроллер при этом, естественно, ничего не получает. Стоит указать 63 или 65 байт - всё ОК! Не может быть глюк в самом atm6124.sys?
Kitsok
Цитата(brag @ Aug 25 2007, 20:59) *
хи алл!
Мне тож пришлось связатся с усб..скачал доку,почитал,немного понял..но слабо. пробовал перелопатить BasicUSB,но не пошло..я через прерывания делал,чет не получилось..
Потом взял фреймворк,тоже перелопатил.вроде запустилось,но дело доходит до запроса 9(SET CONFIGURATION) и чет оси не нравится.(FreeBSD) пишет INVAL.
Что посоветываете? надо,чтоб жыло на прерываниях и занимало не более 4кб. кристал AT91SAM7S64...
Спасибо


По прерываниям работает пример из FreeRTOS, посмотрите на него. И доку почитайте еще раза три, до полного просветления.

Цитата(Pasha 111 @ Aug 29 2007, 16:44) *
Artem, выслал

Dron_Gus, вставка #include <intrinsics.h> и вызов __enable_interrupt(); не помогли sad.gif

Kitsok, while(1) сделан на случай, кодга во время обработки одного прерывания успевает прийти второе, т.е. какбы за один вызов функции сразу несколько прерываний можно обработать.

2All, возникла такая проблема: в проекте BasicUSB почему-то не передаются пакеты, длина которых кратна 64. В программе под Windows вызывается WriteFile(), которая говорит, что записала 0 байт, если длина посылаемых данных ей казана равной 64 или кратной (128, 256..). Никто с этим не сталкивался? Уже 2 недели пытаюсь разобраться, ужас. Контроллер при этом, естественно, ничего не получает. Стоит указать 63 или 65 байт - всё ОК! Не может быть глюк в самом atm6124.sys?


Про while(1) в обработчике - ну не знаю, по-моему вы недооцениваете скорость обработки прерываний.

Что касается записи пакетов, кратных размеру конечной точки, то см. выше в этой ветке. После такого нужно посылать пустой пакет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.