R2AIV 0 27 июня Опубликовано 27 июня (изменено) · Жалоба Здравствуйте! Имеется следующая конфигурация: Artix-7(сотка), на нем крутится Microblaze который общается с 1G/2.5G Ethernet через FIFO. FIFO с процессором общается по AXI, а с Ethernet MAC по AXI-Stream. Драйвера используются стандартные от Xilinx, в сгенерированном BSP. Проходит инициализация устройств, читаются/пишутся регистры PHY - тут все ок. Затык возникает при попытке что-либо записать в FIFO. У FIFO есть параметр Vacancy, который отражает свободный объем FIFO. И этот самый параметр уменьшается на то количество байт, которое посылается в FIFO. Далее вызывается ф-ций XLlFifo_iTxSetLen, которая должна запускать пересылку из FIFO дальше, но ничего не происходит. Vacancy не увеличивается, данные не уходят, в регистре статуса флага о завершении пересылки - нет. Может быть кто-нибудь сталкивался с подобным? Данная проблема сильно тормозит дальнейшее развитие проекта. Не думаю, что Xilinx могли подсунуть нерабочее ядро FIFO или драйвера. Вобщем: ХЕЛП! Внизу приложил сокращенный код. init_platform(); // Инициализация Eth и FIFO FifoCfgPtr = XLlFfio_LookupConfig(XPAR_AXI_ETHERNET_0_FIFO_DEVICE_ID); XLlFifo_CfgInitialize(&Fifo, FifoCfgPtr, XPAR_AXI_ETHERNET_0_FIFO_BASEADDR); EthCfgPtr = XAxiEthernet_LookupConfig(XPAR_AXI_ETHERNET_0_DEVICE_ID); XAxiEthernet_CfgInitialize(&Eth, EthCfgPtr, XPAR_AXI_ETHERNET_0_BASEADDR); // Стартуем Eth XAxiEthernet_SetMacAddress(&Eth, MyMAC); XAxiEthernet_Start(&Eth); // Смотрим, сколько свободного места в FIFO и записываем туда буфер с данными int FifoVacant = XLlFifo_iTxVacancy(&Fifo); xil_printf("FIFO Vacancy before: %d\r\n", FifoVacant); xil_printf("Sending packet...\r\n"); XLlFifo_IntClear(&Fifo,0xffffffff); XLlFifo_TxReset(&Fifo); for(int i=0;i<TX_PACKET_SIZE;i++) XLlFifo_TxPutWord(&Fifo, OutPacketBuf[i]); // ПУСК XLlFifo_iTxSetLen(&Fifo, 32); // Вот тут зависаем в ожидании (чуда?) флага, который не приходит // while(!XLlFifo_IsTxDone(&Fifo)); // Смотрим Vacancy - стало меньше FifoVacant = XLlFifo_iTxVacancy(&Fifo); xil_printf("FIFO Vacancy after: %d\r\n", FifoVacant); Изменено 27 июня пользователем R2AIV Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться