• Sábado 21 de Diciembre de 2024, 11:22

Autor Tema:  Nueva Con Spi  (Leído 5121 veces)

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Nueva Con Spi
« en: Jueves 24 de Agosto de 2006, 07:30 »
0
Hola, soy nueva con la interfaz spi y tengo algunos problemas.

Estoy trabajando con la libreria spi.h del compilador C18.  

Lo que intento hacer es, comunicar dos pics 18f4620 (master y slave) ambos con un oscilador de 20MHz. El master le envia un mensaje "hola" al slave. Este mensaje al ser recibido se imprime en el lcd del slave.

Bueno esto supongo que es muy sencillo...pero de verdad ha sido mi dolor de cabeza por muchos dias. El lcd del slave no esta escribiendo nada, lo que me hace suponer que no le esta llegando nada al slave o que estoy haciendo algo mal al recibir el mensaje.

No se que pueda ser... Seria muy feliz si me echaran una mano, dandole un vistazo al pequeño codigo de mi slave y mi master a ver si algo les parece que les esta faltando o sobrando.  :huh:

Este es el codigo de mi master

Código: Text
  1.  
  2.  
  3.  
  4. #include <p18F4620.h>
  5. #include <xlcd.h>
  6. #include <spi.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9.  
  10.  
  11. //Configuramos el SPI
  12. void config_SPI(void){
  13.  
  14.  
  15.  
  16.  //configuro el Serial Port SPI Master
  17.  OpenSPI( SPI_FOSC_16,
  18.     MODE_11,    
  19.     SMPMID);
  20.  
  21.  
  22. }
  23.  
  24.  
  25.  
  26. void trasmitiendo_datos(void){
  27.  
  28.  
  29.  
  30.  char frame[5] = "hola";
  31.  char buffer[16];
  32.  
  33.  //enviamos
  34.  putsSPI((unsigned char *)frame);
  35.  
  36.  
  37.  
  38.  //Envio un mensaje que diga que la data fue transmitida
  39.  SetDDRamAddr(0x00);
  40.  sprintf(buffer,(const rom far char *)"Datos Enviados!");
  41.  putsXLCD(buffer);
  42.  
  43. }
  44.  
  45.  
  46. void main(void){
  47.  
  48.  
  49.  
  50.  //salida del clock
  51.  TRISAbits.TRISA6 = 0;
  52.  TRISAbits.TRISA7 = 0;
  53.  
  54.  
  55.  
  56.  OpenXLCD(FOUR_BIT & LINES_5X7);
  57.  
  58.  
  59.  
  60.  config_SPI();
  61.  
  62.  
  63.  
  64.  trasmitiendo_datos();
  65.  
  66.  
  67.  
  68.  while(1){
  69.  &#59;
  70.  }
  71. }
  72.  
  73.  
  74.  


Y este es el codigo de mi slave.

Código: Text
  1.  
  2.  
  3.  #include <p18F4620.h>
  4. #include <xlcd.h>
  5. #include <spi.h>
  6. #include <stdio.h>
  7. #include <string.h>
  8.  
  9.  
  10. //string que recibira los datos
  11. unsigned char datos[5];
  12.  
  13.  
  14.  
  15. //Configuramos el SPI
  16. void config_SPI(void){
  17.  
  18.  
  19.  
  20.  OpenSPI( SLV_SSON,
  21.     MODE_11,    
  22.     SMPMID);
  23.  
  24. }
  25.  
  26.  
  27.  
  28. void recibiendo_datos(void){
  29.  
  30.  
  31.  
  32.  //recibimos
  33.  getsSPI(datos,5);
  34.    
  35.  //Envio un mensaje que muestre la data recibida
  36.  SetDDRamAddr(0x00);
  37.  putsXLCD(datos);
  38.  
  39.  
  40.  
  41. }
  42.  
  43.  
  44.  
  45. void main(void){
  46.  
  47.  
  48.  
  49.  //salida del clock
  50.  TRISAbits.TRISA6 = 0;
  51.  TRISAbits.TRISA7 = 0;
  52.  
  53.  
  54.  
  55.  OpenXLCD(FOUR_BIT & LINES_5X7);
  56.  
  57.  
  58.  
  59.  config_SPI();
  60.  
  61.  
  62.  while(1){
  63.   recibiendo_datos();
  64.  }
  65. }
  66.  
  67.  
  68.  
  69.  

