Перейти к содержанию
    

NIOS-DMA-UART ?

Уважаемые коллеги помогите пожалуйста разобраться с бональной ошибкой. При организации взаимодействия NIOS-DMA-UART функция txchan = alt_dma_txchan_open("/dev/dma_0") возвращает нулевой адрес в указателе. Соответственно не работает и передача по DMA. По документации вроде все понятно, а результат отрицательный. Все устройства (NIOS DMA RAM UART) синтезированы на EP1C6. Память в SOPSbuilder как я только не пробовал крутить. Делал через одну – 4кб, делал RAM1 - 3кб (рабочая), RAM2 – 1кб (DMA), пытался реализовать и в одно и в двух портовом режиме. DMA молчит как убитый. Посоветуйте на что обратить внимание.

Спасибо.

 

 

http://files.mail.ru/I6ZQJJ?t=1[/img]

post-10385-1329459837_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Уважаемые коллеги помогите пожалуйста разобраться с бональной ошибкой. При организации взаимодействия NIOS-DMA-UART функция txchan = alt_dma_txchan_open("/dev/dma_0") возвращает нулевой адрес в указателе. Соответственно не работает и передача по DMA. По документации вроде все понятно, а результат отрицательный. Все устройства (NIOS DMA RAM UART) синтезированы на EP1C6. Память в SOPSbuilder как я только не пробовал крутить. Делал через одну – 4кб, делал RAM1 - 3кб (рабочая), RAM2 – 1кб (DMA), пытался реализовать и в одно и в двух портовом режиме. DMA молчит как убитый. Посоветуйте на что обратить внимание.

Спасибо.

 

 

http://files.mail.ru/I6ZQJJ?t=1[/img]

 

Так а дебагером почему не получается отследить? Там же в пошаговом режиме можно пройтись и все понятно станет. Либо вообще забить на библиотеку и работать напрямую с регистрами DMA-контроллера. Там их всего-то. Я когда увидел описание на библиотеку сразу сдался :).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так а дебагером почему не получается отследить? Там же в пошаговом режиме можно пройтись и все понятно станет. Либо вообще забить на библиотеку и работать напрямую с регистрами DMA-контроллера. Там их всего-то. Я когда увидел описание на библиотеку сразу сдался :).

 

Я так и делал.

 

IOWR_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE, 0x00000000);

IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_0_BASE,5);

IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_0_BASE,0x00001800);

IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_0_BASE,0x00001800);

IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE,9);

i = IORD_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE);

 

DMA_STATUS возвращает -2, т.е. он занят. Такое впечатление, что UART не забирает данные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Мне помнится не удалось DMA котроллером работать с обоими фиксированными адресами (адрес чтения и адрес записи).

Никак не желал работать.

Стоило сделать один из адресов инкрементируемым и всё прекрасно жило.

софт QII 9.1 sp2

Я тогда cделал на SGDMA и пользовал библиотеку.

Может у Вас то же самое?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

IOWR_ALTERA_AVALON_DMA_STATUS(DMA_0_BASE,0x0);

IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE,0x0);

 

IOWR_ALTERA_AVALON_DMA_RADDRESS(DMA_0_BASE,(alt_u32)&data[0]);

IOWR_ALTERA_AVALON_DMA_WADDRESS(DMA_0_BASE,UART_0_BASE);

IOWR_ALTERA_AVALON_DMA_LENGTH(DMA_0_BASE,8);

 

 

ch = ALTERA_AVALON_DMA_CONTROL_BYTE_MSK

| ALTERA_AVALON_DMA_CONTROL_GO_MSK

| ALTERA_AVALON_DMA_CONTROL_LEEN_MSK

| ALTERA_AVALON_DMA_CONTROL_WCON_MSK;

 

IOWR_ALTERA_AVALON_DMA_CONTROL(DMA_0_BASE,ch);

 

 

Я правильно понимаю, что в режиме передачи UART через DMA я указываю в RADDRESS - адрес памяти где хранятся передаваемые данные и он будет использоваться DMA контроллером для чтения памяти. А в WADDRESS я указываю физический адрес UART и он должен быть статичным при установке бита WCON. В этом случае физический блок UART должен соединяться с NIOS через master порт шины данных NIOS, помимо того, что UART еще соединен с master портом DMA. И это обязательно !?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В приведённом скриншоте системы, UART не соединён с мастером данных CPU.

Процессор тогда не может сконфигурировать UART и это неправильно.

WADDRESS должен указывать адрес регистра txdata (= UART_0_BASE + 1).

По моему должно быть так.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...