Я знаю, что он старый, но в прошлом году я сделал это с пряностями, поэтому подведу итоги для пользы других людей.
Во-первых, я бы не стал использовать W5100, но его брата W5500 , который в основном является ревизией и использует SPI намного лучше. Я также хотел бы рассмотреть возможность переключения на часть с DMA, особенно если вы хотите сделать это только UDP.
В обоих случаях вы, вероятно, будете использовать стек TCP / IP Microchip MLA, Wiznet предлагает патчи для этого.
К сожалению, все варианты стека Microchip TCP / IP, по-видимому, блокируют связь через SPI (без DMA, без расширенного режима буфера) . Я попытался сократить его только до UDP и обрезать всю часть микрочипа (используя непосредственно драйвер wiznet и переписывая его в процессе).
Я также согласен с MJH в том, что PIC18F97J60 с поддержкой DMA является лучшим выбором, чем более дешевый PIC с ENC (если только у вас не очень высокие цифры), но я был несколько разочарован тем, что TCP / IP не использует преимущества J60, придерживаясь этого. до наименьшего общего знаменателя.
Преимущество использования IP-части вместо Ethernet-части состоит в том, что вы можете ограничить сокет определенным портом, и вам не придется передавать какой-либо несвязанный трафик по каналу SPI. W5500 имеет 4 КБ на сокет, и я использую отдельные сокеты для приема и отправки, чтобы максимизировать использование буфера.
Мой текущий стек UDP реагирует только на прерывание wiznet и не загружает данные полезной нагрузки, в которых он не нуждается. Я использую это UDP, хотя на основе пакетов (без потоков), и использую широковещательные сообщения на портах для отправки (чтобы избежать необходимости кэшировать данные MAC для целей ARP, хотя в ретроспективе это, возможно, не лучшая оптимизация).
На 60MIPS dspice двусторонняя передача (получение небольшого пакета, ответ небольшим пакетом) занимает около 100-120us, из которых около 10-12us - это время процессора в трех разных блоках (pre-receive (3-5us), post-receive и presend (В зависимости от нас 5-7) и после отправки (2us). После каждых 2 килобайт я должен выполнить какое-то обслуживание, которое составляет около 40us времени стены и 5us времени процессора.
Короткие команды выполняются с использованием расширенного буфера. Более длительное время выполняется с использованием DMA (в dspice DMA требуется 2 бита времени между байтами (или словами в 16-битном режиме), расширенный буфер - нет).
Набор (пока) не открыт, но если sb нужны указатели, пожалуйста, ответьте в комментариях. Я планирую портировать стек на pic32 (мк) в следующем году.