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

probleme spi sur pic18f46k22 ou 46j50



  1. #1
    skydarc

    probleme spi sur pic18f46k22 ou 46j50


    ------

    bonjour,

    J'espère trouver mon sauveur, sait on jamais.

    Tout est dans le titre, mais je développe un peu. voila 4 bons mois que je développe un gros projet sur un 4550 mais je suis arrivé aux limites de la mémoire de celui-ci. les 32ko ne sont pas suffisantes.

    Voila pourquoi je suis passé au 46k22 qui est bien plus lourd de ce coté là.

    Je suis bloqué sur un truc tout con. pour ce qui est des envois de données par SPI pas de pb. je communique bien avec un écran oled. par contre lorsque je teste une communication avec une carte sd je n'ai pas de réponse.

    Je ne sais pas si c'est du à un problème dans mon code (pourtant tout ce passe bien avec le 4550) ou à un problème de fréquence.

    Je precise que j'ai le même problème avec un 46j50.

    Je suis un peu perdu, y aurait-il quelqu'un qui ait un bout de code fonctionnel en spi sur 46k22 ou 46j50 (sur sd ca serait le perou lol).

    Je vous poste mon code de base (le projet entier est bien trop gros).

    #include <p18f46k22.h> //head file.

    #define cs LATBbits.LATB0 //define sd pin.

    #define SSP1IF PIR1bits.SSP1IF

    unsigned char r1=0;

    void delay_100ms(void);
    void spi_init(void); //spi init
    void spi_low(void); //produce low band func(sd card init use.)
    void spi_high(void); //produce high band func(sd card init use.)
    unsigned char sd_reset(void); //sd card init func
    unsigned char SD_SendCommand(char CMD, unsigned long arg, char CRC); //write sd card command func
    unsigned char SPI_WriteByte(unsigned char val); //write one byte func.
    unsigned char SPI_ReadByte(void); //receive one byte func.


    /////////////////////////////////////////////////
    //main
    void main()
    {
    unsigned char res;

    spi_init();

    while(1)
    {
    res= sd_reset(); //sd card init.
    if(res) break; //if init is abnormal,exit and don't perform the next func.
    }
    }

    ////////////////////////////////////////////////
    //spi init
    void spi_init()
    {
    TRISCbits.TRISC5=0; // SDO declarer en sortie
    TRISCbits.TRISC3=0; //SCK est declarer en sortie sur le maitre

    TRISCbits.TRISC4=1; // SDI declarer en entree

    SSP1STAT=0x80; // rising edge,send data.
    SSP1CON1=0x32; //high when idle.fosc/64
    }

    unsigned char SD_SendCommand(char CMD, unsigned long sct, char CRC)
    {
    unsigned char r1;
    //unsigned char adrss;
    unsigned char retry1=0; //repeat count.
    cs=0; //enable cs signal.

    SPI_WriteByte(CMD); //write command.
    SPI_WriteByte(sct>>24); //data segment the 4th byte.
    SPI_WriteByte(sct>>16); //data segment the 3th byte.
    SPI_WriteByte(sct>>8); //data segment the 2nd byte.
    SPI_WriteByte(sct); //data segment the 1st byte.
    SPI_WriteByte(CRC); //CRC check sum.

    while((r1 = SPI_WriteByte(0xff)) == 0xff)//wait ack.
    {
    if(retry1++ > 100) break; //overtime exit.
    }

    cs=1; //clear cs.

    return r1; //return the status value.
    }

    ////////////////////////////////////////////////
    //set low band.
    void spi_low()
    {
    SSP1CON1=0x31; //SPI clk use the system clk--fosc/64 0x32
    }

    ////////////////////////////////////////////////
    //set high band.
    void spi_high()
    {
    SSP1CON1=0x32; //SPI clk use the system clk--fosc/64 0x31
    }

    ///////////////////////////////////////////////
    //write one byte.
    unsigned char SPI_WriteByte(unsigned char val)
    {
    SSP1BUF = val; //load to send buffer
    while(!SSP1IF); //wait to finish sending.
    SSP1IF=0; //clear send finish flag.
    return SSP1BUF; //read the receive buffer(even the data is unvalid,it is still need cleared.)
    }

    ////////////////////////////////////////////////
    //SD reset.
    unsigned char sd_reset()
    {
    unsigned char i,tmp;
    unsigned char retry; //repeat times.

    retry=0;

    //spi_low(); //use low band.

    do
    {
    spi_low();
    for(i=0;i<10;i++) SPI_WriteByte(0xff);

    r1=SD_SendCommand(0x40, 0, 0x95);

    retry++;
    //if(retry>10) return 1; //overtime exit.
    } while(r1 != 0x01); //wait IDLE command return.

    retry = 0;

    SPI_WriteByte(0xff);

    r1 = SD_SendCommand(0x48, 0x1AA, 0x87);
    if(r1 == 0x01)
    {
    do
    {
    for(i=0;i<100;i++) SPI_WriteByte(0xff);
    r1 = SD_SendCommand(0x41, 1UL << 30, 0xFF);

    retry++;
    if(retry>100) return 1; //overtime exit.
    } while(r1);
    }
    else
    {
    do
    {
    for(i=0;i<100;i++) SPI_WriteByte(0xff);


    r1 = SD_SendCommand(0x41, 0, 0xFF);
    retry++;
    if(retry>100) return 1; //overtime exit.
    } while(r1); //wait Active command exit.
    }

    spi_high(); //use high band.
    return 0; //return normal.
    }

    -----

  2. #2
    nhenri

    Re : probleme spi sur pic18f46k22 ou 46j50

    utilisation de spi sur 26j50 (46j50 sur 28pins)
    void Init_Spi2(void)
    {

    EECON2=0x55;
    EECON2=0xaa;
    PPSCON=0; //unlock

    RPOR11=10 ; //SCK = RB0
    RPOR18=9 ; //SDO = RB7
    RPINR21=17 ; //SDI = RC6

    EECON2=0x55;
    EECON2=0xaa;
    PPSCON=1; //lock

    TRISCbits.TRISC6=1; //sdi
    TRISCbits.TRISC0=0; //sck
    TRISCbits.TRISC7=0; //sdo

    SSP2CON1bits.SSPM3=0; //MASTER /64
    SSP2CON1bits.SSPM2=0;
    SSP2CON1bits.SSPM1=1;
    SSP2CON1bits.SSPM0=0;

    SSP2STATbits.SMP=0; //sample ON RAISING EDGE

    SSP2STATbits.CKE=1; // IDLE = 0V & RISING EDGE
    SSP2CON1bits.CKP=0; //

    SSP2CON1bits.SSPEN=1; //SERIAL PIN ON
    ConsolePuts("intin spi2\n\r");

    }
    void Spi_Write2(char *buffer,unsigned char size)
    {
    unsigned char i;
    for(i=0;i<size;i++){
    // ConsolefPuts("%x\n\r",((unsign ed int)buffer[i])&0xff);
    SSP2BUF=buffer[i];
    while(!PIR3bits.SSP2IF);
    PIR3bits.SSP2IF=0;
    buffer[i]=SSP2BUF;
    }

    }
    //-----------------------------------------------
    char Spi_Wr_byte2(char buffer)
    {
    SSP2BUF=buffer;
    while(!PIR3bits.SSP2IF);
    PIR3bits.SSP2IF=0;
    return SSP2BUF;//SSP2BUF;
    }

    ///----------------------------

    void Init_Flash(void) //sst25 de microchip
    {
    unsigned int mem_startup_counter = 100;

    CE_FLASH_SENS=0;
    CE_FLASH=0;
    while(mem_startup_counter--!=50);
    CE_FLASH=1;
    while(mem_startup_counter--);

    CE_FLASH=0;
    Spi_Wr_byte2(FLASH_ID);
    // ConsolefPuts("Mem not detected %x\n\r",Spi_Wr_byte2(0));
    if(Spi_Wr_byte2(0)==0xBF)
    ConsolePuts("Mem detected\n\r");
    else
    ConsolePuts("Mem not detected\n\r");
    CE_FLASH=1;

    Flash_Wr_enable(); //unlock
    CE_FLASH=0;
    Spi_Wr_byte2(FLASH_WR_STATUS);
    Spi_Wr_byte2(0); //unlock that rock
    CE_FLASH=1;

    }
    -Nik-

Discussions similaires

  1. Problème liaison SPI
    Par Pilou81 dans le forum Électronique
    Réponses: 15
    Dernier message: 21/01/2010, 19h25
  2. Utilisation de mémoire SPI sur une ligne SPI utilisé
    Par VIIV dans le forum Électronique
    Réponses: 1
    Dernier message: 30/12/2009, 13h11
  3. probleme avec spi
    Par coubi dans le forum Électronique
    Réponses: 1
    Dernier message: 16/03/2009, 15h50
  4. [AVRStudio4 + Atmega128 + SPI] Probleme sur le port SPI
    Par emule dans le forum Électronique
    Réponses: 1
    Dernier message: 03/12/2008, 03h05
  5. Problème longueur de lignes SPI
    Par FantomX dans le forum Électronique
    Réponses: 0
    Dernier message: 15/07/2008, 15h12
Découvrez nos comparatifs produits sur l'informatique et les technologies.