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

Nerevarine1810

Участник
  • Постов

    9
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Благодарю за разъяснения) теперь это становится понятным Мда... Туго идет изучение Nios Тема закрыта. P.S. Если кому интересно, то все таки получилось реализовать что-то похожее на решение задачи: использовать не простой UART, а FIFOed_Avalon_UART (с буферами на прием и передачу + еще много плюшек). Код практически не изменился. Логика проста: всё сообщение записывается в буфер, а модуль уже сам постепенно отправляет. Возможно, DMA здесь будет лишним грузом при небольших транзакциях. Пока это дело будет стоять до понедельника. У нового модуля достаточно много прерываний полезных.
  2. Если не секрет, то для чего DMA в QSYS добавлено? И нет поддержки на уровне HAL или в целом? P.S. У самого что-то передать получилось (использовал регистры вместо HAL), правда в UART залетал только последний символ из массива, как будто DMA отправил все по адресу, не задумываясь о медлительности UART. P.S.S. Кстати, на форумах использовали прием через DMA (как я понял успешно), сам не пробовал. Передать бы сначала
  3. Собственно, тема баян (судя по поисковику). Кто-то сразу предлагает на регистрах организовать. Мне же хочется все запустить на HAL. В итоге имеем систему с Nios, on-chip, SDRAM, UART, DMA, VIC и прочим. UART подключен к Nios и WriteMaster DMA. ReadMaster подключен к on-chip и sdram. Необходимо средствами HAL NIOS заставить передать массив символов в UART с помощью DMA и вызвать прерывание по окончанию работы. Что же получается: вроде как функции выполняют свою работу, прерывание вызывается, но в UART ничего не идет. Фирменный мануал курил (особенно понравились ссылки из одного документа на другой ради парочки неинформативных предложений). Есть чувство, что кое-что упустил. #include <...> // Все инклуды volatile int dma_complete = 0; char msg[6] = "Hello"; char msg_input[10]; alt_dma_txchan DMA_UART_TX; // Регистрируем прерывание UART static void UART_interrupt (void* context, alt_u32 id) __attribute__((section (".exceptions"))); static void UART_interrupt (void* context, alt_u32 id) { alt_u16 status = IORD_ALTERA_AVALON_UART_STATUS(UART_BASE); IOWR_ALTERA_AVALON_UART_STATUS(UART_BASE, 0); // Обработка UART } static void init_uart (void* base, alt_u32 irq_controller_id, alt_u32 irq) { alt_ic_isr_register (irq_controller_id, irq, UART_interrupt, base, NULL); } // Прерывание DMA_1 static void DMA_1_interrupt (void* handle) __attribute__((section (".exceptions"))); static void DMA_1_interrupt (void* handle) { dma_complete = 1; } int main() { init_uart ((void *)UART_BASE, UART_IRQ_INTERRUPT_CONTROLLER_ID, UART_IRQ); alt_ic_irq_enable(UART_IRQ_INTERRUPT_CONTROLLER_ID, UART_IRQ); printf("Init UART\n"); DMA_UART_TX = alt_dma_txchan_open (DMA_1_NAME); if (DMA_UART_TX == NULL) printf("DMA open error\n"); else { if (alt_dma_txchan_ioctl (DMA_UART_TX, ALT_DMA_SET_MODE_8, NULL) < 0) printf ("Failed to set ALT_DMA_SET_MODE_8"); if (alt_dma_txchan_ioctl (DMA_UART_TX, ALT_DMA_TX_ONLY_ON, (void *)UART_BASE + 1) < 0) printf ("Failed to set ALT_DMA_TX_ONLY_ON"); int dma_tx_done = alt_dma_txchan_send( DMA_UART_TX, msg, sizeof(msg), DMA_1_interrupt, NULL ); if (dma_tx_done < 0) printf("DMA TX error %d\n", dma_tx_done); } while(1) { if (dma_complete) { printf("DMA transferred\n"); if (alt_dma_txchan_ioctl (DMA_UART_TX, ALT_DMA_TX_ONLY_OFF, NULL) < 0) printf ("Failed to set ALT_DMA_TX_ONLY_OFF"); dma_complete = 0; } } return 0; }
  4. Как то использовались изоляторы, но у них не было управляющего вывода. А использовать наподобие этих микросхем позволяет решить проблемы (в том числе и с затеканием тока через I/O), тем более что таких критических цепей не так уж и много. Остальные цепи как нибудь переживут подтяжку. Спасибо за наводку ;)
  5. В моем случае это фатально, поэтому тему и поднял) в общем теперь все понятно
  6. Судя по документу про Hot-Socketing подтяжка железная. Наплывает единственное более-менее решение это использовать транзисторы (нормально открытые при подаче питания), которые будут сажать на землю вывода (которые не должны скакать). Ну и потом, к примеру, отдельной ножкой их закрывать. Довольно неприятная особенность, особенно когда о ней не знаешь. Обычно разводил микроконтроллеры, там с этим проблем нет. А тут скоро придется развести ПЛИСину, так вот не накосячить бы в таких тонкостях) А по поводу выбросов после сброса питания думаю завести с источника сигнал BIAS, по нему определять что питания нет -> делать общий ресет (транзисторы обратно притянут вывода на землю).
  7. Проблема следующая: при подаче питания на FPGA (Cyclone 4 E) на выводах I/O банков появляется единица (подтяжка к Vcc) на время инициализации (загрузки прошивки из EPCS16). Длится это безобразие ~100-200 us, что ни в какие ворота... Банки питаются от 3.3В. Где-то читал, что выводы якобы должны быть в третьем состоянии и что порядок установки напряжений не важен для современных ПЛИС Altera или Intel, как Вам угодно)). Вторая проблема, пока менее важная, это выбросы на I/O выходах во время сброса питания. Кто сталкивался с подобным? Куда тут копнуть? ПЛИС находится на отладочной плате, схема питания (и всего остального) прилагается в PDF Development_board_schematic_diagram_V2.1.pdf P.S. Посоветовали перетянуть подтяжку к питанию резистором на землю - как вариант, но не очень. В идеале хочется иметь Z состояние, так как выводов используется много и все по разной логике работают. Ведь даже в микроконтроллерах изначально стоит Z-вход на выводах, не думаю что проектировщики ПЛИС не позаботились об этом, тем более программно есть возможность переводить вывод в третье состояние. Вот и думаю, может можно как то предустановить? Напряжение ядра раньше подавать смысла не вижу, подтяжка присутствует на аппаратном уровне.
×
×
  • Создать...