Autor Tema: Sobre SPI de Master a Slave  (Leído 2095 veces)

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

Desconectado Berto

  • PIC16
  • ***
  • Mensajes: 191
Sobre SPI de Master a Slave
« en: 17 de Junio de 2016, 10:36:59 »
Solo consigo hacerlo funcionar con este metodo
Master:
Código: [Seleccionar]
void setup() {   
pinMode(SS2,OUTPUT);//---->
pinMode(SS3,OUTPUT);
 digitalWrite(SS2, HIGH);
 digitalWrite(SS3, HIGH);

SPI.begin(); // Inicializa SPI
pinMode(SCK,OUTPUT);////---->
pinMode(MOSI,OUTPUT);////---->
pinMode(MISO, INPUT);//<-----
SPI.setClockDivider(SPI_CLOCK_DIV8);// Ralentizar un poco el maestro
//SPI.setDataMode (SPI_MODE0);
Serial.begin(9600); // inicializa la comunicacion serial a 9600 bits por segundo

}
////3 FUNCIONES


void PM(byte S){
digitalWrite(S,HIGH);//!RW en SS
delay(1);
digitalWrite(S,LOW);//RW en SS (L.G.Neg) 
}
void skri(byte SS){
digitalWrite(SS,LOW);//RW en SS (L.G.Neg)
SPI.transfer(sen0); //delayMicroseconds (20);
PM(SS);
SPI.transfer(se00); PM(SS);//delayMicroseconds (20);
//delay(5);
SPI.transfer(sen1); PM(SS);//delayMicroseconds (20);
SPI.transfer(se11); //delayMicroseconds (20);
digitalWrite(SS,HIGH);//!RW en SS
delay(1);
}
Slave
Código: [Seleccionar]
void setup() {
  // put your setup code here, to run once:
pinMode(led,OUTPUT);
pinMode(led1,OUTPUT);
pinMode(led8,OUTPUT);
pinMode(SCK, INPUT);////
pinMode(MOSI, INPUT);////
pinMode(MISO, OUTPUT);
//SPI.begin(); // Inicializa SPI
//  enciende en modo esclavo el SPI
  SPCR |= bit (SPE);
  // activar interrupciones
 SPCR |= _BV(SPIE);

Pero no me vale hacer lo que haria en CCS
ISR (SPI_STC_vect){
 sen0=SPDR;
 se00=SPDR;
 sen1=SPDR;
se11=SPDR; //Como resultado las 4 byte acaban valiendo se11
}
Y tengo que señalarselo cada una con un switch
Código: [Seleccionar]
ISR (SPI_STC_vect){
switch (cspi){
case 0 : sen0=SPDR; break;
case 1 : se00=SPDR; break;
case 2 : sen1=SPDR; break;
case 3 : se11=SPDR; break;
}
if(cspi<3){ cspi++; } else { cspi=0; }
Esto no me parece fiable a la larga si algun dato falla en el envio el contador de nº dato cspi no coincidira con el adecuado y rrompera toda la cadena.
Segun yo SPDR es el registro donde se aplica uno a uno los 8 bits que recoge Slave cada vez que recive su SS O eso me creo, de ser a si me gustaria saber si hay alguna flhas de inicio por alguna parte para poder resetear desde inicio nuevo envio.
O formar un array de SPDR[X]
Tampoco tengo buen concepto de como funciona swith en C
¿Hace una comparacion y salta directamente al case x identico?
¿O los comprueba uno a uno? de ser a si lo mejor es librarse de el si el caso es el 30 relativamente tardaria un monton en llegar a el