Skip to content

Commit ef6c1a8

Browse files
committed
allow setting pins and SPI interface. For most client work, gpio0 is optional
1 parent 7798c81 commit ef6c1a8

File tree

4 files changed

+80
-40
lines changed

4 files changed

+80
-40
lines changed

src/WiFi.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121
#include "utility/wifi_drv.h"
2222
#include "WiFi.h"
2323

24+
extern SPIClass *WIFININA_SPIWIFI;
25+
extern int8_t WIFININA_SLAVESELECT, WIFININA_SLAVEREADY, WIFININA_SLAVERESET, WIFININA_SLAVEGPIO0;
26+
2427
extern "C" {
2528
#include "utility/wl_definitions.h"
2629
#include "utility/wl_types.h"
@@ -31,6 +34,23 @@ WiFiClass::WiFiClass()
3134
{
3235
}
3336

37+
void WiFiClass::setPins(int8_t cs, int8_t ready, int8_t reset, int8_t gpio0, SPIClass *spi) {
38+
WIFININA_SLAVESELECT = cs;
39+
WIFININA_SLAVEREADY = ready;
40+
WIFININA_SLAVERESET = reset;
41+
WIFININA_SLAVEGPIO0 = gpio0;
42+
WIFININA_SPIWIFI = spi;
43+
}
44+
45+
void WiFiClass::setLEDs(uint8_t red, uint8_t green, uint8_t blue) {
46+
WiFiDrv::pinMode(25, OUTPUT);
47+
WiFiDrv::pinMode(26, OUTPUT);
48+
WiFiDrv::pinMode(27, OUTPUT);
49+
WiFiDrv::analogWrite(25, red);
50+
WiFiDrv::analogWrite(26, green);
51+
WiFiDrv::analogWrite(27, blue);
52+
}
53+
3454
void WiFiClass::init()
3555
{
3656
WiFiDrv::wifiDriverInit();

src/WiFi.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#define WIFI_FIRMWARE_LATEST_VERSION "1.2.1"
2525

2626
#include <inttypes.h>
27+
#include <Arduino.h>
28+
#include <SPI.h>
2729

2830
extern "C" {
2931
#include "utility/wl_definitions.h"
@@ -259,6 +261,9 @@ class WiFiClass
259261
int ping(const char* hostname, uint8_t ttl = 128);
260262
int ping(const String &hostname, uint8_t ttl = 128);
261263
int ping(IPAddress host, uint8_t ttl = 128);
264+
265+
void setPins(int8_t cs=10, int8_t ready=7, int8_t reset=5, int8_t gpio0=6, SPIClass *spi = &SPI);
266+
void setLEDs(uint8_t red, uint8_t green, uint8_t blue);
262267
};
263268

264269
extern WiFiClass WiFi;

src/utility/spi_drv.cpp

Lines changed: 53 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,13 @@ extern "C" {
4949
#include "utility/debug.h"
5050
}
5151

52-
static uint8_t SLAVESELECT = 10; // ss
53-
static uint8_t SLAVEREADY = 7; // handshake pin
54-
static uint8_t SLAVERESET = 5; // reset pin
55-
5652
static bool inverted_reset = false;
53+
SPIClass *WIFININA_SPIWIFI=&SPI;
54+
int8_t WIFININA_SLAVESELECT = 10, WIFININA_SLAVEREADY = 7,
55+
WIFININA_SLAVERESET = 5, WIFININA_SLAVEGPIO0 = 6;
5756

5857
#define DELAY_TRANSFER()
5958

60-
#ifndef SPIWIFI
61-
#define SPIWIFI SPI
62-
#endif
63-
6459
bool SpiDrv::initialized = false;
6560

6661
void SpiDrv::begin()
@@ -70,41 +65,56 @@ void SpiDrv::begin()
7065
#endif
7166

7267
#ifdef SPIWIFI_SS
73-
SLAVESELECT = SPIWIFI_SS;
68+
WIFININA_SLAVESELECT = SPIWIFI_SS;
7469
#endif
75-
70+
7671
#ifdef SPIWIFI_ACK
77-
SLAVEREADY = SPIWIFI_ACK;
72+
WIFININA_SLAVEREADY = SPIWIFI_ACK;
7873
#endif
79-
74+
8075
#ifdef SPIWIFI_RESET
81-
SLAVERESET = (uint8_t)SPIWIFI_RESET;
76+
WIFININA_SLAVERESET = (uint8_t)SPIWIFI_RESET;
77+
#endif
78+
79+
#ifdef NINA_GPIO0
80+
WIFININA_SLAVEGPIO0 = NINA_GPIO0;
81+
#endif
82+
83+
#ifdef SPIWIFI
84+
WIFININA_SPIWIFI = &SPIWIFI;
8285
#endif
8386

8487
#ifdef ARDUINO_SAMD_MKRVIDOR4000
8588
inverted_reset = false;
8689
#else
87-
if (SLAVERESET > PINS_COUNT) {
90+
#ifdef PINS_COUNT
91+
if (WIFININA_SLAVERESET > PINS_COUNT) {
8892
inverted_reset = true;
89-
SLAVERESET = ~SLAVERESET;
93+
WIFININA_SLAVERESET = ~WIFININA_SLAVERESET;
9094
}
9195
#endif
96+
#endif
97+
98+
WIFININA_SPIWIFI->begin();
99+
pinMode(WIFININA_SLAVESELECT, OUTPUT);
100+
pinMode(WIFININA_SLAVEREADY, INPUT);
101+
pinMode(WIFININA_SLAVERESET, OUTPUT);
92102

93-
SPIWIFI.begin();
94-
pinMode(SLAVESELECT, OUTPUT);
95-
pinMode(SLAVEREADY, INPUT);
96-
pinMode(SLAVERESET, OUTPUT);
97-
pinMode(NINA_GPIO0, OUTPUT);
103+
if (WIFININA_SLAVEGPIO0 >= 0) {
104+
pinMode(WIFININA_SLAVEGPIO0, OUTPUT);
105+
digitalWrite(WIFININA_SLAVEGPIO0, HIGH);
106+
}
98107

99-
digitalWrite(NINA_GPIO0, HIGH);
100-
digitalWrite(SLAVESELECT, HIGH);
101-
digitalWrite(SLAVERESET, inverted_reset ? HIGH : LOW);
108+
digitalWrite(WIFININA_SLAVESELECT, HIGH);
109+
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? HIGH : LOW);
102110
delay(10);
103-
digitalWrite(SLAVERESET, inverted_reset ? LOW : HIGH);
111+
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? LOW : HIGH);
104112
delay(750);
105113

106-
digitalWrite(NINA_GPIO0, LOW);
107-
pinMode(NINA_GPIO0, INPUT);
114+
if (WIFININA_SLAVEGPIO0 >= 0) {
115+
digitalWrite(WIFININA_SLAVEGPIO0, LOW);
116+
pinMode(WIFININA_SLAVEGPIO0, INPUT);
117+
}
108118

109119
#ifdef _DEBUG_
110120
INIT_TRIGGER()
@@ -114,36 +124,36 @@ void SpiDrv::begin()
114124
}
115125

