MAsque en C et liaison SPI
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

MAsque en C et liaison SPI



  1. #1
    invite8a011b82

    MAsque en C et liaison SPI


    ------

    Bonjour,

    Je voudrais avoir des informations sur les masques et sur les décalages afin de récupérer mon message. Je travaille en SPI et donc les données sont envoyés/reçues sous forme d'octet. Le message à récupérer est sur 11 bits donc je voudrais faire un décalage à gauche de mon 1er octet après lui mettre un masque pour etre sur que tous les autres bits soit à zéro et après récupérer le 2ème octet et faire un masque pour mettre tous les autres bits à zéro.

    Pour l'instant j'ai écris ça :
    Code:
    angle=(SCA_SPI_READ()<<3) && 0xFF; 
    angle |= (SCA_SPI_READ() & 0xE0);
    Je voulais être sur que le résultat est bon.

    Merci de me corriger.

    -----

  2. #2
    Tonave72

    Re : MAsque en C et liaison SPI

    Salut Titoune,

    Alors à ce que j'ai compris, si la partie haute de ton message est contenue dans ton premier octet un simple décalage suffit puisque le compilo mets des 0 :
    angle=SCA_SPI_READ()<<3;
    Ensuite, si les 3 bits de la partie basse de ton message sont compris dans la partie haute du second octet tu dois bien masquer avec E0 mais il faut que tu décale à droite pour bien placer tes bits dans angle :
    angle|=(SCA_SPI_READ()& 0xE0) >> 5;
    (Le masquage ne sert pas à grand chose puisque le compilo devrait mettre des 0 lors du décalage)

    Si je ne me trompe pas ça devrait coller!
    Dernière modification par Tonave72 ; 27/06/2012 à 07h54.
    Rien ne se perd, rien ne se crée, tout se transforme. Lavoisier

  3. #3
    invite8a011b82

    Re : MAsque en C et liaison SPI

    Ok merci beaucoup

  4. #4
    invite8a011b82

    Re : MAsque en C et liaison SPI

    Je pense plutôt faire d'abord le décalage à droite de 5 et après mettre un masque comme ça je suis sur d'avoir des zéros avant les 3 bits à récupérer donc du coup le masque c'est 0x07

  5. A voir en vidéo sur Futura
  6. #5
    invite8a011b82

    Re : Masque en C et liaison SPI

    après vérification mes masques sont plutôt 0xF0 et 0x07puisque si je décompose tout :
    message envoyé sur 11 bits par exemple 0101 1100 001

    Code:
    angle=(SCA_SPI_READ()<<3) && 0xF0;
    1er octet : 0101 1100
    <<3 : 010 1110 xxxx
    &0xF0: 1111 0000
    angle: 010 1110 0000

    Code:
     angle |= (SCA_SPI_READ()>>5) & 0x07;
    2eme octet: 001x xxxx
    >>5 : xxxx x001
    &0x07: 0000 0111
    angle : 0000 0001
    |angle:010 1110 0000 (1er octet)
    angle: 010 1110 0001
    c'est bien le message qu'on voulait envoyé

    merci

  7. #6
    Tonave72

    Re : Masque en C et liaison SPI

    Fais attention quand tu fais &0xF0 tu devrais faire &0x7F0 que le masque ne t'écrase pas la partie haute de ton message (sous entendu que le compilo fasse un &0x0F0).

    Attention aussi à ton double '&'.

    Sinon c'est bon pour moi

    Au fait de quel type est angle, int?
    Rien ne se perd, rien ne se crée, tout se transforme. Lavoisier

  8. #7
    micka_ch

    Re : MAsque en C et liaison SPI

    Bonjour,

    Si tu est sur que tu reçois tes données formater de la sorte c'est ok. Par contre si tu as un slave qui envoi le MSB en 1er je ne pense pas qu'il a formater les données de la sorte.

    Si tu as 010 1110 0001 et que tu dois le caser dans un message de 16 bits (2x8) généralement on envoi 0x02 suivi de 0xE1.

    Je ne sais pas si cela s'applique dans ton cas, mais j'avais interfacé un accéléromètre qui m'envoyait des données de 12 bits et il fonctionnait de la manière que je l'ai décrit

    Salutations

  9. #8
    invite8a011b82

    Re : MAsque en C et liaison SPI

    je cast " angle" en int effectivement mais toute la conversion et les calculs sont fait en long.
    J'utilise un inclinomètre qui envoie d'abord le MSB puis le LSB donc es ce que tu peux expliquer un peut plus ce que tu veut dire.
    Je ne comprend pas pourquoi tu fait 0x02 et 0xE1.
    Sinon je vais tester le 0x7F0 au lieu de 0xFF.

  10. #9
    invite8a011b82

    Re : MAsque en C et liaison SPI

    J'ai refait je préfère mettre comme masque 0x7F8 au lieu de 0x7F0 parce que sinon on perd le dernier bit du 1er octet.
    Explication:
    on garde le même message: 010 1110 0001
    Code:
    angle=(SCA_SPI_READ()<<3) && 0x7F8
    1er octet : 0101 1100
    <<3 : xxxx x010 1110 0xxx
    &0x7F8: xxxx 0111 1111 1000
    angle: xxxx 0010 1110 0000

    Code:
     angle |= (SCA_SPI_READ()>>5) & 0x07;
    2eme octet: 001x xxxx
    >>5 : xxxx x001
    &0x07: 0000 0111
    angle : 0000 0001
    |angle: xxxx 0010 1110 0000 (1er octet)
    angle: xxxx 0010 1110 0001

    là je pense que c'est mieux ( j'attend quand même les explications de micka_ch concernant l'envoi du MSB par un slave)
    merci

  11. #10
    RISC

    Re : MAsque en C et liaison SPI

    Titoune,

    Attention aux masques en langage C.....

    Les masques bit à bit se font avec & et | et pas avec && et ||

    Voir les tutoriels de C

    a+

  12. #11
    invite8a011b82

    Re : MAsque en C et liaison SPI

    Merci c'est une simple erreur de frappe

  13. #12
    micka_ch

    Re : MAsque en C et liaison SPI

    Bonjour,

    Je m'explique en prenant un exemple

    Nom : accel.png
Affichages : 71
Taille : 27,6 Ko

    Voilà le code pour lire l'accélération :

    Code:
    U16 XAccel;
    
    XAccel = ( (U16) (spi_read_byte() & 0x3F ) ) << 8;
    XAccel |= spi_read_byte();
    Pour moi U16 est une variable non-signé sur 16 bits.

    Salutations

  14. #13
    Tonave72

    Re : MAsque en C et liaison SPI

    En effet c'est mieux!

    J'avais bêtement repris ton exemple sans réfléchir
    Rien ne se perd, rien ne se crée, tout se transforme. Lavoisier

Discussions similaires

  1. émuler une liaison SPI
    Par invite72c69f9a dans le forum Électronique
    Réponses: 7
    Dernier message: 31/05/2012, 14h20
  2. Liaison spi
    Par invite59bcd9ab dans le forum Électronique
    Réponses: 2
    Dernier message: 01/02/2012, 17h33
  3. liaison SPI
    Par invited549592e dans le forum Électronique
    Réponses: 3
    Dernier message: 19/02/2010, 21h23
  4. Problème liaison SPI
    Par Pilou81 dans le forum Électronique
    Réponses: 15
    Dernier message: 21/01/2010, 19h25
Découvrez nos comparatifs produits sur l'informatique et les technologies.