Using Sn_IR RECV bit instead of Sn_RX_RSR


#1

I have written drivers for the W5100 chip. I use the Sn_IR RECV bit to sense when new data has been received. For UDP packets, I read the packet length (offset 6 and 7 bytes from the packet start) and with that information I process the UDP packet. I then clear the Sn_IR RECV bit by writing ‘1’. I update the Sn_RX_RD value (incrementing by the packet length, plus the 8 bytes for the UDP packet header), and finally complete the receive operation by sending the RECV command (0x40) to Sn_CR.

For the W5100, if there is more received data (either new or that was already received when I checked the Sn_IR RECV bit) the Sn_IR RECV bit is again asserted (==‘1’) after the RECV command. In this way, I can reliably use the socket receive interrupt to sense data.

The datasheet for the W5200 suggests using the Sn_RX_RSR register to determine when data has been received. It specifically points to potential problems using Sn_IR RECV. Does the W5200 function differently than the W5100 in this way? Am I correct that if I do not process all received data, or if new data arrives during processing, after the RECV command is sent, Sn_IR RECV bit will again be set?


#2

Hi, ags.

W5100 and W5200 are same structure. So receiving process should be same.

And when receive data if you do not process prior received data, Sn_IR(recv) isn’t set as 1 after clearing Sn_IR(recv) bit automatically. It is overlapped.

So, we recommend using Sn_IR and Sn_RX_RSR both.

Best regards.