116126
void SpiDrv::end() {
117-
digitalWrite(SLAVERESET, inverted_reset ? HIGH : LOW);
127+
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? HIGH : LOW);
118128

119-
pinMode(SLAVESELECT, INPUT);
129+
pinMode(WIFININA_SLAVESELECT, INPUT);
120130

121-
SPIWIFI.end();
131+
WIFININA_SPIWIFI->end();
122132

123133
initialized = false;
124134
}
125135

126136
void SpiDrv::spiSlaveSelect()
127137
{
128-
SPIWIFI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
129-
digitalWrite(SLAVESELECT,LOW);
138+
WIFININA_SPIWIFI->beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
139+
digitalWrite(WIFININA_SLAVESELECT, LOW);
130140

131141
// wait for up to 5 ms for the NINA to indicate it is not ready for transfer
132142
// the timeout is only needed for the case when the shield or module is not present
133-
for (unsigned long start = millis(); (digitalRead(SLAVEREADY) != HIGH) && (millis() - start) < 5;);
143+
for (unsigned long start = millis(); (digitalRead(WIFININA_SLAVEREADY) != HIGH) && (millis() - start) < 5;);
134144
}
135145

136146

137147
void SpiDrv::spiSlaveDeselect()
138148
{
139-
digitalWrite(SLAVESELECT,HIGH);
140-
SPIWIFI.endTransaction();
149+
digitalWrite(WIFININA_SLAVESELECT,HIGH);
150+
WIFININA_SPIWIFI->endTransaction();
141151
}
142152

143153

144154
char SpiDrv::spiTransfer(volatile char data)
145155
{
146-
char result = SPIWIFI.transfer(data);
156+
char result = WIFININA_SPIWIFI->transfer(data);
147157
DELAY_TRANSFER();
148158

149159
return result; // return the received byte
@@ -197,10 +207,10 @@ char SpiDrv::readChar()
197207
return 0; \
198208
}else \
199209

200-
#define waitSlaveReady() (digitalRead(SLAVEREADY) == LOW)
201-
#define waitSlaveSign() (digitalRead(SLAVEREADY) == HIGH)
202-
#define waitSlaveSignalH() while(digitalRead(SLAVEREADY) != HIGH){}
203-
#define waitSlaveSignalL() while(digitalRead(SLAVEREADY) != LOW){}
210+
#define waitSlaveReady() (digitalRead(WIFININA_SLAVEREADY) == LOW)
211+
#define waitSlaveSign() (digitalRead(WIFININA_SLAVEREADY) == HIGH)
212+
#define waitSlaveSignalH() while(digitalRead(WIFININA_SLAVEREADY) != HIGH){}
213+
#define waitSlaveSignalL() while(digitalRead(WIFININA_SLAVEREADY) != LOW){}
204214

205215
void SpiDrv::waitForSlaveSign()
206216
{
@@ -562,7 +572,10 @@ void SpiDrv::sendCmd(uint8_t cmd, uint8_t numParam)
562572

563573
int SpiDrv::available()
564574
{
565-
return (digitalRead(NINA_GPIO0) != LOW);
575+
if (WIFININA_SLAVEGPIO0 >= 0) {
576+
return (digitalRead(WIFININA_SLAVEGPIO0) != LOW);
577+
}
578+
return true;
566579
}
567580

568581
SpiDrv spiDrv;

src/utility/spi_drv.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#define SPI_Drv_h
2323

2424
#include <inttypes.h>
25+
#include <Arduino.h>
26+
#include <SPI.h>
2527
#include "utility/wifi_spi.h"
2628

2729
#define SPI_START_CMD_DELAY 10

0 commit comments

Comments
 (0)