реклама на сайте
подробности

 
 
> Zynq - ошибка при передаче пакета Ethernet, Не обновляются данные в передающем буфере
Nivovod
сообщение Feb 15 2016, 15:06
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 16-06-10
Пользователь №: 57 971



Есть массив в который я пишу данные для передачи, добавляю в его начало TCP, IP заголовки, Ethernet фреймы. Затем ссылку на этот массив указываю в дескрипторе и включаю данный дескриптор на передачу. И пакет нормально уходит в сеть. Но изредка (с периодом от 1 секунды до 3-х минут) в сеть уходит пакет, содержащий первые 68 байт предыдущего пакета, а остальную часть пакета текущую. А так как в этих первых 68 байтах содержатся все заголовки TCP, IP, то TCP сессия нарушается. Не понимаю почему так происходит. Специально проверяю содержимое массива перед командой запуска на передачу. Все данные в массиве правильные! И почему все время портятся именно первые и именно 68 байт?
Может кто сталкивался? Может у кого есть безошибочный код приема/передачи по ethernet для zynq?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Nivovod
сообщение Feb 16 2016, 08:25
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 38
Регистрация: 16-06-10
Пользователь №: 57 971



Добавлю функцию, которой отправляю данные
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;
}
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 14:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01375 секунд с 7
ELECTRONIX ©2004-2016