Autor Tema: como sincronizar maestro con esclavo en comunicacion spi (modo síncrono)  (Leído 2303 veces)

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

Desconectado black_flowers

  • PIC18
  • ****
  • Mensajes: 450
hola tengo un montaje (en realidad es una simulacion de proteus) de dos 16f876a comunicados por spi uno maestro y el otro esclavo y en modo síncrono. El esclavo recibe los datos del maestro (el cual está enviando el mismo caracter todo el rato) y los visualiza en un lcd. El problema que tengo es que necesito sincronizarlos (el maestro con el esclavo) de alguna forma ya que no estoy seguro de si el maestro espera a que el esclavo reciba el dato para empezar a enviar otra vez. Por cierto no lo estoy haciendo por interrupción. Os pongo el código del maestro y del esclavo por si sirve de algo. (lo que pregunto es por si no ha quedado claro, cómo puedo sincronizar el envío por parte del maestro con la recepción por parte del esclavo).


maestro

#include <pic1687x.h>


main()
{TRISC3=0;
TRISC4=1;
TRISC5=0;
STAT_SMP=1;
STAT_CKE=0;
CKP=0;
SSPM3=0;
SSPM2=0;
SSPM1=0;
SSPM0=1;
SSPEN=1;
while (1)
{SSPBUF='A';
while (STAT_BF=0);
}
}



esclavo

#include <pic1687x.h>

char registro;
long a;

void strobe();
void pausa();
void escribir_lcd(char caracter);
void strobe_pause();

main()
{


STAT_SMP=0;
STAT_CKE=0;
CKP=0;
SSPM3=0;
SSPM2=1;
SSPM1=0;
SSPM0=1;
SSPEN=1;

setup();               //Funcion de seteo de puertos
PORTB = 0b1;         //funcion "Clear display"
strobe();               //Strobe (E=1 ; pausa ; E=0)
pausa();               //Pausa para el LCD
PORTB = 0b1111;         //Activacion display, cursor en on, y blinking activado
strobe();
pausa();
PORTB = 0b110000;         //Display configurado a 1 linea, 8 bits , matriz 5x8
strobe();
pausa();

while (1)
{while (STAT_BF=0);
registro=SSPBUF;
escribir_lcd(registro);
}
}


void strobe()            //señal de strobe (Enable high y luego enable low)
{
   RC1 = 1;            //Se activa el enable...
   strobe_pause();         //Se hace una pequeña pausa
   RC1 = 0;            //Se baja el enable...
   strobe_pause();         //Se hace otro retardo pequeño
}

void pausa()               //Pausa de 2,3 mS
{
a=0;                  //Se inicia una variable en 0
while(a<400)               //Se hace un ciclo repetitivo.
   {
   a++;               //Se aumenta el valor de a
   }
}

void strobe_pause()               //Tiempo de enable en alto y bajo, 127 uS
{
   while(a<20)           
   {
   a++;
   }
}

void escribir_lcd(char caracter)
{
RC0=1;                  //Se activa pin conectado a RS
PORTB = caracter;               //Se configura puerto B con el valor del caracter
strobe();                  //Se hace un strobe
pausa();                  //una pausa
RC0=0;                  //Se baja RS
}

setup()                  //Funcion de seteo de puertos
{
   TRISA = 0xFF;            //Puerto A es entrada (el circuito mio es así)
   PORTA = 0x0;            //Se inicia en 0 (no se si es necesario en realidad)
   TRISB = 0x0;            //Puerto B salida
   PORTB = 0x0;            //puerto B en 0
   TRISC = 0x18;            //Puerto C para lcd y spi
   PORTC = 0x0;            //Puerto C en 0
}


 

anything