Autor Tema: SPI entre dos dsPIC  (Leído 2663 veces)

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

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
SPI entre dos dsPIC
« 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
control de movimiento

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: SPI entre dos dsPIC
« Respuesta #1 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!
No contesto mensajes privados, las consultas en el foro

Desconectado Renatox_

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 541
    • máquinas cnc
Re: SPI entre dos dsPIC
« Respuesta #2 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
control de movimiento

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: SPI entre dos dsPIC
« Respuesta #3 en: 12 de Septiembre de 2012, 11:07:20 »
De nada  ;-)
No contesto mensajes privados, las consultas en el foro


 

anything