Autor Tema: SPI Full Duplex 16F877  (Leído 2049 veces)

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

Desconectado asysxx

  • PIC10
  • *
  • Mensajes: 9
SPI Full Duplex 16F877
« en: 13 de Mayo de 2012, 21:30:41 »
Saludos a todos. Estoy realizando un proyecto que involucra la comunicación serial SPI entre un MCU (Pic 16F877A) y un módulo del cual aún poco conozco. Mientras tanto, estoy haciendo mis pruebas de comunicación SPI. Encontré en este foro un  tema que me sirvió de mucho para el arranque.
Se trata de la comunicación de 2 pics 16f877, uno programado como Master y otro como Esclavo. En el tema que encontré el Master enviába un byte hacia el Esclavo y era mostrado por el último en un display. El detalle era que no se realizaba la transmisión de data desde el esclavo hacia el Master, cosa que puede ser útil para un funcionamiento interactivo. Así que luego de revisar los manuales, y comprender que el procedimiento SPI_READ(XxXX) puede ser invocado desde el master para transmitir la data XxXXX y a la vez recibir lo que haya en ese momento en el bufer.
De esta manera realicé como ejemplo las modificaciones, para lograr la confirmación de la data recibida por el esclavo. En realidad puede ser cualquier data procesada y escrita luego de la recepción.
La idea fundamental para entender el funcionamiento es considerar los bufers de salida de los dos MCUs como dos registros de corrimiento, donde luego de 8 ciclos de reloj, la data del master termina en el esclavo y viceversa simultáneamente.

PROGRAMA MASTER

Código: [Seleccionar]
#if defined(__PCM__)
#include <16f877.h>
#byte puerto_b=06
#use delay(clock = 4000000)

void main()
{
  int i;
  int tabla[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67};
  set_tris_b(0);
  set_tris_c(16);            // Configuración del puerto C para trabajar el spi
  setup_spi(spi_master | spi_l_to_h | spi_clk_div_16);
  do
   {
     for(i = 0; i<10; i++)
       {
           spi_write(tabla[i]);
           puerto_b=spi_read(0xff);// Se envía un 0xFF para recibir lo que haya en el esclavo
           delay_ms(750);
       }
   }
  while(true);
}

PROGRAMA ESCLAVO
Código: [Seleccionar]
#if defined(__PCM__)
#include <16f877.h>
#use delay(clock = 4000000)
#byte puerto_b=06

void main()
{
  unsigned int dat;
  set_tris_a(255);
  set_tris_c(223);
  set_tris_b(0);
  puerto_b = 0;
  setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);
  dat=0;
  do
   {
     if(spi_data_is_in())
       {
         dat=spi_read();
         if(dat!=0xff) puerto_b=dat;   
       }
   }
  while(true);
}



 

anything