Autor Tema: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....  (Leído 12710 veces)

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

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« en: 10 de Octubre de 2010, 15:56:28 »
Que tal a todos, de nuevo dando lata, pues veran mi pregunta tiene que ver con la comunicacion SPI entre dos PIC's 18F4550, uno como maestro y el otro como esclavo (obvio jeje), se que hay mucha informacion y temas sobre esto en el foro, pero de verdad que lo he leido casi todo, y no logro hacer que el esclavo me envie datos, si me recibe datos, pero no me responde, entonces, concretando la pregunta:

¿Cual debe ser la secuencia correcta para que el esclavo envie un dato, por ejemplo un 0x02?

hasta ahora esto es lo que tengo:

Para el maestro:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(MASTER,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

void main(void)
{
bit_clear(TRISB,7);
bit_set(PORTB,7);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
bit_clear(PORTB,7);

while(1)
{
spi_write(0x01);
                delay_ms(1000);
}

}

Y para el esclavo:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(SLAVE,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,ENABLE=PIN_A5,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

int dato;

void main(void)
{
bit_clear(TRISB,7);
bit_clear(PORTB,7);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);

while(1)
{
if(spi_data_is_in())
{
dato=spi_read();
if(dato==0x01)
{
bit_set(PORTB,7);
delay_ms(400);
bit_clear(PORTB,7);
delay_ms(400);
}
}
}
}

Con esto solo le envio cada segundo un 0x01 desde el maestro hacia el esclavo, lo he simulado en proteus y funciona, he puesto un led en el RB7 del esclavo que parpadea cada ves que lee el dato.

Utilizo el RB7 del maestro para el chip select.

No soy experto en esto, de echo es la primera vez que lo uso, espero me puedan ayudar y claro corregir, que seguro la estoy regando en algo.

Gracias
« Última modificación: 10 de Octubre de 2010, 18:33:11 por Suky, Razón: El titulo no informaba de que se trata el tema... »
Nunca se deja de aprender

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #1 en: 10 de Octubre de 2010, 18:34:48 »
Fíjate que en modo esclavo en SPI se utiliza el PIN CS que habilita la comunicación.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado QIQE

  • PIC18
  • ****
  • Mensajes: 335
Re: Pregunta
« Respuesta #2 en: 10 de Octubre de 2010, 18:36:34 »
Quiza deberías emplear una interrupción cuando
Recibas datos por spi
Muchas gracias por vuestro tiempo.

Saludos desde valencia!!!

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #3 en: 10 de Octubre de 2010, 19:55:11 »
es CS o SS activo en bajo??? porque si es asi si lo estoy usando, y lo de la interrupcion ya lo probe tambien pero no me queda, seguire intentando
Nunca se deja de aprender

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #4 en: 10 de Octubre de 2010, 21:15:56 »
El Slave Select es Activo en Bajo en el protocolo SPI.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #5 en: 10 de Octubre de 2010, 21:52:26 »
correcto BrunoF, asi lo estoy usando, pero no logro que me envie un dato simple, como 0x02, por ejemplo, uso la funcion spi_write(0x02), claro en el codigo que coloque no esta esa parte, porque he estado haciendo pruebas, pero coloque lo que llevo para que mas o menos me puedan ayudar y decirme donde se podria poner la parte para que el esclavo me mande el valor y la parte en la que el maestro recibiria.

gracias por la ayuda
Nunca se deja de aprender

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #6 en: 10 de Octubre de 2010, 22:04:54 »
Realizaste algún debug? Cruzaste las lineas SDI y SDO?
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #7 en: 10 de Octubre de 2010, 23:36:21 »
correcto BrunoF, asi lo estoy usando, pero no logro que me envie un dato simple, como 0x02, por ejemplo, uso la funcion spi_write(0x02), claro en el codigo que coloque no esta esa parte, porque he estado haciendo pruebas, pero coloque lo que llevo para que mas o menos me puedan ayudar y decirme donde se podria poner la parte para que el esclavo me mande el valor y la parte en la que el maestro recibiria.

gracias por la ayuda

Hola. Nunca trabajé con dos microcontroladores comunicandose por SPI(en modo maestro-esclavo), pero hasta donde sé del protocolo el maestro es quien siempre inicia todas las peticiones. Nunca el esclavo. Algo similar sucede entre un Host y un Device en el protocolo USB(<=v2.0).
El esclavo puede recibir información del maestro, o bien enviarla, pero es siempre el maestro quien determina si quiere o no seleccionarlo y/o comunicarse con el. El maestro siempre es el que genera los pulsos de clock. Me parece que primero deberías intentar un byte desde el maestro hacia el esclavo, y luego sí, meterte ya a enviar desde el esclavo al maestro. Pero tené en cuenta que para eso, es el maestro el que debe iniciar la conversación siempre.

Puede que esté equivocado, pero es lo que recuerdo y lo que me parece lógico debido a las limitaciones de la capa física del protocolo SPI.

P.D. Es muy buena la observación que te hace Suky de que los cables SDI y SDO van cruzados entre los dispositivos...

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #8 en: 11 de Octubre de 2010, 01:16:13 »
Asi es compañero suky, he cruzado los cables, es decir, la salida del maestro a la entrada del sclavo y viceversa, realice un debug muy sencillo en Proteus, con el spi debug, pero solo veo como le llega el dato al esclavo y nunca devuelve nada, repito, el codigo que he puesto es lo que ya funciona, es decir solo del maestro al esclavo, y no en ambas direcciones.

mmm, y si es asi como lo comentas amigo BrunoF, el maestro es quien inicia la comunicacion y quien genera los pulsos de reloj, talves alguna configuracion se me ha ido, o algun delay, o alguna instruccion faltante o mal usada, ya no se, creo que necesito ver con mas calma otra ves las hojas de datos del micro.

gracias por la ayuda.
Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #9 en: 11 de Octubre de 2010, 01:34:30 »
aqui pongo la imagen del diseño inicial en proteus, es decir en un solo sentido (maestro---->esclavo) y funciona, o por lo menos veo la respuesta en el led,a este diseño he probado agregarle al maestro (PIC de la IZQUIERDA) en el pin RB6 otro led para comprobar que el esclavo(PIC de la DERECHA) envia un dato, no se talves he simulado mal, no soy experto en proteus, pero hasta ahora nada que puedo.

Se aceptan sugerencias por supuesto
Nunca se deja de aprender

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #10 en: 11 de Octubre de 2010, 06:09:12 »
Hola. Bueno, estuve mirando con un poquito mas de tiempo tu post y código.... Creo que el error resulta bastante evidente.

Como dijimos entonces, el master genera los clocks. Lo que significa que la unica manera de que el esclavo envie algo, es mientras el master genera clocks(y en consecuencia a ello, quiera o no, también estará enviando algún valor por su linea SDO).

Entonces, creo que el problema de que tu esclavo no envie nada, es que sencillamente no le has pedido en ningun momento a tu esclavo que envie y a tu master que escuche, para lograr lo que quieres...

Podria ser algo correcto en tus programas hacer algo así:

Para el maestro:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(MASTER,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

#Define CMD_SET_VALUE 0x01
#Define CMD_GET_VALUE 0x02

void main(void)
{
        char ReadedValue;        

bit_clear(TRISB,7);
bit_set(PORTB,7);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
bit_clear(PORTB,7);

while(1)
{
spi_write(CMD_GET_VALUE);        //indicar que queremos que el esclavo nos envie el valor
ReadedValue = spi_read();          //leer envío del esclavo.
                output_d(ReadedValue);              //mostrar el valor obtenido en el puerto D

                delay_ms(500);
        
                spi_write(CMD_SET_VALUE);        //indicar que queremos enviar un valor al esclavo
                spi_write(++ReadedValue);         //enviarle el valor leido previamente, pero incrementado para que el esclavo lo guarde actualizado al nuevo valor  

                delay_ms(500);
}

}

Y para el esclavo:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(SLAVE,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,ENABLE=PIN_A5,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

#Define CMD_SET_VALUE 0x01
#Define CMD_GET_VALUE 0x02

int dato;

void main(void)
{
        char myValue;


bit_clear(TRISB,7);
bit_clear(PORTB,7);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);

        myValue = 0;

while(1)
{
if(spi_data_is_in())
{
dato=spi_read();                       //leer comando a ejecutar
                        switch(dato){                            //seleccionar segun comando recibido
    case CMD_SET_VALUE:        //se ha recibido una peticion de setear el valor.
       myValue = spi_read();      //entonces leer el valor y almacenarlo
    break;

    case CMD_GET_VALUE:       //se ha recibido una peticion de enviar el valor.
bit_toggle(PORTB,7);       //indicarlo cambiando el estado del pin b7
spi_write(MyValue);        //y enviar el valor al master...
    break;
}
}
}
}


Obviamente ese mini protocolo lo arme para mostrarte el ejemplo y vos podés armarlo vos según tu necesidad y a medida.

P.D. Escribí el código "on the fly" por lo que no está excento a errores de sintáxis, compilación y menos aún, funcionamieto.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #11 en: 11 de Octubre de 2010, 09:15:05 »
mmm, y si es asi como lo comentas amigo BrunoF, el maestro es quien inicia la comunicacion y quien genera los pulsos de reloj, talves alguna configuracion se me ha ido, o algun delay, o alguna instruccion faltante o mal usada, ya no se, creo que necesito ver con mas calma otra ves las hojas de datos del micro.

Ups! Claro, falta un read_spi en el master para que genere el clock  :mrgreen: En SPI puede mandar y recibir datos al mismo tiempo  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #12 en: 11 de Octubre de 2010, 14:30:32 »
okidoki BrunoF, dejame probar lo me mencionas, y te pongo tambien el avance en el codigo que yo tengo, te agradesco mucho tu ayuda, Suky tambien muchas gracias hago pruebas y les digo si lo logre.
Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #13 en: 11 de Octubre de 2010, 15:07:06 »
Asi es amigo BrunoF, hice algo similar a lo que me mencionaste y funciona, ahora si entendi bien, lo que se hace es porner como un dato de control que le dice al esclavo si queremos leer de el, o escribirle, que son los que tu defines en el codigo, yo solo los puse asi directamente y funciona, ahora voy a depurar y hacer un programa mas complej. Gracias.
Nunca se deja de aprender

Desconectado thegame

  • PIC18
  • ****
  • Mensajes: 441
    • Mcu Tronics
Re: Pregunta, comunicación SPI entre dos PIC's 18F4550 ....
« Respuesta #14 en: 11 de Octubre de 2010, 20:24:09 »
me adelnte a pensar que ya funcionaba, porque ahora hay algo que no me cuadra, y me lleva a pensar que no funciona,  ahora que hago la simulacion en proteus y utilizo el SPI debug me sale esto:



ahora, no soy experto, como ya lo dije, pero por lo poco que entiendo, los datos subrayados de azul, son los que se envian, no??,y los de verde son los que se reciben, no???, bueno eso supongo yo.

entonces, lo que esta encerrado en el circulo rojo, corresponde al dato de comando que le envio al esclavo, para que este me envie un 0x44, pero no veo por ningun lado el 0x44. Entonces que paso ahi???????

esta es la configuracion que uso para el SPI debuger:



y estos son los codigos para el maestro:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(MASTER,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

int dato;

void main(void)
{
bit_clear(TRISB,7);
bit_clear(TRISB,6);
bit_set(PORTB,7);
bit_clear(PORTB,6);
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);
bit_clear(PORTB,7);

while(1)
{
spi_write(0x01); //enviar
spi_write(0x33);

delay_ms(500);

spi_write(0x02); //recibir
if(spi_data_is_in()==1)
{
dato=spi_read();
if(dato==0x44)
{
output_toggle(PIN_B6);
delay_ms(400);
}
}
delay_ms(500);
}

}

y para el esclavo:

Código: [Seleccionar]
#include<18f4550.h>
#fuses HS,PLL1,CPUDIV1,PUT,NOBROWNOUT,NOVREGEN,NOWDT,NOPBADEN,MCLR,NOLVP,NODEBUG,NOPROTECT
#use delay(clock=20000000)
//#use spi(SLAVE,DI=PIN_B0,DO=PIN_C7,CLK=PIN_B1,ENABLE=PIN_A5,MODE=1,BITS=8,FORCE_HW)

#BYTE TRISB=0xF93
#BYTE PORTB=0xF81

int dato,dato_leido;

void main(void)
{
bit_clear(TRISB,7);
bit_clear(PORTB,7);
setup_spi(SPI_SLAVE|SPI_L_TO_H|SPI_CLK_DIV_4|SPI_XMIT_L_TO_H);

while(1)
{
if(spi_data_is_in())
{
dato=spi_read();
if(dato==0x01) //recibe
{
dato_leido=spi_read();
bit_set(PORTB,7);
delay_ms(400);
bit_clear(PORTB,7);
delay_ms(400);
}
if(dato==0x02)//envia
{
spi_write(0x44);
}
}
}
}

creo que voy a salir traumado de esto jeje, pero bueno, gracias y espero alguien me ayude



Nunca se deja de aprender


 

anything