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

Aide programmation SPI



  1. #1
    bast3400

    Aide programmation SPI


    ------

    Bonjour,

    Actuellement j'essaie de communiquer via la liaison SPI du micro' HC12 vers un periphérique en utilisant la liaison SPI. Cependant, je n'arrive pas à établir cette communication, pas de signal sur l'horloge

    Pouvez vous me dire ce que je fais mal dans cette partie de code ?

    Code:
    void openSPI(void) {
      SPI0_BR=0x00;
      SPI0_CR1=0x50;
      SPI0_CR2=0x00;
    }
    
    void putcspi0(char cx) {
       char temp;
       PORTS_DONNEES = PORTS_DONNEES & 0x7F;
       while(!(SPI0_SR & SPI_SPTEF)==0);
       SPI0_DR=cx;
       while(!(SPI0_SR & SPI_SPIF)==0);
       temp = SPI0_DR;
       PORTS_DONNEES = PORTS_DONNEES |0x80; 
    }
    
    char getcspi0(void) 
    {
       PORTS_DONNEES =PORTS_DONNEES & 0x7F;
       while(!(SPI0_SR & SPI_SPTEF)==1);
       SPI0_DR=0x00;
       while(!(SPI0_SR & SPI_SPIF)==1);
       PORTS_DONNEES= PORTS_DONNEES  | 0x80;
    
       return SPI0_DR;
    }
    Dans le main je réalise l'initialisation du port.
    Code:
    PORTS_DIRECTION = 0xE0;          // SS, SCLK and MOSI pins sorties
    PORTS_DONNEES |= 0x80;
    Merci par avance

    -----

  2. Publicité
  3. #2
    satinas

    Re : Aide programmation SPI

    Salut,
    while (!(SPI0_SR & SPI_SPIF)==0) ;
    cela donne while ( (!(SPI0_SR & SPI_SPIF)) == 0 ) ;
    ou while ((SPI0_SR & SPI_SPIF) != 0) ;
    ou while (SPI0_SR & SPI_SPIF) ;

    ce serait pas plutôt :
    while ((SPI0_SR & SPI_SPIF)==0) ;
    ou while (!(SPI0_SR & SPI_SPIF)) ;

  4. #3
    bast3400

    Re : Aide programmation SPI

    J'ai essayé ça :
    Code:
    while (!(SPI0_SR & SPI_SPIF)==0) ;
    car sinon je ne rentre pas et ne sors pas des fonctions.

    Je ne vois pas comment faire fonctionner la communication.

  5. #4
    satinas

    Re : Aide programmation SPI

    le bit SPTEF je sais pas ce que c'est.
    Après avoir écrit l'octet à envoyer dans SP0DR, le bit SPIF passera à 1 pour signaler l'envoi du dernier bit, donc il faut boucler tant qu'il est nul.

  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
    bast3400

    Re : Aide programmation SPI

    SPTEF : Transmit Empty Interrupt Flag

    Après en regardant sur l'oscillo, je vois que je n'ai pas de clock sur SCK...

  9. #6
    satinas

    Re : Aide programmation SPI

    Pourquoi écris-tu while(!(SPI0_SR & SPI_SPTEF)==0);
    c'est pas clair et cela se simplifie (voir ci-dessus) en
    while ((SPI0_SR & SPI_SPTEF) != 0) ;
    donc attendre tant que le transmit buffer est empty, c'est à dire jusqu'à la Saint Glinglin, car au départ il est forcément vide.

  10. Publicité
  11. #7
    bast3400

    Re : Aide programmation SPI

    Même si j’enlève cette condition, je n'ai pas de retour :/

  12. #8
    satinas

    Re : Aide programmation SPI

    il ne fait pas les enlever, il faut les inverser

    led off;
    while ((SPI0_SR & SPI_SPTEF) == 0) ;
    led on; while (1);

    Après reset, si la led s'allume le while n'est pas bloquant, tu vérifies le suivant

  13. #9
    bast3400

    Re : Aide programmation SPI

    Donc d'après la doc, je fais un while qui attend que SPTEF passe à 1 pour ensuite écrire la donnée dans le data register puis un while derriere qui attend que SPIF passe à 1?
    Mais je ne suis pas sur de la marche à suivre étant donné que je ne lis rien :/

    SPIF — SPIF Interrupt Flag:

    This bit is set after a received data byte has been transferred into the SPI Data Register. This bit is
    cleared by reading the SPISR register (with SPIF set) followed by a read access to the SPI Data
    Register.
    1 = New data copied to SPIDR
    0 = Transfer not yet complete

    SPTEF — SPI Transmit Empty Interrupt Flag :

    If set, this bit indicates that the transmit data register is empty. To clear this bit and place data into the
    transmit data register, SPISR has to be read with SPTEF=1, followed by a write to SPIDR. Any write
    to the SPI Data Register without reading SPTEF=1, is effectively ignored.
    1 = SPI Data register empty
    0 = SPI Data register not empty

  14. #10
    Seb.26

    Re : Aide programmation SPI

    c'est pas plutot '&&' que tu veux dire ???

    mais écrire 'while(!(SPI0_SR & SPI_SPTEF)==0);' ... c'est vicieux ! ... tu devrais trouver une autre notation plus claire à mon avis ...
    << L'histoire nous apprend que l'on apprend rien de l'histoire. >>

  15. #11
    satinas

    Re : Aide programmation SPI

    Est-ce que tu vois des clock ?
    Tu pourrais n'avoir qu'une seule fonction "char xchgcspi(char c)"

  16. #12
    bast3400

    Re : Aide programmation SPI

    Justement je n'ai pas de clock sur SCK du port S.

  17. Publicité
  18. #13
    satinas

    Re : Aide programmation SPI

    Version modifiée du programme, puisque ma led n'a pas l'air de t'inspirer

  19. #14
    bast3400

    Re : Aide programmation SPI

    Le programme tourne mais la valeur obtenue après une lecture dans le SPI0_DR est aléatoire. Je ne vois pas pourquoi ça ne fonctionne toujours pas...

  20. #15
    satinas

    Re : Aide programmation SPI

    Tu as mis le microcontrôleur en mode SPI 0 (CPOL = 0 et CPHA = 0)
    Est-ce que le périphérique fonctionne aussi dans ce mode ?

  21. #16
    bast3400

    Re : Aide programmation SPI

    Oui, ils sont bien réglés. Soit j'ai des valeurs aléatoires, soit j'ai toujours 0xFF sur la pin MISO.

  22. #17
    gcortex

    Re : Aide programmation SPI

    As tu bien configuré les pins en entrée ou en sortie ?

Discussions similaires

  1. aide programmation PIC
    Par idham85 dans le forum Électronique
    Réponses: 3
    Dernier message: 12/04/2010, 14h53
  2. aide programmation C
    Par terry95540 dans le forum Électronique
    Réponses: 11
    Dernier message: 09/04/2009, 13h54
  3. aide programmation C
    Par invite9865321 dans le forum Électronique
    Réponses: 15
    Dernier message: 21/01/2009, 15h42
  4. aide en programmation en c
    Par j---b dans le forum Électronique
    Réponses: 0
    Dernier message: 12/06/2007, 16h45
  5. Aide à la programmation des PIC
    Par alainav1 dans le forum Électronique
    Réponses: 0
    Dernier message: 06/07/2005, 17h36
Découvrez nos comparatifs produits sur l'informatique et les technologies.