Xilinx LWIP (RAW API): как перенести данные счетчика с платы KINTEX на ПК - PullRequest
0 голосов
/ 04 октября 2018

Я искал на форумах и не нашел решения своей проблемы, из-за этого я пишу здесь ...

Я использовал шаблон сервера LWIP Echo для передачи данных с платына ПК.Просто я проинформирую о процессе проектирования:

  1. Генерация данных счетчика на плате DAQ
  2. Передача данных из DAQ в KINTEX через оптический кабель

    Размер буфера: u32 DestinationBuffer [1024];

KINTEX - полученные данные через FIFO

enter code here
#include "xparameters.h"
#include "xil_exception.h"
#include "xstreamer.h"
#include "xil_cache.h"
#include "xllfifo.h"
#include "xstatus.h"
#include "xil_printf.h"
#include "ar_rx.h"
#undef DEBUG
XLlFifo FifoInstance;

int aurora_rx_main()
{
  u32 RxWord;
  int Status;
  //xil_printf("Entering RX loop\r\n");
 //while(1)
  {
  Status = XLlFiforx(&FifoInstance, FIFO_DEV_ID);
  if (Status != XST_SUCCESS)
     {
    xil_printf("Axi Streaming FIFO Test Failed\n\r");
    return XST_FAILURE;
     }
   xil_printf("Successfully ran Axi Streaming FIFO \n\r");
  }
  return XST_SUCCESS;
  }

  int XLlFiforx(XLlFifo *InstancePtr, u16 DeviceId)
  {
    XLlFifo_Config *Config;
    int Status,n=0;
    Status = XST_SUCCESS;

/* Initialize the Device Configuration Interface driver */
    Config = XLlFfio_LookupConfig(DeviceId);
    if (!Config)
    {
    xil_printf("No config found for %d\r\n", DeviceId);
    return XST_FAILURE;
    }

    Status = XLlFifo_CfgInitialize(InstancePtr, Config, Config->BaseAddress);
    if (Status != XST_SUCCESS)
     {
    xil_printf("Initialization failed\n\r");
    return Status;
     }
   while(n<100)
     {
    Status = RxReceive(InstancePtr, DestinationBuffer);
   if (Status != XST_SUCCESS)
     {
    xil_printf("Receiving data failed");
    return XST_FAILURE;
      }
      n++;
     }
    return Status;
  }

  int RxReceive (XLlFifo *InstancePtr, u32* DestinationAddr)
  {
   int i;
   u32 RxWord;
   static u32 ReceiveLength;
    ReceiveLength = (XLlFifo_iRxGetLen(InstancePtr))/WORD_SIZE;

   /* Start Receiving */
    if(ReceiveLength>0)
    {   
     for ( i=0; i < ReceiveLength; i++)
       {
         RxWord = 0;
        RxWord = XLlFifo_RxGetWord(InstancePtr);
        *(DestinationAddr+i) = RxWord;
         xil_printf("received data : %d\n\r",*(DestinationAddr+i));
       }
     }
 return XST_SUCCESS;
    }

Мне нужно

Полученные данные в KINTEX должны бытьпереносится на ПК через Ethernetlite.Я использую LWIP в режиме RAW на KINTEX и XSDK

Проблема в том, что я хотел бы отправлять большие объемы данных по сетевому соединению.Как настроить мою функцию обратного вызова tcp_recv, чтобы она возвращала некоторое количество данных

функция обратного вызова tcp_recv

  err_t recv_callback(void *arg, struct tcp_pcb *tpcb,
                           struct pbuf *p, err_t err)
   {
     int i,Status;
     Status=aurora_rx_main();
     for(i=0;i<10;i++)
      {
    xil_printf("%d,",DestinationBuffer[i]);
      }
    xil_printf("\n");
    if (!p) 
     {
     tcp_close(tpcb);
     tcp_recv(tpcb, NULL);
     return ERR_OK;
   }
  /* indicate that the packet has been received */
    tcp_recved(tpcb, p->len);
    if (tcp_sndbuf(tpcb) > 10) {
    err = tcp_write(tpcb, DestinationBuffer, 10, 1);
    } else
    xil_printf("no space in tcp_sndbuf\n\r");

 /* free the received pbuf */
  pbuf_free(p);
  return ERR_OK;
  }

Кто-нибудь подскажет, как передать данные в функцию обратного вызова tcp_recv, чтобы я могпередать данные на ПК.Спасибо

...