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

Envoyer plusieurs octets avec SPI sur PIC16F



  1. #1
    AmigaOS

    Envoyer plusieurs octets avec SPI sur PIC16F


    ------

    Bonjour

    C'est la première fois que je tente de programmer une liaison SPI.
    Le maître est un PIC16F1779 et les esclaves 3 CI dont un BU97550KV avec lequel je suis en train de faire des tests.

    J'ai écris un premier programme que je n'ai pas encore testé et qui envoie 1 octet :
    Code:
        SSPDATPPS = 0b00001001 ; // RB1
        SSPCLKPPS = 0b00011010 ; // RD2
        SSPSSPPS  = 0b00011111 ; // RD7 (LCD)
        
        SSP1STATbits.SMP = 0 ;
        SSP1STATbits.CKE = 1 ;
        SSP1CON1bits.CKP = 0 ;
        SSP1CON1bits.SSPM = 0b0010 ; // 62500Hz // 0010 = SPI Master mode, clock = FOSC/64  ;  0001 = SPI Master mode, clock = FOSC/16
        SSP1CON1bits.SSPEN = 1 ; // SPI ON
        
            SSPBUF = data ;	// data=char
            while(!SSP1STATbits.BF) ; // Wait for Data Transmit/Receipt complete
        
        SSP1CON1bits.SSPEN = 0 ; // SPI OFF
    Ma question est, comment faire pour envoyer plusieurs octets de sorte à ce que le BU97550KV les reçois dans le bon ordre ?
    Suffit t'il de faire :
    Code:
            SSPBUF = data1 ;
            while(!SSP1STATbits.BF) ;
            SSPBUF = data2 ;
            while(!SSP1STATbits.BF) ;
            SSPBUF = data3 ;
            while(!SSP1STATbits.BF) ;
            … ??
    Et comment le BU sait quel octet reçu correspond à quoi ?

    Autre question: Y a t'il des avantages de choisir un mode d'horloge plutôt qu'un autre avec SMP, CKE, CKP ? Là j'en ai choisis un qui me semblait le plus normale sans savoir si c'est mieux ou pas.

    Merci

    -----

  2. Publicité
  3. #2
    webscience

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    Bonsoir,


    Demande sur ce site, spécialisé pour les microcontrôleur Pic : https://www.fantaspic.fr/index.php

    A+

  4. #3
    AmigaOS

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    J'ai avancé mon programme comme je le pensais et évidement après test ça ne fait rien.
    Je ne sais pas s'il s'agit d'un problème de bits de configuration du BU ou de la manière dont j'ai fait le programme en C qui ne marche pas, mais l’afficheur n'affiche rien.
    Je poste le code complet :
    Code:
    #define _XTAL_FREQ 4000000
    #include <XC.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    #pragma config FOSC = XT
    #pragma config FCMEN = OFF
    #pragma config IESO = OFF
    #pragma config CLKOUTEN = OFF
    #pragma config BOREN = OFF
    #pragma config CP = OFF //Protection mémoire?
    #pragma config MCLRE = OFF // PIN RESET
    #pragma config PWRTE = OFF
    #pragma config WDTE = OFF
    #pragma config LVP = OFF
    #pragma config LPBOR = OFF
    #pragma config STVREN = OFF
    #pragma config PLLEN = OFF
    #pragma config ZCD = OFF
    #pragma config PPS1WAY = OFF
    #pragma config WRT = OFF
    
    #define SEL_RTC PORTDbits.RD5
    #define SEL_GPS PORTDbits.RD6
    #define SEL_LCD PORTDbits.RD7
    
    int main(int argc, char** argv)
    {
        unsigned int i=0, j=0 ;
        unsigned char AFF1[3][19], AFF2[3][19] ; // Contiens les 6 trames à envoyer au BU. Je décompose en 2 pour éviter des problèmes de mémoire.
        TRISB   = 0b00001101 ;
        TRISD   = 0b00000001 ;
        ANSELB  = 0b00000000 ;
        ANSELD  = 0b00000001 ;
        PORTB   = 0b00010000 ;
        PORTD   = 0b11100000 ;
        OSCCON  = 0b00111000 ;
        // PPS :
        SSPDATPPS = 0b00001001 ; // RB1
        SSPCLKPPS = 0b00011010 ; // RD2
        SSPSSPPS  = 0b00011111 ; // RD7
       
        for(i=0 ; i<3 ; i++) for(j=0 ; j<19 ; j++) {AFF1[i][j]=0 ; AFF2[i][j]=0 ;} // Tout est à 0 sauf les octets qui suivent.
        AFF1[0][15]=0b00000001 ; AFF1[0][16]=0b01011111 ; AFF1[0][17]=0b11100111 ;
        AFF1[1][16]=0b00011111 ; AFF1[1][17]=0b11110111 ; AFF1[1][18]=0b10000001 ;
        AFF1[2][18]=0b00000010 ;
        AFF2[0][18]=0b00000011 ;
        AFF2[1][18]=0b00000100 ;
        AFF2[2][18]=0b00000101 ;
        AFF2[0][3]=0b00010000 ; AFF1[0][5]=0b10010001 ; AFF2[1][9]=0b10010001 ; AFF2[2][10]=0b10010001 ;   // N'importe quoi pour tester
       
        SSP1STATbits.SMP = 0 ;
        SSP1STATbits.CKE = 1 ;
        SSP1CON1bits.CKP = 0 ;
        SSP1CON1bits.SSPM = 0b0010 ; // 0010 = SPI Master mode, clock = FOSC/64=62500Hz ;
        SSP1CON1bits.SSPEN = 1 ; // SPI ON
       
        for(i=0 ; i<3 ; i++)
        {   
            SSPBUF = 0b10010010 ;   // Adresse 49h
            while(!SSP1STATbits.BF) ;
            SEL_LCD = 0 ;
            for(j=0 ; j<19 ; j++)
            {   
                SSPBUF = AFF1[i][j] ;
                while(!SSP1STATbits.BF) ;
            }
            SEL_LCD = 1 ;
            __delay_us(100) ;
        }
    
        for(i=0 ; i<3 ; i++)
        {   
            SSPBUF = 0b10010010 ;   // Adresse 49h
            while(!SSP1STATbits.BF) ;
            SEL_LCD = 0 ;
            for(j=0 ; j<19 ; j++)
            {   
                SSPBUF = AFF2[i][j] ;
                while(!SSP1STATbits.BF) ;
            }
            SEL_LCD = 1 ;
            __delay_us(100) ;
        }
       
        while(1){}
       
        SSP1CON1bits.SSPEN = 0 ; // SPI OFF
       
        return (EXIT_SUCCESS);
    }
    J'ai fait aussi ce jolie tableau qui contient les octets des trames à envoyer au BU :
    trammes spi BU.jpg

  5. #4
    umfred

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    Ton signal de sélection (SEL_LCD/SCE) est inversée électroniquement entre le PIC et le BU ? (sur les chronogrammes il est à 0 pendant l'envoi de l'adresse et à 1 pendant les données).
    N'hésites pas non plus à le forcer à 0 avant l'envoi de l'adresse.

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

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    Ah oui, j'avais zappé ça. Pour le BU l'état actif est l'état haut. J'avais lu l'article de Wikipedia avant qui dit l'inverse pour SPI de manière générale.
    Bon, je l'ai changé ça maintenant mais toujours rien

  8. #6
    AmigaOS

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    Des nouvelles! J'ai mis mon programme d'envoi de données dans une boucle while et j'ai regardé avec mon oscillo analogique ce qu'il y a sur chaque PIN du PIC, et la réponse c'est qu'il n'y a rien du tout sauf pour SCE qui varie.
    SCL=0V
    SDO=0V
    SDI=0V

  9. Publicité
  10. #7
    umfred

    Re : Envoyer plusieurs octets avec SPI sur PIC16F

    au lieu de tester SSP1STATbits.BF pour vérifier l'envoi, je crois qu'il faut tester le bit d'interruption PIR1.SSP1IF

Discussions similaires

  1. Envoyer un mail à plusieurs personnes ?
    Par Jean4259 dans le forum Internet - Réseau - Sécurité générale
    Réponses: 8
    Dernier message: 06/09/2016, 14h37
  2. (PIC16F / C) Octet sur plus plusieurs sorties (ex: PORTA = 0b10000000)
    Par RichardNoirPlus dans le forum Électronique
    Réponses: 4
    Dernier message: 30/10/2013, 18h22
  3. Réponses: 4
    Dernier message: 06/02/2013, 21h03
  4. envoyer des octets sur RC6/TX avec logipic ?
    Par chawkiz dans le forum Électronique
    Réponses: 2
    Dernier message: 23/06/2007, 17h18
  5. Réponses: 7
    Dernier message: 12/06/2007, 15h27
Découvrez nos comparatifs produits sur l'informatique et les technologies.