Добавлю функцию, которой отправляю данные
TxFrame - тот самый массив char на 1500 байт. К слову - пакетов длиной более 300 байт у меня не бывает
FramesTx - увеличивается на 1 в момент прерывания по завершению отправки пакета
FrameSize - размер данных в массиве TxFrame
EmacPsInstancePtr - указатель на MAC контроллер
Сообщения об ошибках не воозникают, но тем не менее первые 68 байт в TxFrame почему-то остаются от предыдущего пакета и уходят в сеть.
Код
EthernetFrame TxFrame; /* Transmit buffer */
volatile int FramesTx; /* Frames have been sent */
int Ethernet_FrameSend(XEmacPs *EmacPsInstancePtr, u16 FrameSize)
{
int Status;
XEmacPs_Bd *Bd1Ptr;
Xil_DCacheFlushRange((u32)&TxFrame, FrameSize);
Status = XEmacPs_BdRingAlloc(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr);
if (Status != XST_SUCCESS) {
EmacPsUtilErrorTrap("Error allocating TxBD");
return XST_FAILURE;}
XEmacPs_BdSetAddressTx(Bd1Ptr, &TxFrame);
XEmacPs_BdSetLength(Bd1Ptr, FrameSize);
XEmacPs_BdClearTxUsed(Bd1Ptr);
XEmacPs_BdSetLast(Bd1Ptr);
Status = XEmacPs_BdRingToHw(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, Bd1Ptr);
if (Status != XST_SUCCESS) {
EmacPsUtilErrorTrap("Error committing TxBD to HW");
return XST_FAILURE;}
FramesTx = 0;
XEmacPs_Transmit(EmacPsInstancePtr);
while (FramesTx == 0);
if (XEmacPs_BdRingFromHwTx(&(XEmacPs_GetTxRing(EmacPsInstancePtr)),1, &Bd1Ptr) == 0)
{
EmacPsUtilErrorTrap ("TxBDs were not ready for post processing");
return XST_FAILURE;}
Status = XEmacPs_BdRingFree(&(XEmacPs_GetTxRing(EmacPsInstancePtr)), 1, Bd1Ptr);
if (Status != XST_SUCCESS) {
EmacPsUtilErrorTrap("Error freeing up TxBDs");
return XST_FAILURE;}
return XST_SUCCESS;
}