De verdad muchisimas gracias por la ayuda que me puedan prestar. ;)

Saludos.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Nueva Con Spi
« Respuesta #1 en: Jueves 24 de Agosto de 2006, 13:24 »
0
Hola!
No me detuve mucho a ver el codigo, pero prueba lo siguiente:

1. Estan bien conectados los micros? Es decir, la pata por donde se transmiten los datos de uno (SDO) a la entrada de datos del otro (SDI), y viceversa.

2. Prueba algo mas simple, por ejemplo encender y apagar un LED al presionar un pulsador en el otro micro.

Saludos

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Nueva Con Spi
« Respuesta #2 en: Viernes 25 de Agosto de 2006, 23:51 »
0
Hola Huguen_aus_Tirol, como estas?

Revice los pines, y estan bien conectados. SDO.SDI y SCK.

Luego el codigo lo cambie para que el master le enviara un byte al slave... y nada lo deja en 0....cuando hago la simulacion en Proteus, parece que si se esta pasando la data del master al slave, pero no veo los resultados...

Aqui te pongo el codigo....no se si es que estoy utilizando mal la librería spi.h o que?

MASTER

Código: Text
  1.  
  2. unsigned char contador = 0b01010101;
  3.  
  4. //Configuramos el SPI
  5. void config_SPI(void){
  6.  
  7. //configuro el Serial Port SPI Master
  8. OpenSPI( SPI_FOSC_16,
  9.    MODE_11,    
  10.    SMPMID);
  11.  
  12. }
  13.  
  14. void trasmitiendo_datos(void){
  15.  
  16.   //enviamos
  17.   while(putcSPI(contador)<0);
  18.    
  19. }
  20.  
  21. void main(void){
  22.  
  23. //salida del clock
  24. TRISAbits.TRISA6 = 0;
  25. TRISAbits.TRISA7 = 0;
  26.  
  27. config_SPI();
  28.  
  29. while(1){
  30.   trasmitiendo_datos();
  31. }  
  32. }
  33.  
  34.  


SLAVE

Código: Text
  1.  
  2. //Configuramos el SPI
  3. void config_SPI(void){
  4.  
  5. OpenSPI( SLV_SSON,
  6.    MODE_11,    
  7.    SMPMID);
  8.  
  9. }
  10.  
  11. void recibiendo_datos(void){
  12.  
  13.   //recibimos
  14.   PORTD = getcSPI();
  15.  
  16. }
  17.  
  18. void main(void){
  19.  
  20.   //salida del clock
  21.   TRISAbits.TRISA6 = 0;
  22.   TRISAbits.TRISA7 = 0;
  23.  
  24.   TRISD = 0;
  25.   PORTD = 0;
  26.  
  27.   config_SPI();
  28.  
  29.   while(1){
  30.     recibiendo_datos();
  31.   }
  32. }
  33.  

No puede ser que la cosa mas tonta no la haga....ya estoy mal  :(  estoy tratando de hacer mi tesis que tiene un parte de comunicacion y no he podido salir de este punto...y pasan los dias....he intentado de todo y nada. De pana que lo que tengo me parece logico y no se por que no funciona.  :huh:


Estas son las funciones que uso, como estan en la libreria...




unsigned char putcSPI( unsigned char data_out )
{
  SSPBUF = data_out;           // write byte to SSPBUF register
  if ( SSPCON1 & 0x80 )        // test if write collision occurred
   return ( -1 );              // if WCOL bit is set return negative #
  else
  {
    while( !SSPSTATbits.BF );  // wait until bus cycle complete
  }
  return ( 0 );                // if WCOL bit is not set return non-negative#
}



unsigned char getcSPI( void )
{
  SSPBUF = 0x00;                  // initiate bus cycle
  while ( !SSPSTATbits.BF );      // wait until cycle complete
  return ( SSPBUF );              // return with byte read
}


Quizas tu o cualquier otra persona que vea el post pueda ver que cualquier cosa que yo no estoy viendo, por el estres. jiji

Bueno muchisimas gracias por su ayuda.

Por favor respondan  ;)

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Nueva Con Spi
« Respuesta #3 en: Sábado 26 de Agosto de 2006, 00:23 »
0
Hola,  ;)  acabo de probar algo y funciono....lo que pasa es que no se por que no funcionaba de la otra manera..

