Go Down

Topic: Bus SPI y mútiples exclavos. (Read 153 times) previous topic - next topic

c_donosok

Hola a todos!
Estoy realizando un pequeño proyecto de asistente virtual. Por ahora tengo todo funcionando separado, sin embargo al mometo de querer juntar ciertos componentes tengo problemas.
Me explico, estoy utilizando una shield vs1053 y una pantalla tft 1.8 128*160, ambos componentes usan el BUS SPI.
Tengo entendido que nos interesa al CS para cambiar la comunicación de un exclavo a otro, sin embargo, cuando cambio de la pantalla a la shield y reproduzco una canción esta suena con interferencia (la shield sola suena de maravillas), claramente algo estaré haciendo mal, por lo que dejaré parte del código puesto:

Code: [Select]
#include "Ucglib.h"
#include <ThreeWire.h>
#include <SPI.h>
#include <SdFat.h>
#include <vs1053_SdFat.h>
int PANTALLA_CS = 22;
int MP3_CS = 9;

SdFat sd;
vs1053 MP3player;
Ucglib_ST7735_18x128x160_HWSPI ucg(2, 22, 3);


void setup(){

  SPI.begin();
  pinMode(PANTALLA_CS,OUTPUT);
  pinMode(MP3_CS,OUTPUT);
  //PANTALLA INICIALIZADA
  domaDormir();
 
  //MP3 INCIALIZADO
  sd.begin(SD_SEL,SPI_QUARTER_SPEED);
  MP3player.begin();
  MP3player.setVolume(0,0);
}

void loop(void)
{
  digitalWrite(MP3_CS, HIGH);
  digitalWrite(PANTALLA_CS, LOW);
  crearPantalla();
  delay(5000);
 
  digitalWrite(PANTALLA_CS, HIGH);
  digitalWrite(MP3_CS, LOW);
  MP3player.playTrack(10);
  delay(3000);
  MP3player.stopTrack();

  digitalWrite(MP3_CS, HIGH);
  digitalWrite(PANTALLA_CS, LOW);
  logoVerde();
  delay(5000);

}


La idea es lograr controlar un dispositivo u otro, ya que en el proyecto utilizaré la pantalla para motrar la hora o ciertos mensajes, después podré elegir la shield mp3 para colocar música ambiental o también un tranceptor LoRa para enviar un comando y que encienda o apague una luz, y poder tener libre movilidad entre ellos.

¡AGRADEZCO CUALQUIER AYUDA!



surbyte

El CS es quien controla el funcionamiento de cualquier dispositivo SPI. Para ello debes asegurar que SI O SI esten inhabilitados y eso se hace SOLO para aquellos dispositivos que no lo traen colocando una resistencia PULL-UP porque todos los CS son activos LOW

Entonces, si tienes SHIELDs o TFT como indicas, ambos deberían traer debidamente sus CS para quedar inhibidos cuando no se seleccionan.
Ahora bien, solo debes compartir MOSI, MISO y SCK y tener CS diferentes para cada dispositivo y con eso tiene que funcionar.
Si no lo hace es porque en el medio pones algo que detiene la ejecucción del otro dispositivo. El error mas común es usar delay() que para TODO.
Dicho y hecho miro tu código y me encuentro con tremendos

Code: [Select]
  delay(5000);

entonces ahi tienes tu problema!!!
Solución aprende a usar millis() y programar usando delay().

Ve a Documentación => Indice de temas tutoriales => millisl() y tienes varios tutos para entenderlo.

c_donosok

Hola!
Primero que nada agradecer la respuesta y disculparme por el doble post. No sabía donde colocar mi pregunta.
Por otra parte, agradezco la respuesta! Probaré para ver que ocurre.

Muchas gracias!

surbyte

Mi consejo es que destierres de tu programación el uso del delay() y solo lo uses para cosas mínimas.
En su lugar
Ve a Documentación => Indice de temas tutoriales => millis()

Aprende a usar millis() y tus programas funcionarán de otro modo.



Go Up