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

Communication SPI sur PIC24fJ



  1. #1
    number8one

    Communication SPI sur PIC24fJ


    ------

    Bonjour,
    Je dois mettre en oeuvre une communication SPI entre deux PIC24FJ.
    Le probleme, c'est que je n'arrive pas à obtenir le lancement de la communication.
    J ai une LED sur RB7 qui ne s'allume pas malgré ma commande, et j'ai une tension sur RB7 qui n'est ni à 0, ni à 5V.
    Je vous met donc le code, au cas ou vous auriez une idée du probleme?
    Merci

    #include <p24FJ64GA002.h>
    #include <spi.h>


    _CONFIG2(IESO_OFF & FNOSC_FRCPLL & OSCIOFNC_ON & POSCMOD_NONE) // Internal FRC OSC avec 4x PLL
    _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF )

    #define SPI_CS LATBbits.LATB12
    void init2 (void);

    int main (void)
    {
    init2 ();
    SPI_CS = 0;
    SPI1BUF = ( 1 );
    SPI_CS = 1;
    while (1);
    return 0;
    }

    void init2 (void)
    {
    AD1PCFG = 0x0FFFF;
    TRISA = 0;
    TRISBbits.TRISB12 = 0; // RB12 est le chip select
    TRISBbits.TRISB1 = 0; // RB1 EST SPI_CLK
    TRISBbits.TRISB0 = 1; // RBO EST SDI
    TRISBbits.TRISB2 = 0; // RB2 EST SDO
    TRISBbits.TRISB7 = 0; // sortie pour la LED
    LATBbits.LATB7 = 1; // Allumage de la led

    SPI_CS = 1;
    SPI2STAT = 0;
    SPI2BUF = 0;
    SPI2CON1 = 0x003F; // SPI2CON1.5 = 0;
    SPI2CON2 = 0;
    SPI2STAT = 0x8000;

    // Inputs SPI
    RPINR20bits.SDI1R = 0; //SDI1 = RP0 = RB0
    // Outputs SPI
    RPOR1bits.RP2R = 10; //RP2 = SDO1
    RPOR0bits.RP1R = 8; //RP1 = SCK1
    }

    -----

  2. #2
    RISC

    Re : Communication SPI sur PIC24fJ

    Salut,

    Il existe des exemples de code pour les PIC24F ici.
    Tu peux réutiliser les exemples pour le "004"

    a+
    Ma marotte ? les microcontrôleurs ;=)

  3. #3
    number8one

    Re : Communication SPI sur PIC24fJ

    OK merci. Je vais voir ca.
    A plus

  4. #4
    number8one

    Re : Communication SPI sur PIC24fJ

    Bonjour,
    je reviens vous voir pour ma communication SPI.
    Avec l'oscillo, je vois que la tension sur SPI_SS_PORT (RA1) varie de 0 à 1, donc que le systeme ne se bloque pas au niveau des WriteSPI1().
    Cependant, je n'ai toujours aucun signal sur la sortie clock du SPI.
    Je precise que je fais les tests sans puce esclave sur le bus SPI.
    Est-ce cela qui empeche le SPI de se lancer? Une autre idée peut-etre?
    Je sais que le programme est un peu long mais, je prefere que vous l'ayez en entier.
    Merci


    #include "p24FJ64GA002.h"
    #include "spi.h"

    _CONFIG2(IESO_OFF & FNOSC_FRC & OSCIOFNC_ON & POSCMOD_NONE) // Internal FRC OSC
    _CONFIG1(JTAGEN_OFF & GCP_OFF & GWRP_OFF & COE_OFF & FWDTEN_OFF )

    #define SPI_SS_TRIS TRISAbits.TRISA1
    #define SPI_SS_PORT PORTAbits.RA1

    int N, i;

    void SPI1Init(void)
    {
    //config SPI1

    SPI1STATbits.SPIEN = 0; // disable SPI port
    SPI1STATbits.SPISIDL = 0; // Continue module operation in Idle mode

    SPI1BUF = 0; // clear SPI buffer

    IFS0bits.SPI1IF = 0; // clear interrupt flag
    IEC0bits.SPI1IE = 0; // disable interrupt

    SPI1CON1bits.DISSCK = 1; // Internal SPIx clock is enabled
    SPI1CON1bits.DISSDO = 0; // SDOx pin is controlled by the module
    SPI1CON1bits.MODE16 = 0; // set in 16-bit mode, clear in 8-bit mode
    SPI1CON1bits.SMP = 0; // Input data sampled at middle of data output time
    SPI1CON1bits.CKP = 0; //
    SPI1CON1bits.CKE = 0;//1 // ... based on your communication mode.
    SPI1CON1bits.MSTEN = 1; // 1 = Master mode; 0 = Slave mode
    SPI1CON1bits.SPRE = 7; // Secondary Prescaler = 1:1
    SPI1CON1bits.PPRE = 3; // Primary Prescaler = 1:1
    SPI1CON1bits.SSEN = 0;
    SPI1CON2 = 0; // non-framed mode

    SPI_SS_PORT = 1; //
    SPI_SS_TRIS = 0; // set SS as output

    SPI1STATbits.SPIROV = 0;
    SPI1STATbits.SPIEN = 1; // enable SPI port, clear status
    }

    void WriteSPI1(unsigned int data_out)
    {
    if (SPI1CON1bits.MODE16) /* word write */
    SPI1BUF = data_out;
    else
    SPI1BUF = data_out & 0xff; /* byte write */
    }

    int main (void)
    {
    unsigned short i;
    AD1PCFG = 0x0FFFF;
    OSCCON = 0x0080;
    TRISBbits.TRISB7 = 0;
    PORTBbits.RB7 = 1;
    RCONbits.SWDTEN = 0;

    __builtin_write_OSCCONL(OSCCON & 0xbf);
    // Configure Input Functions **********************
    RPINR20bits.SDI1R = 0;

    // Configure Output Functions *********************
    RPOR1bits.RP2R = 7; // SDO1
    RPOR0bits.RP1R = 8; // SCK1
    // Lock Registers
    __builtin_write_OSCCONL(OSCCON | 0x40);


    SPI1Init();

    while (1) {
    for (i=0; i<0xffff; i++); // a simple delay

    SPI_SS_PORT = 0;
    WriteSPI1(1);
    SPI_SS_PORT = 1;
    for (i=0; i<0xffff; i++); // a simple delay

    SPI_SS_PORT = 0;
    WriteSPI1(1);
    SPI_SS_PORT = 1;
    for (i=0; i<0xffff; i++); // a simple delay

    __builtin_btg((unsigned int *)&LATA, 6);
    }

    return 0;
    }

Sur le même thème :

Discussions similaires

  1. Problème de communication PIC <-> EEPROM (SPI)
    Par guijac dans le forum Électronique
    Réponses: 1
    Dernier message: 22/10/2010, 00h00
  2. Communication SPI
    Par Neelo dans le forum Électronique
    Réponses: 4
    Dernier message: 10/07/2010, 02h58
  3. Communication SPI : PIC18(5V) <-> Flash ext. (3V)
    Par jorg1n dans le forum Électronique
    Réponses: 7
    Dernier message: 10/03/2010, 08h50
  4. Communication SPI entre PIC et autre circuit
    Par number8one dans le forum Électronique
    Réponses: 6
    Dernier message: 14/01/2010, 14h06
  5. Utilisation de mémoire SPI sur une ligne SPI utilisé
    Par VIIV dans le forum Électronique
    Réponses: 1
    Dernier message: 30/12/2009, 14h11
Découvrez nos comparatifs produits sur l'informatique et les technologies.