Convivenza Ethernet Shield + Mamba Shield

Ciao a tutti

Per un mio progetto di home automation avrei necessità di far convivere, su una stessa scheda Arduino, gli shield Arduino Ethernet (la prima versione, con lettore SD) e Mamba di Linksprite (Mamba - Narrow Band Powerline Communication Shield for Arduino - LinkSprite Playgound)

In base alla documentazione delle due schede, il primo problema che mi sono posto è stato quello di separare i pin SS, dal momento che entrambe sfruttano il protocollo SPI sui pin 'base' (SS=10, MOSI=11, MISO=12, SCK=13)

Ho ritenuto più semplice cambiare il comportamento dello shield Ethernet (avendo trovato più documentazione a riguardo) passando dal pin 10 al pin 7.

Per fare questo ho cambiato il file 5100.h in questo modo

*inline static void initSS() { DDRD |= _BV(7); }; *
inline static void setSS() { PORTD &= ~_BV(7); };
inline static void resetSS() { PORTD |= _BV(7); };

Dal punto di vista hardware ho usato dei cavetti 'jumper' per collegare il pin 7 di Arduino direttamente con il pin 10 dello shield Ethernet e mantenere il collegamento 'naturale' tra i pin 10 di Arduino e Mamba

Provando a caricare uno sketch di prova con le istruzioni minime di gestione di entrambi gli ambienti, dal punto di vista elettrico le due schede sembra che vengano inizializzate correttamente (i rispettivi led 'ready' danno un feedback corretto) ma, in realtà, il server HTTP esposto non risponde alle richieste del browser (l'indirizzo IP non viene riconosciuto come valido all'interno della LAN).
Lo shield Mamba sembra invece funzionare correttamente.

Vi riporto le istruzioni di inizializzazione delle due schede presenti all'interno dello sketch

