Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: LPC288x USB два канала DMA на одну ЕР.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
AndreyKar
1.Кто-нибудь разбирался как работает USB DMA? Меня интересует можно ли на одну ЕР направлять оба канала DMA, т.е. пока DMA0 отправляет, подготовить DMA1 и т.д.? Если да, то как будет происходить арбитраж между ними?
2. За счет чего этот МК выдает скорость USB 480MB/s (HS)?
_dem
1. Можно. Работает и организовано все вполне пристойно, почитайте мануал smile.gif
Отправка идет по фреймам, то есть пока отправляется фрейм, вы готовите новые данные.

2. За счет того, что для передачи за один фрейм с помощью DMA доступно до 64Кбайта данных. Соотвественно, если вы будете успевать их подсовывать - то 64*8*100 = 480 мбит. ( учитывая служебку)
AndreyKar
Цитата(_dem @ Dec 7 2009, 11:40) *
2. За счет того, что для передачи за один фрейм с помощью DMA доступно до 64Кбайта данных. Соотвественно, если вы будете успевать их подсовывать - то 64*8*100 = 480 мбит. ( учитывая служебку)

Мож я плохо читал мануал, но я так и не понял, где он берет эту частоту? Ядро на 60МГц, Main PLL - 160 MHz ≤ .... ≤ 320 MHz.
High speed PLL тоже не понял зачем он. В общем, для меня, даташит и юзер мануал очень слабенькие после Атмеловских ARMов.
AndreyKar
Цитата(_dem @ Dec 7 2009, 11:40) *
1. Можно. Работает и организовано все вполне пристойно, почитайте мануал smile.gif
Отправка идет по фреймам, то есть пока отправляется фрейм, вы готовите новые данные.

Может вопрос не правильно задал. Не получается, поясню на коде:
Инициализация DMA:
Код
#define defUDMA_Ctrl (0xC0000000|(0x1<<23)|(0x1<<21)|(0x0<<19)|(0x2<<17) |(0x1<<15)|(0x0<<9)|(0x1<<7)|(0x2<<5)|(0x0<<3))
void USB_InitDMA(void){
    UDMAFCP1 = 0x00000001;
// DMA channel 0
    DMACh0EOT = 1;
    UDMA0Dest = 0x00000004;    // EP1 IN transfer
    UDMA0Throtl = 0x00000001;
    UDMA0Ctrl = defUDMA_Ctrl;
// DMA channel 1
    DMACh1EOT = 1;
    UDMA1Dest = 0x00000004;    // EP1 IN transfer
    UDMA1Throtl = 0x00000001;
    UDMA1Ctrl = defUDMA_Ctrl;
}

Циклическая ф-ция для проверки:
Код
    if(!(UDMA0Stat & 0x03)){ // 0x00 - Idle
        UDMA0Src = (DWORD)&pData[DataOffset];        // Source is IRAM on LPC288x
        UDMA0Cnt = cnt;
        DMACh0EOT = 0x00;    
        UDMA0Ctrl |= 0x01;        // Send DMA request on channel 0 (CHEN = Low priority)
        DataOffset += cnt;
    }
    if(!(UDMA1Stat & 0x03)){ // 0x00 - Idle
        UDMA1Src = (DWORD)&pData[DataOffset];        // Source is IRAM on LPC288x
        UDMA1Cnt = cnt;
        DMACh1EOT = 0x00;    
        UDMA1Ctrl |= 0x01;        // Send DMA request on channel 1
        DataOffset += cnt;
    }

Отправляет первый пакет в 512 байт, а дальше тишина. С одним каналом работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.