Skip to content
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

allow setting pins and SPI interface. For most client work #63

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
20 changes: 20 additions & 0 deletions src/WiFi.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,9 @@
#include "utility/wifi_drv.h"
#include "WiFi.h"

extern SPIClass *WIFININA_SPIWIFI;
extern int8_t WIFININA_SLAVESELECT, WIFININA_SLAVEREADY, WIFININA_SLAVERESET, WIFININA_SLAVEGPIO0;

extern "C" {
#include "utility/wl_definitions.h"
#include "utility/wl_types.h"
Expand All @@ -31,6 +34,23 @@ WiFiClass::WiFiClass() : _timeout(50000), _feed_watchdog_func(0)
{
}

void WiFiClass::setPins(int8_t cs, int8_t ready, int8_t reset, int8_t gpio0, SPIClass *spi) {
WIFININA_SLAVESELECT = cs;
WIFININA_SLAVEREADY = ready;
WIFININA_SLAVERESET = reset;
WIFININA_SLAVEGPIO0 = gpio0;
WIFININA_SPIWIFI = spi;
}

void WiFiClass::setLEDs(uint8_t red, uint8_t green, uint8_t blue) {
WiFiDrv::pinMode(25, OUTPUT);
WiFiDrv::pinMode(26, OUTPUT);
WiFiDrv::pinMode(27, OUTPUT);
WiFiDrv::analogWrite(25, red);
WiFiDrv::analogWrite(26, green);
WiFiDrv::analogWrite(27, blue);
}

void WiFiClass::init()
{
WiFiDrv::wifiDriverInit();
Expand Down
5 changes: 5 additions & 0 deletions src/WiFi.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
#define WIFI_HAS_FEED_WATCHDOG_FUNC

#include <inttypes.h>
#include <Arduino.h>
#include <SPI.h>

extern "C" {
#include "utility/wl_definitions.h"
Expand Down Expand Up @@ -277,6 +279,9 @@ class WiFiClass
int ping(const String &hostname, uint8_t ttl = 128);
int ping(IPAddress host, uint8_t ttl = 128);


void setPins(int8_t cs=10, int8_t ready=7, int8_t reset=5, int8_t gpio0=6, SPIClass *spi = &SPI);
void setLEDs(uint8_t red, uint8_t green, uint8_t blue);
void setTimeout(unsigned long timeout);

void setFeedWatchdogFunc(FeedHostProcessorWatchdogFuncPointer func);
Expand Down
67 changes: 39 additions & 28 deletions src/utility/spi_drv.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,10 @@ extern "C" {
#include "utility/debug.h"
}

static uint8_t SLAVESELECT = 10; // ss
static uint8_t SLAVEREADY = 7; // handshake pin
static uint8_t SLAVERESET = 5; // reset pin

static bool inverted_reset = false;
SPIClass *WIFININA_SPIWIFI=&SPI;
int8_t WIFININA_SLAVESELECT = 10, WIFININA_SLAVEREADY = 7,
WIFININA_SLAVERESET = 5, WIFININA_SLAVEGPIO0 = 6;

#define DELAY_TRANSFER()

Expand All @@ -77,36 +76,48 @@ void SpiDrv::begin()
#endif

#ifdef SPIWIFI_SS
SLAVESELECT = SPIWIFI_SS;
WIFININA_SLAVESELECT = SPIWIFI_SS;
#endif

#ifdef SPIWIFI_ACK
SLAVEREADY = SPIWIFI_ACK;
WIFININA_SLAVEREADY = SPIWIFI_ACK;
#endif

#ifdef SPIWIFI_RESET
SLAVERESET = (uint8_t)SPIWIFI_RESET;
WIFININA_SLAVERESET = (uint8_t)SPIWIFI_RESET;
#endif

#ifdef NINA_GPIO0
WIFININA_SLAVEGPIO0 = NINA_GPIO0;
#endif

#ifdef SPIWIFI
WIFININA_SPIWIFI = &SPIWIFI;
#endif

#ifdef ARDUINO_SAMD_MKRVIDOR4000
inverted_reset = false;
#else
if (SLAVERESET > PINS_COUNT) {
#ifdef PINS_COUNT
if (WIFININA_SLAVERESET > PINS_COUNT) {
inverted_reset = true;
SLAVERESET = ~SLAVERESET;
WIFININA_SLAVERESET = ~WIFININA_SLAVERESET;
}
#endif
#endif

pinMode(SLAVESELECT, OUTPUT);
pinMode(SLAVEREADY, INPUT);
pinMode(SLAVERESET, OUTPUT);
pinMode(NINA_GPIO0, OUTPUT);

digitalWrite(NINA_GPIO0, HIGH);
digitalWrite(SLAVESELECT, HIGH);
digitalWrite(SLAVERESET, inverted_reset ? HIGH : LOW);
if (WIFININA_SLAVEGPIO0 >= 0) {
pinMode(WIFININA_SLAVEGPIO0, OUTPUT);
digitalWrite(WIFININA_SLAVEGPIO0, HIGH);
}

digitalWrite(WIFININA_SLAVESELECT, HIGH);
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? HIGH : LOW);
delay(10);
digitalWrite(SLAVERESET, inverted_reset ? LOW : HIGH);
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? LOW : HIGH);
delay(750);

digitalWrite(NINA_GPIO0, LOW);
Expand All @@ -122,36 +133,36 @@ void SpiDrv::begin()
}

void SpiDrv::end() {
digitalWrite(SLAVERESET, inverted_reset ? HIGH : LOW);
digitalWrite(WIFININA_SLAVERESET, inverted_reset ? HIGH : LOW);

pinMode(SLAVESELECT, INPUT);
pinMode(WIFININA_SLAVESELECT, INPUT);

SPIWIFI.end();
WIFININA_SPIWIFI->end();

initialized = false;
}

void SpiDrv::spiSlaveSelect()
{
SPIWIFI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(SLAVESELECT,LOW);
WIFININA_SPIWIFI->beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0));
digitalWrite(WIFININA_SLAVESELECT, LOW);

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


