Problemi con SPI arduino Mega

NON è possibile, sulla MEGA i pin 11 e 13 NON corrispondono a MOSI e SCK, quindi, o non stai usando la libreria SPI, ma usi un bit-banging (emulazione SPI su qualunque pin), o NON può funzionare!

Non credo, è ampiamente usata :roll_eyes: ... credo piuttosto nel tuo programma ... fanne una versione minima (per facilitarci la lettura) e mettilo qui che gli diamo un'occhiata (mi raccomandoi tra i tag CODE).

Guglielmo

FERMI TUTTI, me ne accorgo ora ... ma tu stai usando questa forma per istanziare la classe?

Ovvio che non ti funziona, quel modo di istanziare la classe è per avere il bit-banging (Software SPI) ovvero il SPI su qualsiasi pin ... la Ethernet funziona con la VERA SPI hardware e non con emulazioni software ... ovvio che, se da una parte i pin 51, 52 e 53 li dichiari collegati al controllore SPI (Ethernet) e dall'altra li dichiari come GPIO (Software SPI), le due cose vanno in conflitto e non funzionerà mai!!!

SEMPRE studiare prima le classi ed i metodi che mettono a disposizione ... se ti fossi guardado come viene istanziata la classe in Adafruit_ST7735.cpp avresti scoperto che ci sono DUE possibilità:

  1. quella che hai usato tu e che è proprio definita come Software SPI:
/*!
    @brief  Instantiate Adafruit ST7735 driver with software SPI
    @param  cs    Chip select pin #
    @param  dc    Data/Command pin #
    @param  mosi  SPI MOSI pin #
    @param  sclk  SPI Clock pin #
    @param  rst   Reset pin # (optional, pass -1 if unused)
*/
Adafruit_ST7735::Adafruit_ST7735(int8_t cs, int8_t dc, int8_t mosi, int8_t sclk,
                                 int8_t rst)
    : Adafruit_ST77xx(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160, cs, dc, mosi,
                      sclk, rst) {}
  1. quella che usa la libreria SPI e quindi il VERO bus SPI:
/*!
    @brief  Instantiate Adafruit ST7735 driver with default hardware SPI
    @param  cs   Chip select pin #
    @param  dc   Data/Command pin #
    @param  rst  Reset pin # (optional, pass -1 if unused)
*/
Adafruit_ST7735::Adafruit_ST7735(int8_t cs, int8_t dc, int8_t rst)
    : Adafruit_ST77xx(ST7735_TFTWIDTH_128, ST7735_TFTHEIGHT_160, cs, dc, rst) {}

Quindi, la tua istanza per il display DEVE essere:

Adafruit_ST7735 tft = Adafruit_ST7735(TFTcs , dc, rst);

... così da usare la vera SPI hardware e non creare conflitti con la scheda Ethernet.

Ovviamente rimane valido tutto il resto relativo ai pin che si possono usare e non usare.

Guglielmo

La cosa è anche ben spiegata sul sito di Adafruit ... QUI dove ti mostra le due possibilità e spiega a cosa servono.

Guglielmo

Grazie Guglielmo
Stavo proprio per inviarti il codice esmepio del TFT in quanto l'ho provato con i pin 11 >>13 e funziona ....cosa anomala in quanto l'hardware del mega prevede in SPI il 51>>53 quindi non dovrebbe mai funzionare tranne se si usa il il bit-banging (la prima volta che lo sentivo e non lo conoscevo...)

quindi è come riporti, adesso provo con il seguente collegamento HW e codfice:

#define TFT_CS 44 // CS
#define TFT_DC 50 // DC/MISO
#define mosi 51 // MOSI
#define sclk 52 // SCLK
#define TFT_RST 48 // RST can use any pin

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS , TFT_DC, TFT_RST);

Colegando i pin TFT come nelle istruzioni define ....e vedo cosa succede .....

Ricorda di impostare il pin 53 come output, metterlo HIGH e non usarlo.

Consiglio anche, ad inizio del setup() di dichiarare output i pin 4 e 10 e mettere HIGH anche loro, così tutti i CS della Ethernet cominciano con tutto NON selezionato :wink:

Guglielmo

RISOLTO !!!!!!!!!! :cold_sweat: :cold_sweat: Che sudata !!

Grazie Mille Guglielmo

Il problema è che, per la mia poca esperienza non cosnoscevo il " bit-banging " quindi come riporti , NON poteva mai funzionare.
Poi ho dovuto ritrovare e ricollegare il display i vari acronimi del display con gli acronimi SPI , con la versione precedente andavano bene tutti i pin.

Adesso il progetto funziona con : "SD" + "Ethernet" + TFT ST7735 !!!

Allego la configurazione utilizzata per TFT :

//Using SPI Mega pin 51>>53
#define TFT_CS 44 // SS >>TFT pin "CS" Cable violet >>All pins
#define TFT_DC 49 // MISO >>TFT pin "DC" Cable Blue >>All pins
#define mosi 51 // MOSI >>TFT pin "SDA" Cable Yellow >>Fix PIN
#define sclk 52 // SCK >>TFT pin "SCL" TFT cable Orange >>Fix PIN
#define TFT_RST 48 // RST >>TFT pin "RST" Cable Green >>All pins

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS , TFT_DC, TFT_RST);

Adesso setto anche le varie output CS come mi hai indicato in modo da evitare problemi di sovrapposizione di comunicazione fra i varie perifieriche

GRAZIE MILLE per la pazienza e disponibilità!!!!

Figurati, sono contento che abbiamo individuato il problema :slight_smile: e ... mi raccomando, dare sempre un'occhiata ai sorgenti delle librerie che si usano perché ci si trovano dentro tutte le info necessarie :wink:

Guglielmo

Ok
Grazie ancora !
Non ce l'avrei mai fatta da solo !

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.