byte mac[] = {

  • 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };*
    IPAddress ip(192,168,1,177);
    EthernetServer server(80);
    void setup() {

  • // Mamba Shield*

  • PIN_OUTPUT(MOSI);*

  • PIN_OUTPUT(SCK);*

  • PIN_OUTPUT(nPLM_RESET);*

  • PIN_OUTPUT(PLM_CS);*

  • PIN_INPUT(MISO);*

  • spi_init( SPI_SPEED_F32 );*

  • // Ethernet shield*

  • Ethernet.begin(mac, ip);*

  • server.begin();*

Ovviamente ho provato anche a commentare le istruzioni relative alla inizializzazione della scheda Mamba, lasciando solo quelle relative alla Ethernet e mantenendo inalterata la configurazione hardware; in questo caso il server HTTP risponde correttamente.

In particolare la parte relativa a Mamba che sembra 'bloccare' il funzionamento della parte Ethernet (indipendentemente dalla sequenza con la quale inizializzo le due schede) è riconducibile all'istruzione

SPCR = _BV( MSTR ) | _BV( SPE ) | ( speed & SPI_SPR_MASK ) | _BV(CPHA);

presente all'interno dela funzione spi_init()

Per le mie conoscenze attuali non sono in grado di capire esattamente il significato di tutte le assegnazioni descritte ma sembrerebbe un conflitto nella gestione degli interrupt...

Rispetto a quanto ho fatto, manca qualche passaggio logico che ignoro?

I miei dubbi sull'argomento sono aumentati dal fatto che, relativamente alla scheda Ethernet in mio possesso, la documentazione in rete fa spesso riferimento ad un 'bug' che affligge le schede che montano il chip W5100 (e che dovrebbe generare proprio problemi di coesistenza tra shield SPI)
Al momento non sono però riuscito a mettere insieme 'i pezzi' per capire se le caratteristiche di questo bug possano affliggere una configurazione come la mia e se, quindi, i problemi che sto avendo siano causa del bug stesso (e quindi, potenzialmente, di un limite non superabile) o di un mio errore/passaggio mancante

Grazie in anticipo per qualsiasi suggerimento in merito

Carlo

Benvenuto. :slight_smile:
Ti invitiamo a presentarti qui: Re: Presentazioni nuovi iscritti, fatevi conoscere da tutti! (Part 1) - Generale - Arduino Forum
e a leggere il regolamento: [REGOLAMENTO] Come usare questa sezione del forum - Italiano - Arduino Forum

Per il codice mettilo negli appositi tag code (nel regolamento sezione 8 ti spiega come fare)
Quando più dispositivi usano SPI, solo uno alla volta può essere attivo. Quindi solo un pin SS può essere attivo alla volta (il segnale SS è negato). SPCR è il registro interno del MCU che controlla lo SPI.

Grazie!
Mi sono presentato nella apposita sezione...
Chiedo scusa per non aver letto prima il regolamento e non avere quindi inserito correttamente il codice nel mio post... :blush:

Rispetto al mio problema ho provato a cercare sui vari forum e, in effetti, ho trovato molti post attinenti; purtroppo non sono riuscito a mettere insieme le singole informazioni per farmi un quadro corretto dell'argomento, in modo da potermi muovere più in autonomia e/o facendo magari richieste più puntuali...

Venendo alle tue risposte relative alla mia domanda...
Che i dispositivi SPI possano essere usati uno alla volta mi risulta chiaro; e mi sembra di capire che sia proprio il segnale SS a selezionare quale dispositivo far diventare attivo (lo sdoppiamento che ho effettuato sul pin 10 -> 7 avrebbe proprio questo scopo, se ho capito bene)
Quello che non riesco a capire è se manchi qualcosa allo 'schema' che ho descritto e/o se ci siano o meno limiti, di qualche tipo, che ignoro...

A disposizione, ovviamente, per fornire qualunque dettaglio per descrivere meglio la mia configurazione

Grazie
Carlo

Credo che il problema grosso sia capire cosa fa di sotto la libreria Ethernet rispetto a SPI. Il segnale su SS relativo la ethernet se lo gestisce lei internamente. Inoltre mi pare, vedendo il datasheet del 328 che venga attivato con quel spi_init la modalità Master SPI, al che non saprei se la cosa è compatibile con la gestione che la Ethernet fa dello SPI.

Forse una mano potrebbe dartela @Leo72 uno degli admin che conosce i registri del MCU 328 e capisce meglio di me quei settaggi nei registri interni (e credo conosca bene la gestione SPI)

D'accordo, grazie; in questo momento sono bloccato e quindi qualunque suggerimento è bene accetto...

Saluti
Carlo

SPCR = _BV( MSTR ) | _BV( SPE ) | ( speed & SPI_SPR_MASK ) | _BV(CPHA);

Viene modificato il registro SPCR che controlla lo stato della SPI.
Nello specifico viene:

  1. settato il bit MSTR, che vuol dire impostare l'Atmega328 come Master
  2. settato il bit SPE, che serve per abilitare l'SPI
  3. settato il bit CPHA, che seleziona come sincronizzare il segnale per la campionatura
  4. regolata la frequenza di lavoro della periferica

Ho timore che il problema possa nascere dal fatto che l'SPI di default pilota il pin SS via hardware, e la lib può far funzionare l'Arduino solo come slave. Se imposti la scheda come master, come fa quella riga, la lib SPI non funziona più perché non gestisce altri pin SS:

Note about Slave Select (SS) pin on AVR based boards

All AVR based boards have an SS pin that is useful when they act as a slave controlled by an external master. Since this library supports only master mode, this pin should be set always as OUTPUT otherwise the SPI interface could be put automatically into slave mode by hardware, rendering the library inoperative.

It is, however, possible to use any pin as the Slave Select (SS) for the devices. For example, the Arduino Ethernet shield uses pin 4 to control the SPI connection to the on-board SD card, and pin 10 to control the connection to the Ethernet controller.