TODOPIC

Microcontroladores PIC => dsPIC => Mensaje iniciado por: Renatox_ en 03 de Septiembre de 2012, 03:04:43

Título: SPI entre dos dsPIC
Publicado por: Renatox_ en 03 de Septiembre de 2012, 03:04:43
Hola como estan despues de tiempo, estoy teniendo problemas en comunicar dos dsPIC30F4011. Me funciona bien cuando el maestro envia un dato y el esclavo responde, pero cuando envio otro comando adicional y espero respuesta el esclavo me envia otro numero. Asi es como funciona:

el maestro:

Código: [Seleccionar]
   // esto ocurre cada 2mseg
   dsPIC1_CS=0;
   while (_SPITBF==1);
   SPI1BUF=1;                  // envia comando 1
   while (_SPIRBF==0);
   AIN1=SPI1BUF;            // recibo el numero 10
   dsPIC1_CS=1;

el esclavo:

Código: [Seleccionar]
while (1)
 {   while (_SPIRBF==0);
      data=SPI1BUF;

      if (data==1)
      {  while (_SPITBF==1);
          SPI1BUF=10;
      }
      if (data==2)
      {  while (_SPITBF==1);
          SPI1BUF=11;
      }
}


Esto el lo que no me funciona:

maestro:

Código: [Seleccionar]
   // ocurre cada 2mseg
   dsPIC1_CS=0;
   while (_SPITBF==1);
   SPI1BUF=1;
   while (_SPIRBF==0);
   AIN1=SPI1BUF;

   while (_SPITBF==1);
   SPI1BUF=2;
   while (_SPIRBF==0);
   AIN2=SPI1BUF;
   dsPIC1_CS=1;

El esclavo tiene el mismo codigo. Cuando leo AIN1 aveces recibo 10 otras no y cuando leo AIN2 no recibo nunca el numero 11

Acaso estoy aplicando mal los conceptos de transmision SPI?

saludos
Título: Re: SPI entre dos dsPIC
Publicado por: Suky en 03 de Septiembre de 2012, 10:50:51
Pero debes generar clock para el segundo byte, o sea yo lo haría mas o menos así:

Maestro:
Código: C
  1. dsPIC1_CS=0;
  2. ReadSPI1(); // Borro flag
  3. WriteSPI1(0x01);                        // Envio comando
  4. while(DataRdySPI1()==0);
  5. // Puedo generar una pequeña demora para darle tiempo al esclavo
  6. WriteSPI1(0xFF);                        // Leo data
  7. while(DataRdySPI1()==0);
  8. AIN1=ReadSPI1();
  9. dsPIC1_CS=1;

Esclavo:
Código: C
  1. while(DataRdySPI1()==0); // Esperamos a recibir dato
  2. data=ReadSPI1();
  3. if(data==1){
  4.     WriteSPI1(0x0A);
  5.     while(DataRdySPI1()==0);
  6.     ReadSPI1();
  7. }

Saludos!
Título: Re: SPI entre dos dsPIC
Publicado por: Renatox_ en 12 de Septiembre de 2012, 02:18:35
Hola asi es me faltaba generarle clock al esclavo para recibir su data.

Si quieres enviar primero tienes que recibir.
Si quieres recibir primero tienes que enviar.

Esto se cumple tanto para el maestro y el esclavo. Tambien poner pequeños retardos entre transmision de datos

maestro:
Código: [Seleccionar]
// dsPIC1 Inputs
   dsPIC1_CS=0;
   while (_SPITBF==1);
   SPI1BUF=1;
   while (_SPIRBF==0);
   basura=SPI1BUF;
   __delay32(15);
   while (_SPITBF==1);
   SPI1BUF=1;
   while (_SPIRBF==0);
   AIN1=SPI1BUF;
   dsPIC1_CS=1;

esclavo:
Código: [Seleccionar]
           while (_SPITBF==1);
           SPI1BUF=1;
           while (_SPIRBF==0);
           data=SPI1BUF;

           if (data==1)
            {  while (_SPITBF==1);
               SPI1BUF=10;
            }
           if (data==2)
            {  while (_SPITBF==1);
               SPI1BUF=11;
            }
           
           while (_SPIRBF==0);
           x=SPI1BUF;

saludos
Título: Re: SPI entre dos dsPIC
Publicado por: Suky en 12 de Septiembre de 2012, 11:07:20
De nada  ;-)