Autor Tema: comunicacion SPI, recibo 2 veces el mismo dato [Solucionado]  (Leído 2325 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pablolode

  • PIC16
  • ***
  • Mensajes: 123
comunicacion SPI, recibo 2 veces el mismo dato [Solucionado]
« en: 20 de Abril de 2018, 15:55:49 »
Hola , saludos a todos , estoy tratando de comunicar dos pic18f por SPI .
Para hacer un test le envió al esclavo  el valor de un contador, que voy incrementando cada x segundos , el caso es que el ESCLAVO me recibe el mismo dato dos veces( o lee en el buferr SSP1BUF el mismo dato) .
Los datos enviados por el MASTER los estoy viendo en el osciloscopio.
pero al recibirlos el SLAVE  en SSP1BUF veo que recibe el mismo datos dos veces ( lo veo con el ICD3)
O sea envió : 1
                    2
                    3
                    4
y el esclavo recibe : 1,1,2,2 ,y asi sucesivamente.
Alguna pista de podría estar mal?
Este es el código en main:

MASTER
      DelayMs(3000);   
   a++;
   WriteSPI(a);         // Send a byte
   while(!DataRdySPI());   // wait for a data to arrive
    temp = ReadSPI();

SLAVE

       WriteSPI(0xFF);
        while(!DataRdySPI());// wait for a data to arrive 
   temp = SPI_Read();

unsigned char ReadSPI( void )
{
  unsigned char TempVar;
  TempVar = SSP1BUF;        // Clear BF
  PIR1bits.SSP1IF = 0;      // Clear interrupt flag
  SSP1BUF = 0x00;           // initiate bus cycle
  while(!PIR1bits.SSP1IF);  // wait until cycle complete
  PIR1bits.SSP1IF = 0; // clear SSP1IF
  return ( SSP1BUF ); 
}

void WriteSPI(unsigned char dat) //Write data to SPI bus
{
  SSP1BUF = dat;
}

unsigned char DataRdySPI( void )
{
  if ( SSP1STATbits.BF )
    return 1 ;                // data in SSPBUF register
  else
    return  0 ;     

}
« Última modificación: 21 de Abril de 2018, 21:25:14 por pablolode »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #1 en: 20 de Abril de 2018, 16:55:16 »
No esta la funcion SPI_Read(), pero me imagino que devolvera el valor del registro.
Propongo probar algo mas simple (Usar la bandera y no el bit BF):

MASTER
Código: C
  1. while(1)
  2. {
  3.    PIR1bits.SSP1IF = 0;
  4.    DelayMs(3000);  
  5.    SSP1BUF = ++a;              // Send a byte
  6.    while(!PIR1bits.SSP1IF);   // wait for data to send
  7. }

Recepcion igual:

SLAVE
Código: C
  1. while(1)
  2. {
  3.    PIR1bits.SSP1IF = 0;        
  4.    while(!PIR1bits.SSP1IF);   // wait for data to receive
  5.    temp = SSP1BUF;
  6. }

Que resultados tenes ?

Desconectado pablolode

  • PIC16
  • ***
  • Mensajes: 123
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #2 en: 20 de Abril de 2018, 17:38:05 »
Hola KILLER,  el resultado es casi el mismo :
envio : 1,2,3,4,5
recepcion: 1
                 128
                 2
                 129
                  3
                 130
                 ...
y asi sucesivamente....

falto funcion read..
unsigned char SPI_Read(void)
{   

    SSP1BUF=0x00;      /* Copy flush byte in SSBUF */
    Nop();
    while(!PIR1bits.SSP1IF);   /* Wait for complete 1 byte transmission */
    PIR1bits.SSP1IF=0;
    return(SSP1BUF);
}
« Última modificación: 20 de Abril de 2018, 17:40:15 por pablolode »

Desconectado pablolode

  • PIC16
  • ***
  • Mensajes: 123
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #3 en: 20 de Abril de 2018, 17:56:35 »
 viendolo mas detenidamente (en binario MPLABX)  al enviar : 1, 2, 3,4,5,6
el esclavo recibe:
                1       >   00000001
                 129   > 10000001
                 2       > 00000010
                 130   > 10000010
                  3      > 00000011
                 131   > 10000011

que hace ese primer bit que cambia de 0 a 1???

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #4 en: 20 de Abril de 2018, 18:22:16 »
podes poner la configuracion de ambos tambien ?

Desconectado pablolode

  • PIC16
  • ***
  • Mensajes: 123
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #5 en: 20 de Abril de 2018, 19:25:41 »
Exelente¡¡  una buena idea para volver a  repasar uno a uno los bits de configuración ¡
tenia mal escrito el  SPI Clock Select bit , muchas gracias por la mano Killer¡¡ saludos¡¡¡¡

      ERROR           >     SSP1CON1bits.CKE   = 1;
       CORRECCION >    SSP1STATbits.CKE   = 1;

La configuracion quedo asi:

     //init spi
    SSP1CON1bits.SSPEN = 0;// disable MSSP
   
  #if defined(MICRO_MASTER)

    EEPROM_CS_TRIS  = 0;     // Drive SPI EEPROM chip select pin 
    EEPROM_SCK_TRIS = 0;    // Set SCK pin as an output
    EEPROM_SDI_TRIS = 1;    // Make sure SDI pin is an input
    EEPROM_SDO_TRIS = 0;    // Set SDO pin as an output
 
     EEPROM_CS_IO = 1;
#else
    EEPROM_CS_TRIS  = 1;     // Drive SPI EEPROM chip select pin 
    EEPROM_SCK_TRIS = 1;    // Set SCK pin as an output
    EEPROM_SDI_TRIS = 1;    // Make sure SDI pin is an input
    EEPROM_SDO_TRIS = 0;    // Set SDO pin as an output
   
#endif 
//    SPI MODE
//   SPICON1 = 0x21
     SSP1CON1bits.WCOL  = 0; //= no colision
     SSP1CON1bits.SSPOV = 0 ;//= no overflow
       
#if defined(MICRO_MASTER)
//      SSPM, SPI Master mode, Clock = FOSC/16
     SSP1CON1bits.SSPM3 = 0;
     SSP1CON1bits.SSPM2 = 0;
     SSP1CON1bits.SSPM1 = 0;
     SSP1CON1bits.SSPM0 = 1;
     SSP1STATbits.SMP   = 1;// sample bits SPI Master mode:
#else
     /*SLAVE*/
     //slave  c/enable pin selec
     SSP1CON1bits.SSPM3   = 0; //  SPI Slave mode, Clock = SCKx pin, SSx pin control enabled
     SSP1CON1bits.SSPM2   = 1; // 
     SSP1CON1bits.SSPM1   = 0;
     SSP1CON1bits.SSPM0   = 0;
     SSP1STATbits.SMP   = 0;   // SMP must be cleared when SPI is used in Slave mod
   
#endif
     
        SSP1CON1bits.CKP   = 0;// Clock Polarity Select bit, Idle state for clock is a low level = 0
        SSP1STATbits.CKE   = 1; // Transmit occurs on transition from active to Idle clock statek
       
        PIR1bits.SSP1IF    =0;       // clear interup flag
        SSP1CON1bits.SSPEN = 1; //= SSPEN ,enaable port ssp

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:comunicacion SPI, recibo 2 veces el mismo dato
« Respuesta #6 en: 20 de Abril de 2018, 19:40:07 »
Era una cosa u otra, el que recibas 2 veces lo mismo pense que podia ser que leyeras 2 veces lo mismo sin querer.
Pero visto que no lo era. Y que encima aparecia un bit de mas, por un momento pense que se enviaban 9 bits pero no era asi, asi que pense que podria haber otra cosa mal, por eso te pregunte por la configuracion. Ya que no habia otra cosa mas que buscar

De todas formas vos encontraste el error, asi que todo el merito es tuyo.