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

Не возможно изменить состояние регистров IO Nios II

Здравствуйте!

 

Решил подключить к Nios II IP-core Altera SG-DMA для переноса данных из устройства в память. Проблема заключается в том, чтот процессор не может изменить состояние регистров SGDMA. В регистре управления всегда одно и то же значение - 0x01. При этом состояние регистров PIO-Core процессор изменить может (зажигаю светодиоды). Проект выполняю в режимие дебага, Nios II SBT.

Есть идеи?

 

      
unsigned char rw[3];
int  base, offset, data;
printf("\nEnter command (Example: w 1)\n");
scanf("%1s %x", rw, &offset);
base = SGDMA_0_BASE;
if (rw[0] == 'w')
{
   printf("Enter write data: ");
   scanf ("%x",&data);
   printf("\n");
   printf("Generated IOWR(0x%x, 0x%x, 0x%x)...\n", base, offset, data);
   IOWR(base, offset, data );
   printf ("Read at base 0x%x with offset 0x%x data 0x%x\n",base,offset, IORD(base, offset));
}

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


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

Убийственный компонет SGDMA... Подключил в свой проект обычный DMA, как рекомендовал barabek. Остается сделать интерфейс Memory Mapped к своему модулю и в принципе от SGDMA тогда можно отказаться в моем проекте. Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?...

 

Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов.

 

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


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

...Но вопрос останется открытым. Чем так может оличаться SGDMA от других IP-core, что не позволяет писать в свои регистры данные. Где у меня может быть ошибка?...

У меня все работает.

Начните с простых вещей:

  1. Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA.
  2. Познакомтесь с файлом "altera_avalon_sgdma_regs.h".
  3. Попробуйте выполнить такой код в отладчике в пошаговом режиме:
       alt_u32 wrData, rdData;
       
           IOWR_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_0_BASE, 0x00);
           // Проверьте, что считывается 0x0
           rdData = IORD_ALTERA_AVALON_SGDMA_CONTROL(SGDMA_0_BASE);
       
           wrData = 0x00100000;
           IOWR_ALTERA_AVALON_SGDMA_NEXT_DESC_POINTER(SGDMA_0_BASE, wrData );
           // Проверьте, что rdData == wrData
           rdData = IORD_ALTERA_AVALON_SGDMA_NEXT_DESC_POINTER(SGDMA_0_BASE);

 

Маскимальный размер транзакции DMA 2^32 байт, в то время как у SGDMA всего лишь 2^16. Изображение 640*480*3 байт будет передано за одну транзакцию DMA, а для передачи по SGDMA нужно делать несколько дескрипторов.

Зато, значения дескриптора можно формировать и цифровым автоматом. То есть, дескриптор может быть и цифровым автоматом. Жаль только, что SGDMA съедает много ресурсов FPGA.

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


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

  1. Проверьте по "system.h" и с помощью Qsys, что константа SGDMA_0_BASE действительно содержит базовый адрес для Вашего SGDMA.
  2. Познакомтесь с файлом "altera_avalon_sgdma_regs.h".
  3. Попробуйте выполнить такой код в отладчике в пошаговом режиме:

1. Базовый адрес в SOPC-Builder и system.h сопадают, проверял уже.

2. Знаком, пользовался дефайнами. Нашел даже, как мне показалось баг, а именно в строке

#define ALTERA_AVALON_SGDMA_CONTROL_DESC_POLL_FREQ_OFST              (20)

должно быть определено смещение 19.

 

3. А вот тут то и нашел ошибку. Неправильно использоал функцию IOWR/IORD. Смещение этой функци в байтах, а не в словах. Спасибо, Konst_777! Ваш код действительно работал, я увидел разницу со своим и нашел ошибку. Досадная ошибка...

 

 

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


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

А вот на чем я накололся...

 

Карта памяти регистров SG-DMA составлена не как у всех остальных периферийных устройств SOPC Builder. Между регистрамии SGDMA в карте памяти "дырки" по три слова. Не понятно засем это сделано, и не понятно, почему на карте памяти в документации не отражены зарезервированные регистры. Но я сам виноват - в таблице четко указано - смещение в 32-х битных словах.

32-bit Word Offset | Register Name

base + 0 | status

base + 4 | control

base + 8 | next_descriptor_pointer

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


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

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

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

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

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

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

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

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

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

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