diff --git a/libraries/Ethernet/src/Ethernet.cpp b/libraries/Ethernet/src/Ethernet.cpp index 0f9effb1a..3eea69a2a 100644 --- a/libraries/Ethernet/src/Ethernet.cpp +++ b/libraries/Ethernet/src/Ethernet.cpp @@ -16,8 +16,10 @@ int EthernetClass::begin(uint8_t *mac_address) // Initialise the basic info W5100.init(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.setMACAddress(mac_address); W5100.setIPAddress(IPAddress(0,0,0,0).raw_address()); + SPI.endTransaction(); // Now try to get our config info from a DHCP server int ret = _dhcp->beginWithDHCP(mac_address); @@ -25,9 +27,11 @@ int EthernetClass::begin(uint8_t *mac_address) { // We've successfully found a DHCP server and got our configuration info, so set things // accordingly + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.setIPAddress(_dhcp->getLocalIp().raw_address()); W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address()); W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address()); + SPI.endTransaction(); _dnsServerAddress = _dhcp->getDnsServerIp(); } @@ -61,10 +65,12 @@ void EthernetClass::begin(uint8_t *mac_address, IPAddress local_ip, IPAddress dn void EthernetClass::begin(uint8_t *mac, IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet) { W5100.init(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.setMACAddress(mac); W5100.setIPAddress(local_ip.raw_address()); W5100.setGatewayIp(gateway.raw_address()); W5100.setSubnetMask(subnet.raw_address()); + SPI.endTransaction(); _dnsServerAddress = dns_server; } @@ -80,9 +86,11 @@ int EthernetClass::maintain(){ case DHCP_CHECK_RENEW_OK: case DHCP_CHECK_REBIND_OK: //we might have got a new IP. + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.setIPAddress(_dhcp->getLocalIp().raw_address()); W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address()); W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address()); + SPI.endTransaction(); _dnsServerAddress = _dhcp->getDnsServerIp(); break; default: @@ -96,21 +104,27 @@ int EthernetClass::maintain(){ IPAddress EthernetClass::localIP() { IPAddress ret; + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.getIPAddress(ret.raw_address()); + SPI.endTransaction(); return ret; } IPAddress EthernetClass::subnetMask() { IPAddress ret; + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.getSubnetMask(ret.raw_address()); + SPI.endTransaction(); return ret; } IPAddress EthernetClass::gatewayIP() { IPAddress ret; + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.getGatewayIp(ret.raw_address()); + SPI.endTransaction(); return ret; } diff --git a/libraries/Ethernet/src/utility/socket.cpp b/libraries/Ethernet/src/utility/socket.cpp index ff2ec3d78..4ed4317ea 100644 --- a/libraries/Ethernet/src/utility/socket.cpp +++ b/libraries/Ethernet/src/utility/socket.cpp @@ -12,6 +12,7 @@ uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag) if ((protocol == SnMR::TCP) || (protocol == SnMR::UDP) || (protocol == SnMR::IPRAW) || (protocol == SnMR::MACRAW) || (protocol == SnMR::PPPOE)) { close(s); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.writeSnMR(s, protocol | flag); if (port != 0) { W5100.writeSnPORT(s, port); @@ -22,7 +23,7 @@ uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag) } W5100.execCmdSn(s, Sock_OPEN); - + SPI.endTransaction(); return 1; } @@ -32,7 +33,10 @@ uint8_t socket(SOCKET s, uint8_t protocol, uint16_t port, uint8_t flag) uint8_t socketStatus(SOCKET s) { - return W5100.readSnSR(s); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); + uint8_t status = W5100.readSnSR(s); + SPI.endTransaction(); + return status; } @@ -41,8 +45,10 @@ uint8_t socketStatus(SOCKET s) */ void close(SOCKET s) { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.execCmdSn(s, Sock_CLOSE); W5100.writeSnIR(s, 0xFF); + SPI.endTransaction(); } @@ -52,9 +58,13 @@ void close(SOCKET s) */ uint8_t listen(SOCKET s) { - if (W5100.readSnSR(s) != SnSR::INIT) + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); + if (W5100.readSnSR(s) != SnSR::INIT) { + SPI.endTransaction(); return 0; + } W5100.execCmdSn(s, Sock_LISTEN); + SPI.endTransaction(); return 1; } @@ -76,9 +86,11 @@ uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port) return 0; // set destination IP + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.writeSnDIPR(s, addr); W5100.writeSnDPORT(s, port); W5100.execCmdSn(s, Sock_CONNECT); + SPI.endTransaction(); return 1; } @@ -91,7 +103,9 @@ uint8_t connect(SOCKET s, uint8_t * addr, uint16_t port) */ void disconnect(SOCKET s) { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.execCmdSn(s, Sock_DISCON); + SPI.endTransaction(); } @@ -113,17 +127,21 @@ uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len) // if freebuf is available, start. do { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); freesize = W5100.getTXFreeSize(s); status = W5100.readSnSR(s); + SPI.endTransaction(); if ((status != SnSR::ESTABLISHED) && (status != SnSR::CLOSE_WAIT)) { ret = 0; break; } + yield(); } while (freesize < ret); // copy data + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.send_data_processing(s, (uint8_t *)buf, ret); W5100.execCmdSn(s, Sock_SEND); @@ -133,12 +151,17 @@ uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len) /* m2008.01 [bj] : reduce code */ if ( W5100.readSnSR(s) == SnSR::CLOSED ) { + SPI.endTransaction(); close(s); return 0; } + SPI.endTransaction(); + yield(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); } /* +2008.01 bj */ W5100.writeSnIR(s, SnIR::SEND_OK); + SPI.endTransaction(); return ret; } @@ -152,6 +175,7 @@ uint16_t send(SOCKET s, const uint8_t * buf, uint16_t len) int16_t recv(SOCKET s, uint8_t *buf, int16_t len) { // Check how much data is available + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); int16_t ret = W5100.getRXReceivedSize(s); if ( ret == 0 ) { @@ -178,13 +202,17 @@ int16_t recv(SOCKET s, uint8_t *buf, int16_t len) W5100.recv_data_processing(s, buf, ret); W5100.execCmdSn(s, Sock_RECV); } + SPI.endTransaction(); return ret; } int16_t recvAvailable(SOCKET s) { - return W5100.getRXReceivedSize(s); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); + int16_t ret = W5100.getRXReceivedSize(s); + SPI.endTransaction(); + return ret; } @@ -195,8 +223,9 @@ int16_t recvAvailable(SOCKET s) */ uint16_t peek(SOCKET s, uint8_t *buf) { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.recv_data_processing(s, buf, 1, 1); - + SPI.endTransaction(); return 1; } @@ -225,6 +254,7 @@ uint16_t sendto(SOCKET s, const uint8_t *buf, uint16_t len, uint8_t *addr, uint1 } else { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.writeSnDIPR(s, addr); W5100.writeSnDPORT(s, port); @@ -239,12 +269,17 @@ uint16_t sendto(SOCKET s, const uint8_t *buf, uint16_t len, uint8_t *addr, uint1 { /* +2008.01 [bj]: clear interrupt */ W5100.writeSnIR(s, (SnIR::SEND_OK | SnIR::TIMEOUT)); /* clear SEND_OK & TIMEOUT */ + SPI.endTransaction(); return 0; } + SPI.endTransaction(); + yield(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); } /* +2008.01 bj */ W5100.writeSnIR(s, SnIR::SEND_OK); + SPI.endTransaction(); } return ret; } @@ -264,6 +299,7 @@ uint16_t recvfrom(SOCKET s, uint8_t *buf, uint16_t len, uint8_t *addr, uint16_t if ( len > 0 ) { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); ptr = W5100.readSnRX_RD(s); switch (W5100.readSnMR(s) & 0x07) { @@ -318,6 +354,7 @@ uint16_t recvfrom(SOCKET s, uint8_t *buf, uint16_t len, uint8_t *addr, uint16_t break; } W5100.execCmdSn(s, Sock_RECV); + SPI.endTransaction(); } return data_len; } @@ -341,6 +378,7 @@ uint16_t igmpsend(SOCKET s, const uint8_t * buf, uint16_t len) if (ret == 0) return 0; + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.send_data_processing(s, (uint8_t *)buf, ret); W5100.execCmdSn(s, Sock_SEND); @@ -350,18 +388,24 @@ uint16_t igmpsend(SOCKET s, const uint8_t * buf, uint16_t len) { /* in case of igmp, if send fails, then socket closed */ /* if you want change, remove this code. */ + SPI.endTransaction(); close(s); return 0; } + SPI.endTransaction(); + yield(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); } W5100.writeSnIR(s, SnIR::SEND_OK); + SPI.endTransaction(); return ret; } uint16_t bufferData(SOCKET s, uint16_t offset, const uint8_t* buf, uint16_t len) { uint16_t ret =0; + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); if (len > W5100.getTXFreeSize(s)) { ret = W5100.getTXFreeSize(s); // check size not to exceed MAX size. @@ -371,6 +415,7 @@ uint16_t bufferData(SOCKET s, uint16_t offset, const uint8_t* buf, uint16_t len) ret = len; } W5100.send_data_processing_offset(s, offset, buf, ret); + SPI.endTransaction(); return ret; } @@ -386,14 +431,17 @@ int startUDP(SOCKET s, uint8_t* addr, uint16_t port) } else { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.writeSnDIPR(s, addr); W5100.writeSnDPORT(s, port); + SPI.endTransaction(); return 1; } } int sendUDP(SOCKET s) { + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); W5100.execCmdSn(s, Sock_SEND); /* +2008.01 bj */ @@ -403,12 +451,17 @@ int sendUDP(SOCKET s) { /* +2008.01 [bj]: clear interrupt */ W5100.writeSnIR(s, (SnIR::SEND_OK|SnIR::TIMEOUT)); + SPI.endTransaction(); return 0; } + SPI.endTransaction(); + yield(); + SPI.beginTransaction(SPI_ETHERNET_SETTINGS); } /* +2008.01 bj */ W5100.writeSnIR(s, SnIR::SEND_OK); + SPI.endTransaction(); /* Sent ok */ return 1; diff --git a/libraries/Ethernet/src/utility/w5100.cpp b/libraries/Ethernet/src/utility/w5100.cpp index 7e8b6348a..a70107344 100644 --- a/libraries/Ethernet/src/utility/w5100.cpp +++ b/libraries/Ethernet/src/utility/w5100.cpp @@ -15,8 +15,6 @@ // W5100 controller instance W5100Class W5100; -#define SPI_CS 10 - #define TX_RX_MAX_BUF_SIZE 2048 #define TX_BUF 0x1100 #define RX_BUF (TX_BUF + TX_RX_MAX_BUF_SIZE) diff --git a/libraries/Ethernet/src/utility/w5100.h b/libraries/Ethernet/src/utility/w5100.h index 3b5a69336..ba72e2181 100644 --- a/libraries/Ethernet/src/utility/w5100.h +++ b/libraries/Ethernet/src/utility/w5100.h @@ -12,6 +12,14 @@ #include +#define SPI_CS 10 + +#if defined(ARDUINO_ARCH_AVR) +#define SPI_ETHERNET_SETTINGS SPISettings(4000000, MSBFIRST, SPI_MODE0) +#else +#define SPI_ETHERNET_SETTINGS SPI_CS,SPISettings(4000000, MSBFIRST, SPI_MODE0) +#endif + #define MAX_SOCK_NUM 4 typedef uint8_t SOCKET;