Xilinx LWIP (RAW API): как перенести данные счетчика с платы KINTEX на ПК
Я искал на форумах и не нашел решения своей проблемы, поэтому пишу здесь...
Я использовал шаблон сервера LWIP Echo для передачи данных с платы на ПК. Просто я проинформирую мой дизайн:
- Генерация данных счетчика в плате DAQ
Передача данных из 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, чтобы я мог передавать данные на ПК. Спасибо