Lo que hice fue cambiar en la configuracion del slave para que fuera SLV_SSOFF es decir, segun la libreria spi.h, estuviera el ss habilitado. y le coloque que cuando recibiera verificara primero si el master activa el ss.

if(PORTAbits.RA5 == 0){
       PORTD = getcSPI();

Lo que no entiendo es que si yo tengo un solo esclavo...tengo necesidad de estar habilitando y trabajando con el pin ss??? es que creo haber leido que no necesariamente tenias que trabajar con ss cuando tenias un solo esclavo.

Que me dicen al respecto??

Saludos,  ;)

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Nueva Con Spi
« Respuesta #4 en: Sábado 26 de Agosto de 2006, 00:39 »
0
Hola! Por aquí todo bien, gracias; por alla?
Bueno... parece que no usamos el mismo compilador C, yo uso el CCS.
Estuve viendo en este compilador, y no encuentro como inicializar el modo SPI. Pero veamos... En tu código, inicializas al esclavo usando un parametro que es SLV_SSON; según me parece, estás habilitando la entrada de SlaveSelect, es decir que un pin del micro tiene que ponerse a 0 lógico para que el esclavo reciva los datos del maestro (creo que es RA5).
Según recuerdo de la hoja de datos, el modo SPI esclavo puede funcionar sin nesecidad de SS, es decir que siempre esta habilitado a recibir datos; yo te dirá que pruebes hacerlo así.
Por lo demás, el resto del código pareciera estar en orden.
Ups!!!! :rolleyes: que pasa aquí!!! no termino de escribir mi mensaje y ya me contestas!!!!????... bueno... no tengo más que decir :D  :lol:  :o  :whistling:

Que tengan un hermoso fin de semana :hola:

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Nueva Con Spi
« Respuesta #5 en: Sábado 26 de Agosto de 2006, 06:36 »
0
Hola Huguen_aus_Tirol, como estas? soy yo otra vez   :hitcomp:

