ENC28J60 пропускает пакеты

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Megakoteyka, 29 янв 2015.

  1. Megakoteyka

    Megakoteyka Оракул Модератор

    На приборе стоит enc28j60 Rev.B7.
    Приемный буфер 6 Кб, включена фильтрация по MAC.
    На прибор выдаются пакеты UDP по 512 байт данных с интервалом 50 мс (в идеале нужно 20 мс).
    Из 512 пакетов принимается максимум 503 (это видно и по счетчику прерываний, и по счетчикам в обработчике стека). По каждому прерыванию делается попытка прочитать все имеющиеся пакеты из буфера, так что возможный пропуск прерывания не должен привести к глюкам.
    За основу библиотеки взяты arduino uIP и etherCard, код переписан на C и немного модифицирован под архитектуру. Алгоритмы не менял.
    Между компьютером и прибором проброшен кабель напрямую, без коммутаторов.
    На сниффере видно, что все пакеты с компа выходят.

    Пакет читаю так:
    Код (Text):
    uint16_t ENC28j60_recv_packet(uint8_t *buf, uint16_t buflen)
    {
        uint16_t len = 0, rxlen, status, temp;
        uint8_t    buf_uint16[2];

        uint8_t pktcnt = ENC28j60_rcr(EPKTCNT);

        if(pktcnt)
        {
            ENC28j60_wcr16(ERDPT, ENC28j60_rxrdpt);

            ENC28j60_read_buffer((void*)&buf_uint16, sizeof(buf_uint16));
            ENC28j60_rxrdpt = buf_uint16[0] | (buf_uint16[1] << 8);

            ENC28j60_read_buffer((void*)&buf_uint16, sizeof(buf_uint16));
            rxlen = buf_uint16[0] | (buf_uint16[1] << 8);

            ENC28j60_read_buffer((void*)&buf_uint16, sizeof(buf_uint16));
            status = buf_uint16[0] | (buf_uint16[1] << 8);

            if(status & 0x80) //success
            {
                len = rxlen - 4; //throw out crc
                if(len > buflen)
                    len = buflen;
                ENC28j60_read_buffer(buf, len);  
            }

            // Set Rx read pointer to next packet
            temp = (ENC28j60_rxrdpt - 1) & ENC28j60_BUFEND;
            ENC28j60_wcr16(ERXRDPT, temp);

            // Decrement packet counter
            ENC28j60_bfs(ECON2, ECON2_PKTDEC);
        }

        return len;
    }
    У кого-нибудь были похожие проблемы с пропуском пакетов микросхемой?
     
    Последнее редактирование: 29 янв 2015