Autor Tema: DSPIC como esclavo en SPI...  (Leído 4343 veces)

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

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
DSPIC como esclavo en SPI...
« en: 28 de Abril de 2009, 15:34:48 »
Hola a todos, nuevamente yo con problemas en SPI.... Resulta que quiero implementar algo así como un broadcast utilizado en TCP/IP para interconectar nuevos dispositivos a mi convertidor de frecuencia, entonces, el dspic Maestro envia un broadcast FFFF a toda la red, y los esclavos responden con su identificador... Asi se cuantos dispositivos hay, y que ID debo enviar en mi trama de datos para que llegue al destino correcto.

El problema está en que el maestro hace el envío del broadcast pero ningun esclavo responde.... Se quedan recibiendo y pos... NPI....

Alguna idea? o Ejemplo similar? yo he puesto un PIC18f como esclavo en CCS, pero probando ahora con el dspic y C30 nada que me da.

De antemano gracias.

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: DSPIC como esclavo en SPI...
« Respuesta #1 en: 28 de Abril de 2009, 19:07:07 »
Hola!

No creo que con SPI tenga sentido hacer eso .. en SPI siempre debe haber un maestro y uno o varios esclavos. El maestro debe conocer siempre cuantos dispositivos hay, ademas es el que controla el bus a traves de los pines de CS (chip select) es la unica manera para que en el bus no exista colisiones  ... ademas cada esclavo del SPI no responde hasta que el maestro genere la señal de CLK. Desde el punto de vista de hardware, creo yo, que hacer una red SPI de esa manera no tiene sentido.

Si quisieramos hacer una red SPI todos los CS deberian estar interconectados y eso esta un poco extraño  :? :? :? ADemas la respuesta a broadcast, el maestro deberia ir esclavo por esclavo preguntando ... entonces .... para que descubrir si ya conozco a todos los esclavos.


Donde si es posible es con I2C, si observas bien, en la configuracion del I2C no existe definicion de maestro o esclavo ... ¡todos son maestros! y todos pueden generar CLK. En el protocolo I2C, si un dispositivo quiere transmitir debe "oir" primero el bus y verificar que no esté ocupado, si está libre este transmite. El I2C tiene tambien direccion de broadcast y detector de colisiones.

Yo intenté hacer algo similar a las redes ethernet; sin embargo, el detector de colisiones en los dsPIC33FJ256MC710 no funciona.

Saludos!

« Última modificación: 28 de Abril de 2009, 19:31:17 por blackcat »
Control Automático, DSP & Microcontroladores

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: DSPIC como esclavo en SPI...
« Respuesta #2 en: 28 de Abril de 2009, 19:55:19 »
Coincido con blackcat excepto en que en I2C todos son esclavos, de hecho el estándar de Philips define que deben exisitir maestros y esclavos, lo que si se intercambian son los roles de transmisor y receptor, en función de quién es el que controla la señal SDA (datos) mientras que el maestro es el que controla el reloj (SCL).

Ahora I2C si permite entornos multimaster, por lo que puden existir dos o mas maestros en el BUS, lo que permitiría hacer lo que mmX desea, siempre y cuando los dispositivos conectados al bus tengan la posibilidad de actuar como maestros. Por ejemplo una memoria Flash I2C nunca tendrá la posibilidad de actuar como maestro en I2C, ya que no tiene sentido que la memoria solicite que la lean o escriban.

En SPI tal como dice blackcat no tiene lógica algo así porque las conexiones solo pueden ser punto a punto, con un CS/ dedicado a cada esclavo, o con dispositivos conectados en daysi chain, lo que implica en ambos casos que se puede determinar o es preciso saber de antemano cuantos dispositios hay conectados al bus. En este caso el amo del bus es también quién controla el reloj, pero todos los dispositivos en principio actuan como transmisores y receptores a la vez en el intercambio de datos, por ello es que SPI utiliza tres líneas una de reloj y dos de datos.

mmX, aquí tienes una introducción al protocolo SPI:
http://www.wikitronica.net/index.php/SPI