Ahora estoy tratando de trabajar con string y estoy teniendo problemas  :( .... no se algo pasa con el clock del spi.... estoy usando estas funciones para obtener un string del buffer y colocar un string en el buffer para enviarlo al otro pic.

Código: Text
  1.  
  2. void getsSPI( unsigned char *rdptr, unsigned char length )
  3. {
  4.   while ( length )                // stay in loop until length = 0
  5.   {
  6.     *rdptr++ = getcSPI();         // read a single byte
  7.     length--;                     // reduce string length count by 1
  8.   }
  9. }
  10.  
  11.  

y

Código: Text
  1.  
  2. void putsSPI( unsigned char *wrptr )
  3. {
  4.   while ( *wrptr )                // test for string null character
  5.   {
  6.      SSPBUF = *wrptr++;           // initiate SPI bus cycle
  7.      while( !SSPSTATbits.BF );    // wait until 'BF' bit is set
  8.   }
  9. }
  10.  


Lo que estoy tratando de hacer ahora es enviar un "hola" de un pic a otro. Pero si pongo que solo transmita y reciba una vez, no lo hace..es decir, no se coloca nada en el lcd del slave....si coloco que envie varias veces el master y el slave solo reciba una vez, me salen las letras pero asi por lo menos HOAH.....Parece un problema de sincronizacion...que no entiendo porque el slave deberia usar el clock del master para recibir los bytes del string... :huh:

este es el codigo...

master

Código: Text
  1.  
  2. void config_SPI(void){
  3.  
  4. //configuro el Serial Port SPI Master
  5. OpenSPI( SPI_FOSC_16,
  6.          MODE_11,    
  7.          SMPEND);
  8.  
  9. }
  10.  
  11. void trasmitiendo_datos(void){
  12.  
  13.   esclavo = 0;
  14.  
  15.   putsSPI(contador);
  16.  
  17.   esclavo = 1;
  18.  
  19.   putsXLCD(contador);
  20. }
  21.  
  22. void main(void){
  23.  
  24.   //salida del clock
  25.   TRISAbits.TRISA6 = 0;
  26.   TRISAbits.TRISA7 = 0;
  27.  
  28.   TRISBbits.TRISB7 = 0;
  29.  
  30.   config_SPI();
  31.  
  32.   OpenXLCD(FOUR_BIT & LINES_5X7);
  33.  
  34. //  trasmitiendo_datos();
  35.  
  36.   while(1){
  37.     trasmitiendo_datos();
  38.   }  
  39. }
  40.  

slave

Código: Text
  1.  
  2. unsigned char data[];
  3.  
  4. //Configuramos el SPI
  5. void config_SPI(void){
  6.  
  7. OpenSPI( SLV_SSOFF,
  8.        MODE_11,    
  9.        SMPEND);
  10.  
  11. }
  12.  
  13. void recibiendo_datos(void){
  14.  
  15.   if(PORTAbits.RA5 == 0)
  16.     getsSPI(data,4);
  17.  
  18.   SetDDRamAddr(0x00);
  19.   putsXLCD(data);  
  20. }
  21.  
  22. void main(void){
  23.  
  24.   //salida del clock
  25.   TRISAbits.TRISA6 = 0;
  26.   TRISAbits.TRISA7 = 0;
  27.  
  28.   config_SPI();
  29.  
  30.   OpenXLCD(FOUR_BIT & LINES_5X7);
  31.  
  32.   recibiendo_datos();
  33.  
  34.   while(1){
  35.    &#59;
  36.   }
  37. }
  38.  
  39.  

Disculpa que ponga todo el codigo pero es que quiero que entiendas bien que estoy haciendo para ver si tu o cualquier otra persona me pueda dar luz....

Para mi es un problema con la sincronizacion, pero no entiendo por que??.. :(

Gracias por la ayuda de verdad.....  ya estoy fastidiosa.... lo mas triste es que pienso que debe ser una estupidez porque de verdad la logica me parece que esta bien....no?  :huh:

Gracias  ;)

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Nueva Con Spi
« Respuesta #6 en: Sábado 26 de Agosto de 2006, 19:28 »
0
Hola a todos, ya pude hacer funcionar el spi enviando y recibiendo string..pero eso solo en el simulador proteus... el problema era que habia colision ya que quizas estaba entrando una palabra al buffer para ser enviada mientras que se habia recibido otra.

PERO  :angry:  Cuando voy a hacerlo en fisico, a veces me escribe el hola que quiero y a veces escribe pura basura..., no se que es lo que pasa de verdad....ya estoy verde.

Esto fue lo que modifique del codigo anterior del master

Código: Text
  1.  
  2. void trasmitiendo_datos(void){
  3.  
  4.   signed char i;
  5.  
  6.   esclavo = 0;
  7.  
  8.   SetDDRamAddr(0x00);
  9.   for(i=0;i<4;i++)            
  10.     {
  11.     while(putcSPI(contador[i])<0);          
  12.        while(!SSPSTATbits.BF);  
  13.     putcXLCD(contador[i]);
  14.     }
  15.  
  16.   esclavo = 1;
  17.  
  18. }
  19.  
  20.  

el slave queda igual...

Si alguien tiene alguna idea de lo que pueda ser, le estaria muy agradecida de que me la hiciera saber...ya estoy harta de que algo que puede ser sencillo me este trayendo tantos problemas, y atrasandome en todo mi proyecto.  :(

Gracias por la ayuda.

Huguen_aus_Tirol

  • Miembro MUY activo
  • ***
  • Mensajes: 318
    • Ver Perfil
    • http://www.erhard-automation.co.cc
Re: Nueva Con Spi
« Respuesta #7 en: Miércoles 30 de Agosto de 2006, 00:09 »
0
Hola!
Si lo simulas en la PC y funciona, y en la placa no, yo te diría que controles el coneccionado (soldaduras, falsos contactos, etc)
Otra idea, prueba bajar la velocidad de transmisión.
Nos cuentas como va...

Saludos

vane_ccs

  • Miembro activo
  • **
  • Mensajes: 25
    • Ver Perfil
Re: Nueva Con Spi
« Respuesta #8 en: Martes 5 de Septiembre de 2006, 00:51 »
0
Hola a todos....

Probe lo de la coneccion y logre que enviara el mensaje bien...por ejemplo hola no llega como hodd ni nada por el estilo, sino como hola....pero sigo teniendo el mismo problema con la basura...ya que me manda el mensaje + basura  ?????  :huh:  

Alguien tiene alguna idea de que pueda ser?? :unsure:

Muchas gracias por la ayuda que dan  ;)

Saludos!!! :)