void SpiDrv::spiSlaveDeselect()
{
digitalWrite(SLAVESELECT,HIGH);
SPIWIFI.endTransaction();
digitalWrite(WIFININA_SLAVESELECT,HIGH);
WIFININA_SPIWIFI->endTransaction();
}


char SpiDrv::spiTransfer(volatile char data)
{
char result = SPIWIFI.transfer(data);
char result = WIFININA_SPIWIFI->transfer(data);
DELAY_TRANSFER();

return result; // return the received byte
Expand Down Expand Up @@ -205,10 +216,10 @@ char SpiDrv::readChar()
return 0; \
}else \

#define waitSlaveReady() (digitalRead(SLAVEREADY) == LOW)
#define waitSlaveSign() (digitalRead(SLAVEREADY) == HIGH)
#define waitSlaveSignalH() while(digitalRead(SLAVEREADY) != HIGH){}
#define waitSlaveSignalL() while(digitalRead(SLAVEREADY) != LOW){}
#define waitSlaveReady() (digitalRead(WIFININA_SLAVEREADY) == LOW)
#define waitSlaveSign() (digitalRead(WIFININA_SLAVEREADY) == HIGH)
#define waitSlaveSignalH() while(digitalRead(WIFININA_SLAVEREADY) != HIGH){}
#define waitSlaveSignalL() while(digitalRead(WIFININA_SLAVEREADY) != LOW){}

void SpiDrv::waitForSlaveSign()
{
Expand Down
2 changes: 2 additions & 0 deletions src/utility/spi_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
#define SPI_Drv_h

#include <inttypes.h>
#include <Arduino.h>
#include <SPI.h>
#include "utility/wifi_spi.h"

#define SPI_START_CMD_DELAY 10
Expand Down