Saludos
Reinier

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: DSPIC como esclavo en SPI...
« Respuesta #3 en: 29 de Abril de 2009, 11:06:49 »
Yo entiendo lo que me han querido decir a la perfección.... Lo que he querido es ahorrarme los CS en los dispositivos que voy a conectar a mi red SPI, básicamente quería implementar un CS por software y no por hardware, de igual forma por software puedo verificar si el buffer está lleno o está vacío. En fin, el grupo en el que trabajo decidimos realizarlo de otra manera porque esto de las colisiones físicamente si podría significar un problema...

Mi problema es mucho más sencillo aún ahora. Tengo por ahora dos dsPICS33fj32mc204 hablando entre ellos. El maestro le envia 16 bits al esclavo, pero este pareciera no recibir la información ya que no devuelve absolutamente nada de nada, incluso la señal clk del maestro se está enviando junto con el dato que quiero.


Alguna idea? de verdad nunca había trabajado con SPI si no con i2C y bueno, esto me está dando un poco de jaqueca ya....!

Solo quisiera que el dspic recibiera un dato y respondiera con otro, así de simple, aunque para mí aún no es nada simple...

Algún ejemplo, o comentario al respecto?, Muchas Gracias!

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: DSPIC como esclavo en SPI...
« Respuesta #4 en: 29 de Abril de 2009, 19:37:31 »
Porque no pones el codigo y vemos que podemos hacer ... yo tengo vacacioncitas ahorita ... ahi te puedo hechar una manita!

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: DSPIC como esclavo en SPI...
« Respuesta #5 en: 01 de Mayo de 2009, 11:34:07 »
A continuación el código del dspic Master.

Código: C++
  1. #include <p33fj32mc204.h>
  2. #include <spi.h>
  3.  
  4. _FOSCSEL(FNOSC_FRC);
  5.  
  6. _FWDT(FWDTEN_OFF);
  7.  
  8.  
  9.  
  10. int Device[15], i;
  11.  
  12. void configurarSPI(void)
  13. {
  14.         RPINR20bits.SCK1R = 19;
  15.         RPINR20bits.SDI1R = 20;
  16.         RPINR21bits.SS1R = 21;
  17.     RPOR12bits.RP24R = 8; //SCK1
  18.     RPOR12bits.RP25R = 7; //SD01  
  19.         SPI1STAT = 0x0;  //
  20.         SPI1CON1 = 0x0161;      // FRAMEN = 0, SPIFSD = 0, DISSDO = 0, MODE16 = 0; SMP = 0; CKP = 1; CKE = 1; SSEN = 0; MSTEN = 1; SPRE = 0b000, PPRE = 0b01
  21.         SPI1CON1bits.CKE = 0;
  22.         SPI1CON1bits.CKP = 0;
  23.     SPI1CON1bits.SPRE = 0b111;
  24.     SPI1CON1bits.PPRE = 0b01;
  25.     SPI1CON1bits.MODE16 = 0;
  26.     SPI1CON1bits.MSTEN = 1;
  27.         SPI1STAT = 0x8000; // enable the SPI module
  28.     TRISC = 0x0FF;
  29.     TRISA = 0x000;
  30.     SPI1STATbits.SPIRBF = 0;
  31.     SPI1STATbits.SPITBF = 0;
  32.     IFS0bits.SPI1IF=0;
  33.     IEC0bits.SPI1IE =0;
  34. }
  35.  
  36.  
  37.  
  38.  
  39. void  main (void)
  40. {
  41. configurarSPI();
  42.  
  43.  
  44. while(1)
  45. {
  46.  
  47. asm("nop");
  48.  
  49. WriteSPI1(0xaa);
  50. if( DataRdySPI1() )
  51. PORTA = ReadSPI1();
  52. }
  53.  
  54.  
  55.  
  56. }
El SPI debugger me indica que los datos se envian correctamente.

A continuación el código del dspic esclavo.

