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

 
 
> NIOSII и DMA, вроде все дёлаю по книжке, но есть интересные моменты..
Kuzmi4
сообщение May 3 2008, 18:24
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Здравствуйте.
Счас пытаюсь освоить ДМА для ниоса.
Прочитал описание альтеры для компонента, на ниос-форуме посмотрел примеры и сваял свою реализацию..
В обсчем код выглядит так(звиняйте если большой, но коментарии присутствуют):
Код
//===ISR part===
static void dma_isr ( void * context2, alt_u32 irqnum2 )
{
    asm("nop");
    //set flag
    dmaf=1;
    /* Clear any pending interrupts and the DONE flag */
    IOWR_ALTERA_AVALON_DMA_STATUS (DMA_BASE, 0);
    
}
//===END ISR part===


//---MAIN---
int main (void)
{
    asm ("nop");
    //
    unsigned char i=0;
    // initial values
    cnt_val=0;
    ch=0;
    txf=0;
    dmaf=0;
    //
    for (i=0;i<12;i++)
    {
        inbuffer[i]=0;
        outbuffer[i]=i+1;
    }
    //
    //
    asm("nop");
    //register DMA ISR
    alt_irq_register(DMA_IRQ,(void*)DMA_BASE,dma_isr);
    asm("nop");
    asm("nop");
    //
    //DMA_Init
    /* Clear any pending interrupts and the DONE flag */
    IOWR_ALTERA_AVALON_DMA_STATUS (DMA_BASE, 0);
    asm("nop");
    asm("nop");
    //clear control register
    IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_BASE, 0);
    asm("nop");
    asm("nop");
    /* Halt any current transactions (reset the device) */
    IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_BASE, ALTERA_AVALON_DMA_CONTROL_SOFTWARERESET_MSK);    
    IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_BASE, ALTERA_AVALON_DMA_CONTROL_SOFTWARERESET_MSK);
    asm("nop");
    asm("nop");
    asm("nop");
    //asm("nop");
    //set initial values for tranmit
    //byte orientating transfer
    alt_u32 control=0;
    control |= ALTERA_AVALON_DMA_CONTROL_BYTE_MSK;//byte transfer
    control |= ALTERA_AVALON_DMA_CONTROL_I_EN_MSK;//enable int
    control |= ALTERA_AVALON_DMA_CONTROL_LEEN_MSK;//enable end of transaction by reacing Len 0
    //1st try with mem massives -> no uart
    //control |= ALTERA_AVALON_DMA_CONTROL_RCON_MSK;//read from constant mem - we use uart, so mem == const
    //store control
    IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_BASE, control);
    asm("nop");
    asm("nop");    
    //**
    //DMA_start((int)&inbuffer[0],(int)&outbuffer[0],10);
    //**
    waddr = (int)&inbuffer[0];
    raddr = (int)&outbuffer[0];
    len=10;
    //alt_u32 control;
    control=0;
    //wrire read addr
    IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_BASE, raddr);
    asm("nop");
    asm("nop");
    //wrire write addr
    IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_BASE, waddr);
    asm("nop");
    asm("nop");
    //write length
    IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_BASE,len);
    asm("nop");
    asm("nop");
    //start transfer
    control = IORD_ALTERA_AVALON_DMA_CONTROL (DMA_BASE);
    control |= ALTERA_AVALON_DMA_CONTROL_GO_MSK;
    IOWR_ALTERA_AVALON_DMA_CONTROL (DMA_BASE, control);
    //
    dmaf=0;
    asm("nop");
    //**
  while (1)
  {
    /***/
wlabel:
    asm("nop");
    //
    if (dmaf==0) goto wlabel;
    
    asm("nop");
    IOWR_ALTERA_AVALON_PIO_DATA(SEVEN_SEGMENT_PORT_BASE,segments[inbuffer[0]] );        
        asm("nop");
    while (1);
    /***/
  }
  
  return 0;
}


В обсчем, компилируется всё нормально, код вроде выглядить при дебуге нормально,
однако есть непонятные моменты...
Если поставить точек прерываний по коду в ключевых местах - регистрация прерывания, запись контрола ДМА, старт ДМА - то всё отрабатывается нормально, если только на старте ДМА - то интерупт генерится а действия никакого..
Если вообсче не ставить точек прерывания - то ничего не отрабатывается - интерупта нет.. ничего нет...
Дебаг юнит в НИОСЕ - 2-й, 3-й - без разницы.
Read и Write каналы соединены с уартом и сдрам, программа находтся в сдрам, переменные - тоже.
В принципе такое поведение наталкивает на мысль , что не хватает задержек (только не пойму зачем, вроде в описании к ДМА не было про них...) , потому и наставил нопов - однако с ними и без них - работает одинаково...
smile3046.gif
Кто работал с ДМА - подскажите что не так ..
help.gif
Спасибо.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Kuzmi4   NIOSII и DMA   May 3 2008, 18:24
- - Kuzmi4   Что ? Никто не работал с ДМА через регистры ?? ...   May 7 2008, 13:49
- - torik   Надо попробовать для начала без прерываний: Код wh...   May 8 2008, 05:06
- - Kuzmi4   В обсчем попробовал я без прерываний.. Код: Код//...   May 8 2008, 08:45
|- - AlexanderL   попробуй вот так: IOWR_ALTERA_AVALON_DMA_RADDRES...   May 8 2008, 12:56
- - Kuzmi4   2 AlexanderL - Понимаете - конструкция вида wad...   May 8 2008, 13:23
- - vetal   Цитатаwaddr = (alt_u32)&inbuffer[0]; как раз и...   May 8 2008, 13:43
- - Kuzmi4   NIOSII у меня fast - тобто полной комплектации - е...   May 8 2008, 13:50
- - torik   А вот эти массивы откуда беруться, как объявлены. ...   May 8 2008, 13:58
- - Kuzmi4   Цитата(torik @ May 8 2008, 16:58) А вот э...   May 8 2008, 14:58
- - vetal   ЦитатаНе можете вы объяснить что значит "обой...   May 8 2008, 15:39
- - Kuzmi4   2 vetal - Спасибо. Буду знать. Сегодня пересоздал...   May 11 2008, 14:37
- - vetal   Работа с кешем: http://altera.com/literature/hb/ni...   May 11 2008, 17:12
|- - RHnd   Цитата(vetal @ May 11 2008, 21:12) Работа...   May 12 2008, 05:52
- - Kuzmi4   Ага! Пока суть до дела, я отправил запрос в ...   May 12 2008, 09:18
- - Kuzmi4   ----- Пересобрал НИОС2 , и решил подобавлять alt_d...   May 12 2008, 11:49
- - vetal   ЦитатаПочему очистка после ожидания флага не даёт ...   May 12 2008, 12:10
- - Kuzmi4   Тогда получатся всё правильно - я инициализирую да...   May 12 2008, 12:49
- - AlexanderL   Цитата(Kuzmi4 @ May 12 2008, 16:49) Вот о...   May 28 2008, 17:09


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

 


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


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