Autor Tema: Como sincronizar la transmisión por SPI entre 2 pics?  (Leído 2934 veces)

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

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Como sincronizar la transmisión por SPI entre 2 pics?
« en: 21 de Octubre de 2006, 13:21:26 »
Hola! Mi problema es que tengo dos pics conectados por el bus SPI y no se como sincronizar la transmisión programando en CCS... Tengo los dos pics conectados(una maestro y otro esclavo, claro), uno enviando caracteres y el otro recibiendo; el caso es que el esclavo procesa varias veces el mismo dato antes de que llegue el siguiente.... no se como sincronizarlos¿? Se que en hay un bit de busy(BF=buffer full) para SPI pero he estado buscando en manual de CCS y no he visto niguna función que trabaje con este flag. He buscado en el foro y no he encontrado(igual no he sabido buscar bien... :?) ningún ejemplo al respecto.Si me pudieran esplicar como actuar o algún hilo donde fijarme, me harían un favor.... Muchas gracias!!!!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado manwenwe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2211
Re: Como sincronizar la transmisión por SPI entre 2 pics?
« Respuesta #1 en: 22 de Octubre de 2006, 11:47:01 »
Hola amigos! Veo que mi pregunta ha tenido poco exito... :lol: creo que es porque no he puesto codigo y no he explicado demasiado bien lo que preguntaba.. Como rectificar es de sabios, ahí va....

MASTER

#include <16f877a.h>
#use delay (clock=4000000)
#include <string.h


prueba()

{

while(!input(pin_e0));
SPI_WRITE('H');

while(!input(pin_e0));
SPI_WRITE('O');

while(!input(pin_e0));
SPI_WRITE('L');

while(!input(pin_e0));
SPI_WRITE('A');

while(!input(pin_e0));
SPI_WRITE('!');
}


void main (void)
{

SETUP_ADC_PORTS(NO_ANALOGS);
SET_TRIS_C(0b00010000);
SET_TRIS_A(0);
SET_TRIS_E(0);
OUTPUT_LOW(pin_a0);
delay_ms(5);
setup_spi(SPI_MASTER | SPI_L_TO_H );
prueba();
while(TRUE){};
}

ESCLAVO


#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP
#use delay (clock=4000000) /



#define LCD_DB4   PIN_B4
#define LCD_DB5   PIN_B5
#define LCD_DB6   PIN_B6
#define LCD_DB7   PIN_B7

#define LCD_RS    PIN_B0
#define LCD_E     PIN_B1
#include <string.h>
#include <flex_lcd2.c>



void main(void)
{
SETUP_ADC_PORTS(NO_ANALOGS);
SET_TRIS_A(0xFF);
port_b_pullups(FALSE);
SET_TRIS_B(0);
SET_TRIS_C(0b00011000);
setup_psp(PSP_DISABLED);
SET_TRIS_D(0);
SET_TRIS_E(0xFF);
setup_spi(SPI_SLAVE | SPI_L_TO_H);
lcd_init();




OUTPUT_high(pin_e0);
OUTPUT_low(pin_e0);
delay_us(20);
lcd_putc(spi_read());


OUTPUT_high(pin_e0);
OUTPUT_low(pin_e0);
delay_us(20);
lcd_putc(spi_read());

OUTPUT_high(pin_e0);
OUTPUT_low(pin_e0);
delay_us(20);
lcd_putc(spi_read());

OUTPUT_high(pin_e0);
OUTPUT_low(pin_e0);
delay_us(20);
lcd_putc(spi_read());

OUTPUT_high(pin_e0);
OUTPUT_low(pin_e0);
delay_us(20);
lcd_putc(spi_read());




while(TRUE);
}


He utilizado la linea E0 a modo de bit busy... para que el MASTER no envíe hasta que el ESCLAVO no termine de "hacer sus cosas" y así no saque por el LCD varias veces lo mismo(lo que hay en el buffer) y he dejado 20 microsegundos entre envios porque creo que con este tiempo es suficiente para la transición entre los buffers SPI de ambos PICs(lo he calculado...). El caso es que simulo en Proteus y lo que obtengo en el LCD es : "HOOOL" y si pruebo a cambiar el tiempo que hace esperar el esclavo al master antes de un "nuevo envio" cada vez sale una cosa diferente por el LCD y realmente no entiendo por qué. Espero que alguíen pueda explicarme que es lo que no entiendo para hacerlo mal o alguna forma mejor de enviar cadenas de caracteres. MUCHAS GRACIAS!!!
Ojo por ojo y todo el mundo acabará ciego - Mahatma Gandhi -

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como sincronizar la transmisión por SPI entre 2 pics?
« Respuesta #2 en: 23 de Octubre de 2006, 19:58:59 »
¿Porqué en el master no pones un envío dentro del while en el main? 

Envía algo, no importa qué, pero tal como lo veo yo, prueba se ejecutará solo 1 vez y será casi imperceptible y probablemente si enciendes ambos juntos, aún el LCD del esclavo esté en su proceso de inicialización.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Lobo_Azul

  • PIC10
  • *
  • Mensajes: 29
Re: Como sincronizar la transmisión por SPI entre 2 pics?
« Respuesta #3 en: 20 de Noviembre de 2010, 20:20:22 »
Mmmmmm, pues esto tiene mucho tiempo, pero yo quisiera ver si alguien me puede ayudar con un problema que tengo, pues mi esclavo no me envía datos  :(, podía alguien hecharme una mano?? El tema que estoy siguiendo por ahora es este:

http://www.todopic.com.ar/foros/index.php?topic=32340.0

Grax


 

anything