Ich weiß, dass es alt ist, aber ich habe dies letztes Jahr mit einem Gewürz getan, also werde ich es zum Nutzen anderer zusammenfassen.
Erstens würde ich den W5100 nicht verwenden, aber seinen Bruder W5500 , der im Grunde eine Revision ist und den SPI viel besser nutzt. Ich würde auch in Betracht ziehen, zu einem Teil mit DMA zu wechseln, insbesondere wenn Sie es nur UDP machen möchten.
In beiden Fällen werden Sie wahrscheinlich den Microchip MLA TCP / IP-Stack verwenden. Wiznet stellt hierfür Patches bereit.
Leider scheinen alle Microchip TCP / IP-Stack-Varianten die Kommunikation über SPI zu blockieren (kein DMA, kein erweiterter Puffermodus) . Ich habe versucht, es nur auf UDP zu reduzieren und den gesamten Mikrochip-Teil abgeschnitten (indem ich den zugrunde liegenden Wiznet-Treiber direkt verwendet und ihn dabei neu geschrieben habe).
Ich stimme auch MJH zu, dass der DMA-fähige PIC18F97J60 eine bessere Wahl ist als ein billigerer PIC mit ENC (es sei denn, Ihre Zahlen sind wirklich hoch), aber ich war etwas enttäuscht, dass der TCP / IP die Vorteile des J60 nicht wirklich nutzt auf den kleinsten gemeinsamen Nenner.
Die Verwendung eines IP-Teils anstelle eines Ethernet-Teils hat den Vorteil, dass Sie einen Socket auf einen bestimmten Port beschränken können und keinen unabhängigen Datenverkehr über Ihre SPI-Verbindung übertragen müssen. Der W5500 hat 4 KB pro Socket, und ich verwende separate Sockets zum Empfangen und Senden, um die Pufferauslastung zu maximieren.
Mein aktueller UDP-Stack reagiert nur auf den Wiznet-Interrupt und lädt keine nicht benötigten Nutzdaten herunter. Ich verwende es UDP, paketbasiert (keine Streams), und verwende Broadcasts an Ports zum Senden (um zu vermeiden, dass MAC-Daten für ARP-Zwecke zwischengespeichert werden müssen, obwohl dies im Nachhinein möglicherweise nicht die beste Opimisierung ist).
Auf dem 60MIPS-Dspice dauert ein Roundtrip (Empfangen eines kleinen Pakets, Antworten mit einem kleinen Paket) ungefähr 100-120us, von denen ungefähr 10-12us CPU-Zeit in drei verschiedenen Blöcken ist (Pre-Receive (3-5us), Post-Receive und Presend (5-7 us abhängig) und post send (2us). Einmal alle 2kb muss ich einige Wartungsarbeiten durchführen, die ungefähr 40us Wandzeit und 5us CPU Zeit sind.
Kurze Befehle werden mit erweitertem Puffer ausgeführt. Länger werden mit DMA verwendet (bei dspice benötigt DMA 2 Bit Zeit zwischen Bytes (oder Wörtern im 16-Bit-Modus), erweiterter Puffer nicht).
Die Suite ist (noch) nicht geöffnet, aber wenn jdn Zeiger benötigt, antworten Sie bitte in den Kommentaren. Ich plane, den Stack im kommenden Jahr auf pic32 (mk) zu portieren.