The Raspberry Pi Pico is a very capable board, but it’s still a surprise to see bit-banged 100 MBit/s Fast Ethernet implemented on one. [Steve]’s Pico-100BASE-TX library allows an RP2040 (or RP2350) microcontroller to stream data at roughly 11 Mbyte/s, enough to implement 100 MBit/s Fast Ethernet transmission.
We’ve seen 10BASE-T implemented on a Pico, but it takes a lot more than just shoveling bits faster to get 100BASE-T working. 10BASE-T uses two voltage levels and Manchester encoding, but 100BASE-T uses three voltage levels, which [Steve] cleverly implemented on the Pico with two GPIOs, and far more complex encoding. Check out the repository’s README for details as well as a couple example applications.
[Steve] tells us that to the best of his knowledge, this is the first bit-banged 100 MBit/s Ethernet implementation using a microcontroller. It’s transmit-only — reception being an entirely different beast — but it’s possible some enterprising soul might find a solution. If you do, be sure to let us know all about it!
“at roughly 11 Mbyte/s” is not the same as “11 Mbits/s” as stated elsewhere.
MByte/s is correct, you indeed can hit full 100BASE-TX wirespeed by transmitting maximum-MTU Ethernet frames back to back with only the requireed 12 byte interframe gap in-between. (Okay, because the way the 4b5b symbols are packed in 32-bit words, the interframe gap is currently 3 bytes longer than it needs to be, but that doesn’t make much of a difference).
“11 Mbyte/s, enough to implement 100 MBit/s”
Where’s the proof reader???
Mbit/s and MByte/s – notice the caps b=bits, B=Bytes
No.
While “MB” and “Mb” in some contexts are megabytes and megabits by convention, it’s not a standard, and it’s completely irrelevant when the whole word is written out.
Using MB for megabytes, and Mb for megabits, IS a standard. See IEEE 1541.
I suppose it might matter whether you count the IEEE as a standards body, but most here would, I think…
And that is entirely irrelevant, because the full words were explicitly stated. So the original criticism was still completely wrong.
Your article does not mention this implementation:
https://github.com/holysnippet/pico_eth_doc
It is 10BASE-T, TX AND RX with the lwIP stack (the same stack used by the Pico W 1 & 2).
The 10BASE-T implementation you mention does not provide an IP stack, and UDP packets
are assembled manually.
Interestingly pico_eth_doc is also from 2022 but somehow flew under the radar.
Yes, I don’t understand why. I thought I would bring people together to help me develop the idea, make a small test program, write bindings for MicroPython, transfer everything to RP2350…
I ended up telling myself that it was easier to buy a Wiznet module, as there was a lot of advertising for them at the time.
It’s a bit of a regret, as it’s an interesting project that uses the PIO and has the same IP stack as the W version of the Picos. (What’s developed for the Picos W can be used with this Ethernet implementation without too many modifications). The whole thing only used 3 pins.
I don’t publish my Pico-based assemblies and software much anymore. I thought it was a pretty good idea, but no one was interested.
Publishing code for the acclaim seems like a surefire recipe for disappointment.
I wasn’t looking for acclaim, I just wanted to do something useful that people would find a use for and participate in developing. The Pico is a really great platform, and I thought it was awesome to be able to get Ethernet connectivity for the price of an external transformer (which you can unsolder from an old motherboard or network card). A hack, eh?
Hey this one is from Steve Markgraf! He got us https://hackaday.com/2024/06/01/use-that-one-port-for-high-speed-fpga-data-export/ 180MB/s data capture using $12 Ms2130 USB 3.0 HDMI dongle and recently (start of 2025) added 175MB/s pico2 support https://github.com/steve-m/hsdaoh-rp2350
And now this lovely hack! Sadly 100Mbit might be the limit for bitbanging ethernet. While 1Gbit uses easily reachable 125MHz clock it also does full duplex requiring echo cancellation and I dont see an easy way around external PHY. The next challenge is implementing pico GRMII PHY support for that sweet $1 RTL8211 1Gbit. I havent seen that done yet.
Since this is TX only I think the real use for such an amazing device was not mentioned. It can be used for logging only to a secure central log server. If there is no way to RX packets from a logging server, there is no easy way to own that server remotely :)