Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

Liaison SPI sur ATMEL : Maître / Esclave



  1. #1
    Apollon13

    Liaison SPI sur ATMEL : Maître / Esclave


    ------

    Bonjour,

    Depuis quelques années j'utilise la SPI pour envoyer des données vers un esclave mais là je dois en envoyer ET en recevoir...
    Dans mon programme j'initialise donc mon µC en maître (dans le wizzard je dois choisir un des 2).

    Mais je me suis posé une question :

    --> Quand mon µC envoie des données il est en maître, mais quand il reçoit des données venant de l'esclave, est il toujours maître ou devient il esclave ?

    Parce que si on regarde dans la doc du ATMEGA8535, on dirais qu'il faut à chaque fois passer par l'initialisation pour le reconfigurer soit en maître soit en esclave...

    Pouvez vous m'éclaircir à ce sujet ?

    Le but : Envoyer 1 trame de 8 bits à l’esclave pour demander une conversion et un envoie, et recevoir une trame de 16 bits venant de l'esclave.

    DOC : http://www.atmel.com/images/doc2502.pdf (voir pages 139 et 140)

    Merci.

    -----

  2. Publicité
  3. #2
    vincent66

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Bonjour,
    Si une sélection de l'esclave est effectuée par Chip Select,le uC reste maître pendant toute la transaction, c'est lui qui fournit ck pendant la lecture, il faut peut-être reconfigurer la polarité du dit ck...
    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  4. #3
    ftorama

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Le maître est celui qui pilote les Chip Select et aussi l'horloge.

    Normalement (car le SPI n'est pas une norme en soi), pour recevoir un octet d'un esclave, on reste en maître et on envoie des octets bidons (ou dummy en anglais). La liaison étant full-duplex, on inscrit l'octet bidon dans le registre de données et en fin de transaction, on récupère dans ce même registre la donnée de l'ADC
    Quand un homme a faim, mieux vaut lui aprendre à pecher que de lui donner un poisson.

  5. #4
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    OK merci à vous 2.

    Pour info, je viens de passer mon dimanche entier à essayer des programmes, à faire des recherches, a lire et relire la doc du AD7715 mais rien de rien ! J'ai bien compris comment il fonctionne mais j'ai l'impression que sur les exemples trouvés sur le net (pour piloter le ad7715) les auteurs des programmes font des usines à gaz ! pourquoi ils s'amusent à recréer carrément l'horloge !!? Alors que la fonction SPI existe toute faite ...

    FTORAMA : en faite, ce que tu me dis c'est que comme le SPI forme une "boucle" j'ai juste à écrire par exemple 0xFF dans le registre de données du ADC pour "pousser" les données utiles vers le µC ?

    Si c'est bien ca, les données utiles je les récupères dans SPDR, mais ce même registre est utilisé pour envoyer les données... En gros en même temps que je le vide pour l'envoie des données, il se rempli avec les nouvelles et une fois terminé je le lis ?

    J'arrive très bien à envoyer les données (j'ai même une matrice à LED avec des registres à décalage pour vérifier les mots que j'envoie, vu que j'ai pas encore d'oscillo numérique) mais à recevoir j'ai jamais fais.

    Doc du AD7715 : http://www.analog.com/static/importe...ets/AD7715.pdf

    Page 13 14 15 16...

    Ce soir c'est dodo avec une aspirine

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    ftorama

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Citation Envoyé par Apollon13 Voir le message
    FTORAMA : en faite, ce que tu me dis c'est que comme le SPI forme une "boucle" j'ai juste à écrire par exemple 0xFF dans le registre de données du ADC pour "pousser" les données utiles vers le µC ?

    Si c'est bien ca, les données utiles je les récupères dans SPDR, mais ce même registre est utilisé pour envoyer les données... En gros en même temps que je le vide pour l'envoie des données, il se rempli avec les nouvelles et une fois terminé je le lis ?
    C'est bien ça....
    Quand un homme a faim, mieux vaut lui aprendre à pecher que de lui donner un poisson.

  9. #6
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Bonsoir,

    Je n'arrive toujours pas à communiquer avec ce circuit... Pourquoi ils sont toujours aussi compliqués !?

    Quand je lis des programmes concernant ce circuit sur le net, aucun ne fait un peu près la même chose du coup je m'y perd.

    J'ai branché en série, ma matrice de LEDs et le AD7715 avec un retour sur le µC. Si je met pas le AD7715 dans la boucle, les données circulent bien en boucle (je renvoie la valeur de SPDR sur des LED également).
    Par contre quand je met dans la boucle le AD7715, sans le "contrôler", les données ressortent pas du tout. Pourtant il est alimenté et comme il s'agit d'un registre à décalage, les données devraient circuler... juste de temps en temps ca ressort un peu....

    Je commence à désespérer sérieusement, mais je lâche pas l'affaire ! J'y arriverais !...

    Je sais même pas si ma liaison SPI est "belle" en tout cas elle transmet très bien les données sur ma matrice de LED.

  10. Publicité
  11. #7
    Qristoff
    Animateur Électronique

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Le but : Envoyer 1 trame de 8 bits à l’esclave pour demander une conversion et un envoie, et recevoir une trame de 16 bits venant de l'esclave.
    est ce que ton problème ne vient pas de là ? car effectivement le registre data comporte 16 bits. Il faut donc que ton horloge de prélèvement de données permettent d’échantillonner ces 16 bits. Il faut déjà envoyer une commande 8 bits pour demander l'acquisition puis ensuite lire la data dans un format 16 bits, ce qui oblige à changer le nombre d'impulsions de SCLK entre les deux. C'est peut être ce qui est fait dans les programmes que tu trouves sur le net.
    Tout existe, il suffit de le trouver...!

  12. #8
    vincent66

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Il me semble bien qu'il faut configurer un registre du ad7715 pour effectuer la lecture, il n'est pas indispensable alors d'envoyer de dummy-bits mais si c'est inévitable il faut quand-même fournir le clock, dont la polarité, comme écrit dans mon 1er post, doit peut-être inversée...
    Je suis d'accord, ces fabricants qui ont chacun leur petite spécialité sont assez emm... mais nous avons ce qu'il faut pour y remédier : des neurones...
    Vincent
    Leonardo était ingénieur "sans papier", et moi diplômé juste...technicien...

  13. #9
    Qristoff
    Animateur Électronique

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Je viens de lire aussi quelque chose d'intéressant dans la datasheet: "The AD7715 is not capable of full duplex operation. If the AD7715 is configured for a write operation, no data appears on the DOUT lines even when the SCLK input is active. Similarly, if the AD7715 is configured for a read operation, data presented to the part on the DIN line is ignored even when SCLK is active."
    Donc, en fait, il ne faut pas se louper dans l'écriture du registre de communication sinon to AD7715 est soit sourd, soit muet...
    Tout existe, il suffit de le trouver...!

  14. #10
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Pour l'envoie des données au format 8 bits, j'utilise une fonction toute faite trouvée dans la doc du 8535 :

    Code:
     void SPI_MasterTransmit(char cData)
     {
     SPDR = cData; // 
     while(!(SPSR & (1<<SPIF))); // 
     };
    Si je dois envoyer 16 bits, je répète deux fois cette fonction.
    Maintenant, il y'a peut être plus adapté du genre une boucle FOR de 8 pour 8 bits, et qui passe à 16 pour 16 bits...
    La question que je me pose si j'opte pour cette solution : comment obtenir une fréquence d'horloge d'un MHz dans ma boucle FOR , si mon µC tourne à 16MHz... Alors que dans le wizzard du SPI, j'indique la fréquence d'horloge que je veux ( 4MHz / 1MHz / 250KHz...)
    J'ai récemment mis en oeuvre des potars numérique en liaison SPI et j'ai eu aucun soucis, comme je fais QUE de l'écriture. Par contre c'est la première fois que je fais de la lecture sur du SPI...

    Pour configurer mon AD, je fais ca:

    - Envoie de la valeur 0x10;
    - Ensuite 0x44;

    J'ai mis un oscillateur à quartz de 1MHz sur la broche 2 du AD. j'ai bien mon signal d'un MHz.
    Dernière modification par Apollon13 ; 16/10/2012 à 20h03.

  15. #11
    Qristoff
    Animateur Électronique

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    est ce que tu attends bien le dataready avant de lancer la lecture ?
    Si je dois envoyer 16 bits, je répète deux fois cette fonction.
    ce n'est pas forcément une bonne solution car il est possible que le CS retombe entre les deux envois. Il faut que la la réception 16 bits se fasse d'une seule passe.
    Tout existe, il suffit de le trouver...!

  16. #12
    ftorama

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Citation Envoyé par Qristoff Voir le message
    ce n'est pas forcément une bonne solution car il est possible que le CS retombe entre les deux envois. Il faut que la la réception 16 bits se fasse d'une seule passe.
    D'où sans doute la fonction écrite à la main dans les programmes cités en #4
    Quand un homme a faim, mieux vaut lui aprendre à pecher que de lui donner un poisson.

  17. Publicité
  18. #13
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Re,

    Je suis entrain de refaire mes fonctions SPI à la main.
    Concernant l'envoie des données avec ma fonction suivante, cela fonctionne très bien (j'envoie les données dans une matrice de 30 colonnes de 8 LED)

    Code:
     void ADC_Write(unsigned char inpData)   
    {   
        unsigned char i;   
       
        ADC_CS = 0; 
        for(i=1; i<=8; i++)   
            {   
            ADC_CLK = 0;
            delay_ms(1);   
            ADC_DI = (inpData & 0x80);   
            inpData = inpData << 1;   
            ADC_CLK = 1;
            delay_ms(1);    
            }
        ADC_CS = 1;   
    }

    Du coup j'attaque la partie réception mais là j'ai un "Warning" quand je compile...

    Warning: spitest.c(66): local variable 'adc_data' is used before it's value is set

    Code:
    unsigned int ADC_ReadValue(void)   
    {   
        unsigned char i;   
        unsigned int adc_data;       
       
        while (ADC_DRDY);     //attente fin de conv. DRDY=0;   
        ADC_Write(0x38);  //0x38 Lecture et gain=1   
           
        ADC_CS = 0;   
        for(i=1; i<=16; i++)   
        {   
            ADC_CLK = 0;
            delay_ms(1);   
            ADC_CLK = 1;   
            adc_data = adc_data | ADC_DO;   
            adc_data = adc_data << 1;   
        }   
        ADC_CS = 1;   
        return adc_data;   
    }
    Je comprends pas comment faire autrement ... Warning sans importance ?

  19. #14
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Help please Je n'ai toujours pas trouvé...

  20. #15
    Jack
    Modérateur

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Le warning est pourtant très clair. Tu n'as qu'à initialiser ta variable lors de sa déclaration plutôt que de la faire démarrer avec une valeur inconnue:
    Code:
        unsigned int adc_data = 0;    

    A+
    Dernière modification par Jack ; 26/10/2012 à 17h02.

  21. #16
    Apollon13

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Salut,

    Merci ! Ce soir j’essaie. Pourtant j'étais sur que toutes les variables prennent par défaut la valeur 0...

  22. #17
    Jack
    Modérateur

    Re : Liaison SPI sur ATMEL : Maître / Esclave

    Citation Envoyé par Apollon13 Voir le message
    Salut,

    Merci ! Ce soir j’essaie. Pourtant j'étais sur que toutes les variables prennent par défaut la valeur 0...
    Absolument pas. Pour les variables globales (déclarée en dehors de toute fonction), c'est vrai, mais pas pour les variables locales qui sont déclarées sur la pile et prennent donc la valeur qui s'y trouve.

    A+

Discussions similaires

  1. [PIC18 - Liaison SPI] - Envoi données Maitre > Esclave / Esclave vers Maitre
    Par jorg1n dans le forum Programmation et langages, Algorithmique
    Réponses: 3
    Dernier message: 12/01/2011, 16h45
  2. DD maître/esclave
    Par blackloffy dans le forum Matériel - Hardware
    Réponses: 7
    Dernier message: 04/09/2009, 23h05
  3. bascule D MAITRE ESCLAVE
    Par skyjet169 dans le forum Électronique
    Réponses: 1
    Dernier message: 01/05/2008, 10h19
  4. bascule maitre esclave !!!
    Par moho1 dans le forum Électronique
    Réponses: 9
    Dernier message: 08/03/2008, 10h54
  5. maitre/esclave
    Par weeman dans le forum Matériel - Hardware
    Réponses: 10
    Dernier message: 28/03/2004, 14h49
Découvrez nos comparatifs produits sur l'informatique et les technologies.