Ethernet optimisation
Hello,
I just have to write this down because after a day spent trying to improve ethernet performance I found out quite some things about libraries.
I am not very technical, I am more like an explorer though, so maybe some little unprecision is possible. As usual I will write what worked for me.
The ethernet expansion is connected to the SPI bus and it uses pin 4 as SS select.
It works out of the box, ie. the Industruino version is already setup to operate with this extension.
Some of the features are not set and I had to explore to find out how to make them work.
One of the most important things is to set this parameter:
#define W5500_ETHERNET_SHIELD
which tells the library that our ethernet chip is indeed a w5500.
This will tell the library to get its routines from utility/w5500.h
The the instance of the class W5500 is called W5100 so you don't have to bother:
// W5500 controller instance
W5500Class W5100;
The optimization functions of the W5100 class are:
W5100.setRetransmissionTime(iuint16_t timeout);
W5100.setRetransmissionCount(uint8_t count);
These are used to reduce the timeout of the ethernet.begin() function when using DHCP.
client.setTimeout(500);
This sets the timeout of the client.connect() call.
In order to have these functions working, I had to do the following:
- define the following before the library declaration:
#define W5500_ETHERNET_SHIELD
#define REL_GR_KURUMI
#define SS 4
The REL_GR_KURUMI constant tells the library to use SS as select. I had to define explicitly SS as 4 because in some instances I got different values, ie. 17
Actually the W5500 library has a __AVR_AT90USB1286__ constant, but I think this is related to a different hardware setup and it doesn't work.
After all this, with the functions still not working, I had to init the chip by using W5100.init(); which does the following:
void W5500Class::init(void)
{initSS();
delay(300);
SPI.begin();for (int i=0; i<MAX_SOCK_NUM; i++) {
uint8_t cntl_byte = (0x0C + (i<<5));
write( 0x1E, cntl_byte, 2); //0x1E - Sn_RXBUF_SIZE
write( 0x1F, cntl_byte, 2); //0x1F - Sn_TXBUF_SIZE
}
}
Sounds greek to me, but after this the chip started operating normally with the optimization functions, so maybe some of the previous steps might be redundant. I haven't tried every combination thereof.
So the final setup for my network is as follows:
typedef uint8_t SOCKET;
#include <SPI.h>#define W5500_ETHERNET_SHIELD
#define REL_GR_KURUMI
#define SS 4#include <EthernetIndustruino.h>
#include <EthernetUdp.h>
//#include <utility/w5100.h>
// this must be unique
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x59, 0x00 };
// Edit buffer for IPAddress
IPAddress editBuf;EthernetClient client;
EthernetServer server(80);
The setup routine:
W5100.init();
//set timeout for network connect
W5100.setRetransmissionTime(0x07D0); //200ms
W5100.setRetransmissionCount(5); //5 triesEthernet.begin(mac);
//set timeout for server connection
client.setTimeout(500);
Hope this is useful, as I spent quite some time to figure it out!
Your answer
Please try to give a substantial answer. If you wanted to comment on the question or answer, just use the commenting tool. Please remember that you can always revise your answers - no need to answer the same question twice. Also, please don't forget to vote - it really helps to select the best questions and answers!
Keep Informed
About This Forum
This community is for professionals and enthusiasts of our products and services.
Read GuidelinesQuestion tools
Stats
| Asked: 3/13/17, 6:27 PM |
| Seen: 4361 times |
| Last updated: 3/13/17, 6:27 PM |