Skip to content

Add spi support #199

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 66 additions & 28 deletions src/Ethernet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,31 +23,69 @@
#include "utility/w5100.h"
#include "Dhcp.h"

#ifdef CONFIG_IDF_TARGET_ESP32
#ifdef ETH_USE_HSPI
SPIClass spiETH = SPIClass(HSPI);
#elif defined(ETH_USE_FSPI)
SPIClass spiETH = SPIClass(FSPI);
#else // use default VSPI port
SPIClass spiETH = SPIClass(VSPI);
#endif
#else
#ifdef ETH_USE_HSPI
SPIClass spiETH = SPIClass(HSPI);
#elif defined(ETH_USE_FSPI)
SPIClass spiETH = SPIClass(FSPI);
#else // use FSPI port
#ifdef ARDUINO_ARCH_SAMD
SPIClassSAMD spiETH = SPI;
#else
SPIClass spiETH = SPI;
#endif
#endif
#endif

IPAddress EthernetClass::_dnsServerAddress;
DhcpClass* EthernetClass::_dhcp = NULL;

/***************************************************************************************
** Function name: getSPIinstance
** Description: Get the instance of the SPI class
***************************************************************************************/
#ifdef ARDUINO_ARCH_SAMD
SPIClassSAMD& EthernetClass::getSPIinstance(void)
{
return spiETH;
}
#else
SPIClass& EthernetClass::getSPIinstance(void)
{
return spiETH;
}
#endif

int EthernetClass::begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout)
{
static DhcpClass s_dhcp;
_dhcp = &s_dhcp;

// Initialise the basic info
if (W5100.init() == 0) return 0;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setMACAddress(mac);
W5100.setIPAddress(IPAddress(0,0,0,0).raw_address());
SPI.endTransaction();
spiETH.endTransaction();

// Now try to get our config info from a DHCP server
int ret = _dhcp->beginWithDHCP(mac, timeout, responseTimeout);
if (ret == 1) {
// We've successfully found a DHCP server and got our configuration
// info, so set things accordingly
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setIPAddress(_dhcp->getLocalIp().raw_address());
W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address());
W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address());
SPI.endTransaction();
spiETH.endTransaction();
_dnsServerAddress = _dhcp->getDnsServerIp();
socketPortRand(micros());
}
Expand Down Expand Up @@ -81,7 +119,7 @@ void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress g
void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
{
if (W5100.init() == 0) return;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setMACAddress(mac);
#ifdef ESP8266
W5100.setIPAddress(&ip[0]);
Expand All @@ -96,7 +134,7 @@ void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress g
W5100.setGatewayIp(gateway._address);
W5100.setSubnetMask(subnet._address);
#endif
SPI.endTransaction();
spiETH.endTransaction();
_dnsServerAddress = dns;
}

Expand Down Expand Up @@ -138,11 +176,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);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setIPAddress(_dhcp->getLocalIp().raw_address());
W5100.setGatewayIp(_dhcp->getGatewayIp().raw_address());
W5100.setSubnetMask(_dhcp->getSubnetMask().raw_address());
SPI.endTransaction();
spiETH.endTransaction();
_dnsServerAddress = _dhcp->getDnsServerIp();
break;
default:
Expand All @@ -156,82 +194,82 @@ int EthernetClass::maintain()

void EthernetClass::MACAddress(uint8_t *mac_address)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.getMACAddress(mac_address);
SPI.endTransaction();
spiETH.endTransaction();
}

IPAddress EthernetClass::localIP()
{
IPAddress ret;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.getIPAddress(ret.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
return ret;
}

IPAddress EthernetClass::subnetMask()
{
IPAddress ret;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.getSubnetMask(ret.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
return ret;
}

IPAddress EthernetClass::gatewayIP()
{
IPAddress ret;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.getGatewayIp(ret.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
return ret;
}

void EthernetClass::setMACAddress(const uint8_t *mac_address)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setMACAddress(mac_address);
SPI.endTransaction();
spiETH.endTransaction();
}

void EthernetClass::setLocalIP(const IPAddress local_ip)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
IPAddress ip = local_ip;
W5100.setIPAddress(ip.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
}

void EthernetClass::setSubnetMask(const IPAddress subnet)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
IPAddress ip = subnet;
W5100.setSubnetMask(ip.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
}

void EthernetClass::setGatewayIP(const IPAddress gateway)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
IPAddress ip = gateway;
W5100.setGatewayIp(ip.raw_address());
SPI.endTransaction();
spiETH.endTransaction();
}

void EthernetClass::setRetransmissionTimeout(uint16_t milliseconds)
{
if (milliseconds > 6553) milliseconds = 6553;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setRetransmissionTime(milliseconds * 10);
SPI.endTransaction();
spiETH.endTransaction();
}

void EthernetClass::setRetransmissionCount(uint8_t num)
{
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.setRetransmissionCount(num);
SPI.endTransaction();
spiETH.endTransaction();
}


Expand Down
14 changes: 14 additions & 0 deletions src/Ethernet.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@


#include <Arduino.h>
#include <SPI.h>
#include "Client.h"
#include "Server.h"
#include "Udp.h"
Expand Down Expand Up @@ -108,6 +109,13 @@ class EthernetClass {
friend class EthernetClient;
friend class EthernetServer;
friend class EthernetUDP;

#ifdef ARDUINO_ARCH_SAMD
static SPIClassSAMD& getSPIinstance(void); // Get SPI class handle
#else
static SPIClass& getSPIinstance(void); // Get SPI class handle
#endif

private:
// Opens a socket(TCP or UDP or IP_RAW mode)
static uint8_t socketBegin(uint8_t protocol, uint16_t port);
Expand Down Expand Up @@ -259,6 +267,12 @@ class EthernetServer : public Server {
EthernetClient available();
EthernetClient accept();
virtual void begin();
#ifdef ESP32
void begin(uint16_t port)
{
_port = port;
}
#endif
virtual size_t write(uint8_t);
virtual size_t write(const uint8_t *buf, size_t size);
virtual operator bool();
Expand Down
12 changes: 6 additions & 6 deletions src/EthernetClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -182,9 +182,9 @@ uint16_t EthernetClient::localPort()
{
if (_sockindex >= MAX_SOCK_NUM) return 0;
uint16_t port;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
port = W5100.readSnPORT(_sockindex);
SPI.endTransaction();
spiETH.endTransaction();
return port;
}

Expand All @@ -194,9 +194,9 @@ IPAddress EthernetClient::remoteIP()
{
if (_sockindex >= MAX_SOCK_NUM) return IPAddress((uint32_t)0);
uint8_t remoteIParray[4];
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
W5100.readSnDIPR(_sockindex, remoteIParray);
SPI.endTransaction();
spiETH.endTransaction();
return IPAddress(remoteIParray);
}

Expand All @@ -206,8 +206,8 @@ uint16_t EthernetClient::remotePort()
{
if (_sockindex >= MAX_SOCK_NUM) return 0;
uint16_t port;
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
spiETH.beginTransaction(SPI_ETHERNET_SETTINGS);
port = W5100.readSnDPORT(_sockindex);
SPI.endTransaction();
spiETH.endTransaction();
return port;
}
Loading