arduino-libraries / Ethernet

Ethernet Library for Arduino
http://arduino.cc/
252 stars 254 forks source link

Register addresses for W5500 are not correct #140

Open gudnimg opened 4 years ago

gudnimg commented 4 years ago

See https://github.com/arduino-libraries/Ethernet/issues/84 I want to break the issue into a smaller part since the original issue has more proposed changes than this.

This issue relates only to the wrong addresses and nothing more. This is important because the Arduino Ethernet Shield 2 uses W5500 chip (no official Arduino shield uses W5100 anymore from what I can tell).

The register addresses for W5500 can be found in the datasheet (v1.0.9) at page 29 / 66 (I posted an image below)


Current w5100.h

__GP_REGISTER16(RTR, 0x0017);      // Timeout address
__GP_REGISTER8 (RCR, 0x0019);      // Retry count
__GP_REGISTER8 (RMSR, 0x001A);     // Receive memory size (W5100 only)
__GP_REGISTER8 (TMSR, 0x001B);     // Transmit memory size (W5100 only)
__GP_REGISTER8 (PATR, 0x001C);     // Authentication type address in PPPoE mode
__GP_REGISTER8 (PTIMER, 0x0028);   // PPP LCP Request Timer
__GP_REGISTER8 (PMAGIC, 0x0029);   // PPP LCP Magic Number
__GP_REGISTER_N(UIPR, 0x002A, 4);  // Unreachable IP address in UDP mode (W5100 only)
__GP_REGISTER16(UPORT, 0x002E);    // Unreachable Port address in UDP mode (W5100 only)

Proposed changes to w5100.h

__GP_REGISTER16(RTR, 0x0019);           // Timeout address
__GP_REGISTER8 (RCR, 0x001B);           // Retry count
__GP_REGISTER8 (PTIMER, 0x001C);        // PPP LCP Request Timer
__GP_REGISTER8 (PMAGIC, 0x001D);        // PPP LCP Magic Number
__GP_REGISTER_N(PHAR, 0x001E, 6);       // PPP Destination MAC address
__GP_REGISTER16(PSID, 0x0024);          // PPP Session ID
__GP_REGISTER16(PMRU, 0x0026);          // PPP Maximum Segment Size
__GP_REGISTER_N(UIPR, 0x0028, 4);       // Unreachable IP address in UDP mode (W5500 only)
__GP_REGISTER16(UPORT, 0x002C);         // Unreachable Port address in UDP mode (W5500 only)
__GP_REGISTER8 (PHYCFGR_W5500, 0x002E); // PHY Configuration register, default: 10111xxx

Notice above how

This would fix an issue where setRetransmissionTime() has no effect on W5500. Only problem left to solve is to differentiate between RTR address for W5100 and W5500.

Quick view at the register map for W5500: image

For comparison here are the W5100 registers

image

masterx1981 commented 3 years ago

Thanks for spotting it. I've asked a pull request with a fix for it.

fkromer commented 2 years ago

Hey guys, when do you plan to merge and release these fixes 😏