WINC1500 su Custom Board con SAM D21 (tipo Arduino Zero)

Buongiorno a tutti,

abbiamo una Custom Board basata sul chip SAM D21 che monta un WINC 1500. In teoria è come se fosse un Arduino Zero assieme ad una Arduino Wifi 101 Shield.

Abbiamo programmato la scheda con il bootloader "samd21_sam_ba_genuino.bin" ed usato queste librerie per farlo funzionare GitHub - arduino/ArduinoCore-samd: Arduino Core for SAMD21 CPU

I test di accensione led funzionano correttamente, i singoli pin rispondono correttamente ai comandi HIGH e LOW che diamo loro, ma abbiamo problemi a parlare con il WINC.

Eseguendo il codice per il recupero del macaddress tramite la funzione WiFi.macAddress() ottengo un palesemente errato "MAC: 0:B:0:0:0:0", se uso WiFi.scanNetworks(), non ne trova e WiFi.firmwareVersion() restituisce 255.15.15.

C'è sicuramente qualche problema a livello di configurazione dei files Variant di Arduino, solo che non so dove possa essere...

Questo è il codice relativo al WINC1500 che abbiamo messo nel file Variant.h e nel Variant.cpp.

C'è qualcosa di palesemente sbagliato? qualcuno ha riscontrato un comportamento simile del WINC1500?

// 16..21 - WINC SPI pins (ICSP: MISO, SS, MOSI, SCK)
// --------------------
// 16 - PA08 - WINC ENABLE
{ PORTA,  8, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH0, TCC0_CH0, EXTERNAL_INT_NMI }, 

// 17 - PA09 - WINC IRQN
{ PORTA,  9, PIO_TIMER, (PIN_ATTR_DIGITAL|PIN_ATTR_PWM|PIN_ATTR_TIMER), No_ADC_Channel, PWM0_CH1, TCC0_CH1, EXTERNAL_INT_9 },

// 18 - PA10 - WINC WAKE
{ PORTA, 10, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_10 },

// 19 - PA11 - WINC RESET
{ PORTA, 11, PIO_SERCOM, (PIN_ATTR_DIGITAL), No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_11 },

// 20 - PA12 - WINC TX_WIFI - SERCOM 2 PAD 0
{ PORTA, 12, PIO_SERCOM_ALT,     PIN_ATTR_DIGITAL,                                  No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_12 }, // SDA: SERCOM2/PAD[0]

// 21 - PA13 - WINC RX_WIFI - SERCOM 2 PAD 1
{ PORTA, 13, PIO_SERCOM_ALT,     PIN_ATTR_DIGITAL,                                  No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_13 }, // SCL: SERCOM2/PAD[1]


// 22..25 - WINC SPI pins (ICSP: MISO, SS, MOSI, SCK)
// --------------------
// 22 - PA20 - WINC SSN SERCOM 3 PAD 2
{ PORTA, 20, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL,                                  No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_4  },

// 23 - PA21 - WINC MISO SERCOM 3 PAD 3
{ PORTA, 21, PIO_SERCOM_ALT, PIN_ATTR_DIGITAL,                                  No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_5  },

// 24 - PA22 - WINC MOSI SERCOM 3 PAD 0
{ PORTA, 22, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SDA: SERCOM3/PAD[0]

// 25 - PA23 - WINC SCK  SERCOM 3 PAD 1
{ PORTA, 23, PIO_SERCOM, PIN_ATTR_NONE, No_ADC_Channel, NOT_ON_PWM, NOT_ON_TIMER, EXTERNAL_INT_NONE }, // SCL: SERCOM3/PAD[1]
#define PIN_WINC_ENABLE    (16u)
#define PIN_WINC_IRQN      (17u)
#define PIN_WINC_WAKE      (18u)
#define PIN_WINC_RESET     (19u)
#define PIN_WINC_TX        (20u)
#define PIN_WINC_RX        (21u)

#define PIN_SPI_SS          (22u)
#define PIN_SPI_MISO        (23u)
#define PIN_SPI_MOSI        (24u)
#define PIN_SPI_SCK         (25u)
#define PERIPH_SPI          sercom3
#define PAD_SPI_TX          SPI_PAD_0_SCK_1
#define PAD_SPI_RX          SERCOM_RX_PAD_3

static const uint8_t SS   = PIN_SPI_SS ;	
static const uint8_t MOSI = PIN_SPI_MOSI ;
static const uint8_t MISO = PIN_SPI_MISO ;
static const uint8_t SCK  = PIN_SPI_SCK ;

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema: