Utiliser 2 périphériques SPI

Bonsoir,

J'ai une carte SD, CS = 53 je voudrais y ajouter un écran LCD 128 x 64 qui peut être piloté en SPI aussi cs 48

J'ai récupéré la librairie LCD12864RSPI
https://bitbucket.org/jasonweiyi/robots/src/5a1943c4eee8/arduino/libraries/LCD12864R/SPI/LCD12864RSPI.cpp
J'ai modifié la partie déclaration des ports MOSI, SCK et CS

Elle fonctionne bien seule, la carte SD aussi seule

Quand je mixe les commandes, l'écran commence a réagir correctement mais dès que j'active la SD, il n'est plus pilotable, la carte sd reste pilotable

Si je commence par la SD puis l'écran, il reste muet, la sd est normale.

Je penche pour une librairie lcd mal faite mais je crois aussi qu'il est possible que ce soit mon croquis.

Que faut-il respecter quand on désire partager 2 modules SPI ?

bonjour, normalement les pins cs doivent être en output et set High, et tu ne passe en low que la Cs du composant auquel tu envois des info. sur le fonction Initialize the screen, il y a la commande digitalWrite(latchPin, LOW) mais elle ne retourne pas en high après les writeCommand. Peu être que le problème vient de la. Et j'ai l'impression qu'avec cette library tu dois déclarer l'état du CS avant et après chaque commande pour l'écran.

+1

Ca ressemble à un problème de Slave Select

Bonjour,

La librairie SD libère la broche CS (= HIGH) quand elle à finit de travailler.
Ce n'est donc pas elle qui pose probléme.

Vérifie que ton CS du lcd est bien en OUTPUT et à HIGH au setup().
Ensuite pour éviter tout probléme à chaque fois que tu utilises le lcd fait comme ceci :

digitalWrite(CS_LCD, LOW);
// utilisation du lcd (MAIS PAS DE LA SD)
digitalWrite(CS_LCD, HIGH);

Comme ça si librairie ne gère pas elle même la libération du bus SPI c'est toi qui le fera à la main :wink:

j'en profite pour poser une une petite question sur un point pas très clair pour moi, si on ajoute les commande High et Low dans la librarie du Lcd comme suis:

void LCD12864RSPI::writeData(int data)
{
          digitalWrite(CS_LCD, LOW);

        int H_data,L_data;
        H_data = data;
        H_data &= 0xf0;           //Mask lower 4 bit data
        L_data = data;            //Format: xxxx0000
        L_data &= 0x0f;           //Mask higher 4 bit data
        L_data <<= 4;             //Format: xxxx0000
        writeByte(0xfa);          //RS=1, data is to be written.
        writeByte(H_data);
        writeByte(L_data);
        digitalWrite(CS_LCD, HIGH);
}

en déclarant la pin CS_LDC dans les 2 fichier de la librarie, es ce que ça résout le problème? Parce que dans la utft il y a toujours cbi_CS(); et sbi_CS(); encadrant les communications avec le lcd.

Bonjour,

Petit test avec un digitalWrite(48,HIGH); après utilisation du LCD.... C'est bien le pb

Mais doit y avoir encore des traces ailleurs car c'est pas totalement cohérent.

J'ai utilisé cette librairie pour tester car la librairie
Google Code Archive - Long-term storage for Google Code Project Hosting. est bien plus puissante mais doit avoir aussi le même pb et comme elle est bien garnie en code, la compil est très lente !
Je virerais bien des fichiers mais j'ose pas sans étude préalable.

Si qq1 a déjà fait le travail, c'est avec plaisir que je l'accueillerais

Bonsoir,

Je m'arrache les cheveux

Tant que je n'ai pas appelé la SD tout va bien le LCD marche

Après un appel à la SD jamais je ne reprends la main avec le LCD

je suppose que tu as deja essayé un digitalWrite(53,HIGH); a la fin de ta commande vers la sd? tu utilises la librarie sd incluse avec le logiciel arduino? au final tu veux utiliser la librarie du dernier lien pour ton lcd?

Bonsoir,

J'utilise en effet la librairie SD du pack 1.03

J'ai quand même des signes bizarres : après la mise en état haut du cs de l'écran, de temps en temps il change d'affichage, rien de compréhensible.

Faut que je regarde plus près et je vais mettre l'oscillo sur la pin CS de l'écran.

Une idée : y aurait-il un buffer de spi ? Si oui est-il possible de le vider ?

J'aimerais bien aussi connaître un projet arduino qui utilise 2 périphériques SPI, rien que pour voir si ça marche !

Bin, moi j'ai un projet d'affichage de données sur un ldc avec sd pour le data loging. j'ai deja reçu l'écran et le shield il me manque plus que la Due et je commence les essai. Mais sur les vidéo de démo l'arduino charge une image depuis une sd et l'affiche sur l'écran. Il y a même la fonction touch qui passe par le spi. Pour l'instant je suis englué dans la librarie utft. J'ai regardé les programmes des libraries sd et spi, il faut déclarer l'état des pin Cs avant et après chaque commande.