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

 
 
> Скорость USB на AT91SAM7S, У кого какие рекорды?
Edmundo
сообщение May 23 2006, 09:02
Сообщение #1


Мастер
****

Группа: Свой
Сообщений: 730
Регистрация: 18-02-06
Из: Москва
Пользователь №: 14 474



Сделал проектик на базе Atmel'овского "AT91SAM7S64-BasicUSB". Там bulk-обмен с размером буфера 64 байта. Гонял обмен туда-сюда следующим образом: большой буфер делил на куски по 64 байта и WriteFile'ом (и соотв. ReadFile) прогонял. На МК ловил/отправлял с помощью AT91F_L1USB_GET_Data и AT91F_L1USB_PUT_Data, которые тоже бьют массив на части:

Код
void AT91F_L1USB_PUT_Data(char* data,unsigned int length)
{
    unsigned int size;

    while(length)
    {
        size = (length<SIZEBUFMAX) ? length : SIZEBUFMAX; // SIZEBUFMAX=64
        AT91F_L0USB_PUT_Data(data, size); //  это фактически pCDC.Write(&pCDC, data, length);
        length -= size;
        data += size;
    }
}


Чего-то скорость не очень большая. Количественных замеров не сделал еще, качественно где-то на уровне сотни килобайт в секунду, мне кажется не больше. Как-то по-быстрее хотелось бы smile.gif

В связи с чем три вопроса:
1) Можно ли как-то ускорить обмен (может, что-то по-другому делать)?
2) Этот пример на USB 1.1, как я понял (bcdUSBL=0x0110), чтобы сделать его 2.0 достаточно просто указать в bcdUSBL 0x0200?
3) Какие скорости у вас получались?


--------------------
شامل
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
beer_warrior
сообщение May 23 2006, 15:27
Сообщение #2


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Не буду утверждать стопроцентно, поскольку вглубь не лазил, удовлетворился фактом работы, но
basicUSB уже предсталяет из себя CDC-устройство т.е. в файле main мы уже имеем верхний уровень
отвязаный от режимов передачи, endpoint-ов и прочей USB специфики.
У меня основной цикл выглядел так:
Код
//--------------------------------------------------------------------------
for(;;)
   {
    // Check enumeration
    if (pCDC.IsConfigured(&pCDC))
        {
        ProcessCmd();
        }
   }
}
//--------------------------------------------------------------------------
void ProcessCmd()
{
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,~(1<<4));
pCDC.Read(&pCDC,(char*)&ask, sizeof(CMD_S));
Execute(ask.cmd);    
pCDC.Write(&pCDC,(char*)&resp, sizeof(DAT_S));
//AT91F_PIO_ForceOutput(AT91C_BASE_PIOA,(1<<4));
}
//--------------------------------------------------------------------------

где ask и resp соответственно буфера приема и передачи команды типа CMD_S - структуры в которой описан формат буферов.
Execute(ask.cmd) соответсвенно парсер команды.

Другими словами мы работаем так же как с обычным UARTом.

Со стороны хост-машины существуют исходники USBLibrary dll
Поскольку пользуюсь MInGW надо было перепиливать экспорт функций, я поленился и просто копи-пастом перенес в проект.
Суть от этого не изменилась, имеем класс CFCPipeUSB который создает два пайпа на чтение и запись.
Снаружи мы обращаемся к ним как к обычным функциям Read/Write внутри старые добрые Create-Read-Write-CloseFile т.е опять таки все хорошо известное по СОМ-портам
Отличие в том что вместо файла мы открываем пайпы и имеем не предопределенное имя порта а то что нашла энумерация USB.
Со стороны хоста получилось следующее
Код
if (pipe.Open(devname))
    {
    WxMemo->AppendText("Can't open device \n");        
    return 1;
    }
WxMemo->AppendText("Opened... \n");        
//----------------------------------
//there is exchange
//--------------------------------
WxMemo->AppendText("Write \n");        
for(int block = 0; block < 9; block ++)
    {
    if(pipe.WritePipe((char*)&ask, sizeof(CMD_S), &msgWritten))
        {
        WxMemo->AppendText("Write error 1\n");        
        pipe.Close();
        return 1;
        }
    if(sizeof(CMD_S) != msgWritten)
        {
        WxMemo->AppendText("Write error2\n" + s);        
        pipe.Close();
        return 1;
        }
    //s.Printf("%ud-%ld",sizeof(CMD_S),msgWritten);    
    //WxMemo->AppendText(s);
    if (pipe.ReadPipe ((char*)&resp, sizeof(DAT_S)))
        {
        WxMemo->AppendText("Read error\n");        
        pipe.Close();
        return 1;
        }
    }//for pipe
WxMemo->AppendText("Read\n");

Оба фрагмента уже не из теста, а реального кода, хотя возможно промежуточной версии.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Edmundo   Скорость USB на AT91SAM7S   May 23 2006, 09:02
- - beer_warrior   Я тоже плясал от basicUSB, но поскольку задача был...   May 23 2006, 09:30
|- - Edmundo   Цитата(beer_warrior @ May 23 2006, 13:30)...   May 23 2006, 09:46
|- - Edmundo   Thanks! Вы дали мне надежду и почву для исслед...   May 23 2006, 18:52
- - Shuuura   Если делать отправку в одну сторону большого объем...   May 24 2006, 05:05
- - Shuuura   Вдогонку. Если не пользоваться двойной буферизацие...   May 24 2006, 05:16
- - Harbour   Проясните - девайс реально usb 2.0 high speed режи...   May 24 2006, 05:49
|- - Shuuura   Цитата(Harbour @ May 24 2006, 09:49) Проя...   May 24 2006, 06:20
- - KolyanV   Цитата(Edmundo @ May 23 2006, 21:52) Than...   May 24 2006, 12:12
- - Harbour   То-то и оно или если короче то отож ...   May 24 2006, 16:11
|- - Edmundo   То, что реально только 1.1 -- это полнейшая засада...   May 24 2006, 18:45
|- - Stanislav   Цитата(Edmundo @ May 24 2006, 22:45) То, ...   May 24 2006, 21:24
- - Harbour   Вы ошиблись - usb2.0 обязано поддерживать предыдущ...   May 25 2006, 01:36
- - misyachniy   usb2.0 certified - определяет как раз соответствие...   May 25 2006, 06:33
- - Harbour   Да, действительно - даже на www.usb.org есть для э...   May 25 2006, 08:15


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

 


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


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