Código: C++
  1. #include <p33fj32mc204.h>
  2. #include <libpic30.h>
  3. #include <spi.h>
  4. _FOSCSEL(FNOSC_FRC);
  5.  
  6. _FWDT(FWDTEN_OFF);
  7. #define Broadcast 15
  8. #define CSID 2
  9.  
  10. int Device[15], i,Data;
  11.  
  12.  
  13.  
  14.  
  15.  
  16. void configurarSPI(void) {
  17. TRISC = 0x0FF;
  18.     TRISA = 0x000;
  19.         RPINR20bits.SCK1R = 19;
  20.         RPINR20bits.SDI1R = 20;
  21.         RPINR21bits.SS1R = 21;
  22.     RPOR12bits.RP25R = 7; //SD01  
  23.    SPI1BUF = 0;                     //Datasheet specifies the following order for setting SPI1 in slave mode
  24.    IFS0bits.SPI1IF = 0;             //Clear interrupt flag (no interrupt)
  25.    IEC0bits.SPI1IE = 1;              //Enable SPI1 interrupts
  26.    IPC2bits.SPI1IP = 5;             //#Set SPI1 interrupt priority pretty high, higher than all other user interrupts
  27.    SPI1CON1 = 0b0000000100011010;   //Setup for slave (0,0) mode with SS1 enabled.
  28.    SPI1CON2 = 0b0100000000000000;   //Do not used framed SPI
  29.    SPI1STAT = 0b0000000000000000;   //Clear all status bits
  30.    SPI1CON1bits.SMP = 0;            //Datasheet specifies this must be cleared.
  31.    SPI1CON1bits.CKE = 0;            //Mode (0,0)
  32.    SPI1CON1bits.SSEN = 0;           //SS1 disabled
  33.    SPI1STATbits.SPIROV = 0;         //Make sure no errors
  34.    SPI1STATbits.SPIEN = 1;          //Start SPI1
  35. }
  36.  
  37.  
  38. void spi_init_slave(void)/*sin SS habilitado*/
  39. {
  40.         RPINR20bits.SCK1R = 19;
  41.         RPINR20bits.SDI1R = 20;
  42.  
  43.     RPOR12bits.RP25R = 7; //SD01  
  44.         SPI1BUF=0;                              //limpia el buffer del módulo
  45.         IFS0bits.SPI1IF=0;              //limpia la bandera de interupción
  46.         IEC0bits.SPI1IE=0;              //habilita la interrupción del módulo
  47.         IPC2bits.SPI1IP=0x3;    //prioridad de interrupcion Nº3 (ADC tiene 4)
  48.         SPI1CON1bits.MSTEN=0;   //como slave
  49.         SPI1CON1bits.SMP=0;             //debe sere deshabilitado en modo Slave
  50.         SPI1STATbits.SPIROV=0;  //No receive overflow
  51.         SPI1STATbits.SPIEN=1;   //habilita el módulo SPI
  52.     TRISC = 0x0FF;
  53.     TRISA = 0x000;
  54.  
  55. }
  56.  
  57.  
  58.  
  59. void main (void)
  60. {int x;
  61.  
  62. spi_init_slave();
  63. TRISC= 0b0111111111;
  64.  
  65. while(1)
  66. {
  67.  
  68. while( !DataRdySPI1() ){}
  69.  
  70.          x = ReadSPI1();
  71.          PORTA = x;
  72.                 asm("nop");
  73.                 WriteSPI1(0xf0);
  74.  
  75.  
  76.  
  77.  
  78.  
  79.  
  80.  
  81.    
  82.  
  83.  
  84.  
  85. }
  86.  
  87. }

Aun nada.... el SS esta deshabilitado, no se que pueda ser. Gracias por responder

Desconectado blackcat

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 600
Re: DSPIC como esclavo en SPI...
« Respuesta #6 en: 01 de Mayo de 2009, 12:07:33 »
Aun no lo he probado ... pero yo hubiera esperado que la recepción en el esclavo fuera por interrupción.

Vamos a ver si asi funciona ... si no hago la sugerencia.

Saludos!
Control Automático, DSP & Microcontroladores

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: DSPIC como esclavo en SPI...
« Respuesta #7 en: 01 de Mayo de 2009, 13:06:57 »
Si sirve de algo, yo hice una vez un esclavo SPI mediante DMA, lo que dejaba al micro completamente libre para otras tareas.

Lo pegué aquí:
http://www.todopic.com.ar/foros/index.php?topic=15440.0

Desconectado mmX

  • PIC10
  • *
  • Mensajes: 37
Re: DSPIC como esclavo en SPI...
« Respuesta #8 en: 01 de Mayo de 2009, 13:50:47 »
Queria primero probarlo asi, y luego ir por interrupcion... Es la idea.. Nocturno gracias por la informacion.


 

anything