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

Artix-7, Microblaze & 1G/2.5G Ethernet: не уходят данные из FIFO

Здравствуйте! Имеется следующая конфигурация: 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);

 

Изменено пользователем R2AIV

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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