Programación Específica > Programación en C
Nueva Con Spi
vane_ccs:
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 --- #include <p18F4620.h>#include <xlcd.h>#include <spi.h>#include <stdio.h>#include <string.h> //Configuramos el SPIvoid config_SPI(void){ //configuro el Serial Port SPI Master OpenSPI( SPI_FOSC_16, MODE_11, SMPMID); } void trasmitiendo_datos(void){ char frame[5] = "hola"; char buffer[16]; //enviamos putsSPI((unsigned char *)frame); //Envio un mensaje que diga que la data fue transmitida SetDDRamAddr(0x00); sprintf(buffer,(const rom far char *)"Datos Enviados!"); putsXLCD(buffer); } void main(void){ //salida del clock TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; OpenXLCD(FOUR_BIT & LINES_5X7); config_SPI(); trasmitiendo_datos(); while(1){ ; }}
Y este es el codigo de mi slave.
--- Código: Text --- #include <p18F4620.h>#include <xlcd.h>#include <spi.h>#include <stdio.h>#include <string.h> //string que recibira los datos unsigned char datos[5]; //Configuramos el SPIvoid config_SPI(void){ OpenSPI( SLV_SSON, MODE_11, SMPMID); } void recibiendo_datos(void){ //recibimos getsSPI(datos,5); //Envio un mensaje que muestre la data recibida SetDDRamAddr(0x00); putsXLCD(datos); } void main(void){ //salida del clock TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; OpenXLCD(FOUR_BIT & LINES_5X7); config_SPI(); while(1){ recibiendo_datos(); }}
De verdad muchisimas gracias por la ayuda que me puedan prestar. ;)
Saludos.
Huguen_aus_Tirol:
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:
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 --- unsigned char contador = 0b01010101; //Configuramos el SPIvoid config_SPI(void){ //configuro el Serial Port SPI MasterOpenSPI( SPI_FOSC_16, MODE_11, SMPMID); } void trasmitiendo_datos(void){ //enviamos while(putcSPI(contador)<0); } void main(void){ //salida del clockTRISAbits.TRISA6 = 0;TRISAbits.TRISA7 = 0; config_SPI(); while(1){ trasmitiendo_datos();} }
SLAVE
--- Código: Text --- //Configuramos el SPIvoid config_SPI(void){ OpenSPI( SLV_SSON, MODE_11, SMPMID); } void recibiendo_datos(void){ //recibimos PORTD = getcSPI(); } void main(void){ //salida del clock TRISAbits.TRISA6 = 0; TRISAbits.TRISA7 = 0; TRISD = 0; PORTD = 0; config_SPI(); while(1){ recibiendo_datos(); }}
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:
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:
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:
Navegación
[#] Página Siguiente
Ir a la versión completa