Sábado 21 de Diciembre de 2024, 11:22
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
»
Programación en C
(Moderador:
© Jonathan ©
) »
Nueva Con Spi
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Nueva Con Spi (Leído 5121 veces)
vane_ccs
Miembro activo
Mensajes: 25
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.
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 SPI
void 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 SPI
void 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.
Tweet
Huguen_aus_Tirol
Miembro MUY activo
Mensajes: 318
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
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
unsigned char contador = 0b01010101;
//Configuramos el SPI
void config_SPI(void){
//configuro el Serial Port SPI Master
OpenSPI( SPI_FOSC_16,
MODE_11,
SMPMID);
}
void trasmitiendo_datos(void){
//enviamos
while(putcSPI(contador)<0);
}
void main(void){
//salida del clock
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
config_SPI();
while(1){
trasmitiendo_datos();
}
}
SLAVE
Código: Text
//Configuramos el SPI
void 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.
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
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
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!!!!
que pasa aquí!!! no termino de escribir mi mensaje y ya me contestas!!!!????... bueno... no tengo más que decir
Que tengan un hermoso fin de semana
vane_ccs
Miembro activo
Mensajes: 25
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
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
void getsSPI( unsigned char *rdptr, unsigned char length )
{
while ( length ) // stay in loop until length = 0
{
*rdptr++ = getcSPI(); // read a single byte
length--; // reduce string length count by 1
}
}
y
Código: Text
void putsSPI( unsigned char *wrptr )
{
while ( *wrptr ) // test for string null character
{
SSPBUF = *wrptr++; // initiate SPI bus cycle
while( !SSPSTATbits.BF ); // wait until 'BF' bit is set
}
}
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...
este es el codigo...
master
Código: Text
void config_SPI(void){
//configuro el Serial Port SPI Master
OpenSPI( SPI_FOSC_16,
MODE_11,
SMPEND);
}
void trasmitiendo_datos(void){
esclavo = 0;
putsSPI(contador);
esclavo = 1;
putsXLCD(contador);
}
void main(void){
//salida del clock
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
TRISBbits.TRISB7 = 0;
config_SPI();
OpenXLCD(FOUR_BIT & LINES_5X7);
// trasmitiendo_datos();
while(1){
trasmitiendo_datos();
}
}
slave
Código: Text
unsigned char data[];
//Configuramos el SPI
void config_SPI(void){
OpenSPI( SLV_SSOFF,
MODE_11,
SMPEND);
}
void recibiendo_datos(void){
if(PORTAbits.RA5 == 0)
getsSPI(data,4);
SetDDRamAddr(0x00);
putsXLCD(data);
}
void main(void){
//salida del clock
TRISAbits.TRISA6 = 0;
TRISAbits.TRISA7 = 0;
config_SPI();
OpenXLCD(FOUR_BIT & LINES_5X7);
recibiendo_datos();
while(1){
;
}
}
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?
Gracias
vane_ccs
Miembro activo
Mensajes: 25
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
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
void trasmitiendo_datos(void){
signed char i;
esclavo = 0;
SetDDRamAddr(0x00);
for(i=0;i<4;i++)
{
while(putcSPI(contador[i])<0);
while(!SSPSTATbits.BF);
putcXLCD(contador[i]);
}
esclavo = 1;
}
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
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
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 ?????
Alguien tiene alguna idea de que pueda ser??
Muchas gracias por la ayuda que dan
Saludos!!!
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
»
Programación en C
(Moderador:
© Jonathan ©
) »
Nueva Con Spi