Skip to content

Commit 1459f0e

Browse files
committed
make hardwareStatus() and linkStatus() work without Erhernet.begin(mac)
1 parent 7b06101 commit 1459f0e

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

src/Ethernet.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,14 @@ int UIPEthernetClass::maintain(){
132132

133133
EthernetLinkStatus UIPEthernetClass::linkStatus()
134134
{
135-
if (!(initialized && Enc28J60Network::getrev()))
135+
if (!Enc28J60Network::getrev())
136136
return Unknown;
137137
return Enc28J60Network::linkStatus() ? LinkON : LinkOFF;
138138
}
139139

140140
EthernetHardwareStatus UIPEthernetClass::hardwareStatus()
141141
{
142-
if (!(initialized && Enc28J60Network::getrev()))
142+
if (!Enc28J60Network::getrev())
143143
return EthernetNoHardware;
144144
return EthernetENC28J60;
145145
}

src/utility/Enc28J60Network.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,22 +38,30 @@ extern "C" {
3838

3939
#define SPI_ETHERNET_SETTINGS SPISettings(20000000, MSBFIRST, SPI_MODE0)
4040
//
41+
bool Enc28J60Network::spiInitialized=false;
4142
uint8_t Enc28J60Network::csPin=SS;
4243
uint16_t Enc28J60Network::nextPacketPtr;
4344
uint8_t Enc28J60Network::bank=0xff;
4445

4546
struct memblock Enc28J60Network::receivePkt;
4647

48+
void Enc28J60Network::initSPI()
49+
{
50+
if (spiInitialized)
51+
return;
52+
pinMode(csPin, OUTPUT);
53+
CSPASSIVE;
54+
SPI.begin();
55+
spiInitialized = true;
56+
}
57+
4758
bool Enc28J60Network::init(uint8_t* macaddr)
4859
{
4960

5061
MemoryPool::init(); // 1 byte in between RX_STOP_INIT and pool to allow prepending of controlbyte
51-
// initialize I/O
52-
// ss as output:
53-
pinMode(csPin, OUTPUT);
54-
CSPASSIVE; // ss=0
55-
//
56-
SPI.begin();
62+
63+
initSPI();
64+
5765
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
5866

5967
// perform system reset
@@ -234,7 +242,7 @@ Enc28J60Network::sendPacket(memhandle handle)
234242
writeRegPair(ETXSTL, start);
235243
// Set the TXND pointer to correspond to the packet size given
236244
writeRegPair(ETXNDL, end);
237-
245+
238246
bool success = false;
239247
// See Rev. B7 Silicon Errata issues 12 and 13
240248
for (uint8_t retry = 0; retry < TX_COLLISION_RETRY_COUNT; retry++)
@@ -272,7 +280,7 @@ Enc28J60Network::setReadPtr(memhandle handle, memaddress position, uint16_t len)
272280
memaddress start = handle == UIP_RECEIVEBUFFERHANDLE && packet->begin + position > RXSTOP_INIT ? packet->begin + position-((RXSTOP_INIT + 1)-RXSTART_INIT) : packet->begin + position;
273281

274282
writeRegPair(ERDPTL, start);
275-
283+
276284
if (len > packet->size - position)
277285
len = packet->size - position;
278286
return len;
@@ -544,6 +552,7 @@ Enc28J60Network::clkout(uint8_t clk)
544552
uint8_t
545553
Enc28J60Network::getrev(void)
546554
{
555+
initSPI();
547556
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
548557
uint8_t res = readReg(EREVID);
549558
if (res == 0xFF) {

src/utility/Enc28J60Network.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ class Enc28J60Network : public MemoryPool
4646

4747
private:
4848
static uint8_t csPin;
49+
static bool spiInitialized;
4950

5051
static uint16_t nextPacketPtr;
5152
static uint8_t bank;
@@ -78,6 +79,7 @@ class Enc28J60Network : public MemoryPool
7879
static bool linkStatus();
7980

8081
static void setCsPin(uint8_t _csPin) {csPin = _csPin;}
82+
static void initSPI();
8183
static bool init(uint8_t* macaddr);
8284
static memhandle receivePacket();
8385
static void freePacket();

0 commit comments

Comments
 (0)