[SOLUCIONADO] Arduino DUE+Ethernet+SPI

Buenas ! estoy tratando de conectar un dispositivo por SPI a un Arduino DUE el cual tiene un shield Ethernet w5100 para fines de comunicación. Resulta que no puedo hacer funcionar otro dispositivo que se conecta por SPI. En todos lados dice que en el scketch se deben configurar los pines CS, tanto para la ethernet (CS=10) como para el otro sensor (que para DUE me queda elegir el 52)... pero no puedo dar con la tecla... o anda la comunicación o el sensor... y no encuentro códigos de ejemplo por ningun lado ...alguna ayuda? gracias

Hola inelint,

En algunos dispositivos que requieren conexión SPI, el pin MISO (salida de datos desde el dispositivo) no se van a alta impedancia (o tercer estado) cuando su pin CS (selección de dispositivo) es alto (para su desconexión). Lo anterior no permite que otros dispositivos SPI se puedan conectar a la tarjeta Arduino. A lo mejor este sea tu caso, por lo que sería bueno que revisaras las especificaciones al respecto. En caso de que tu dispositivo se comporte como te lo he indicado, la solución es usar un driver con salida de tercer estado como por ejemplo el 74HC125 para aislar el pin MISO cuando el dispositivo en cuestión no sea utilizado. Saludos.

-p

Gracias Palliser. Igual imagino que habrá alguna forma de hacer funcionar dos dispositivos SPI en paralelo, a través de programa, porque la idea básica es que el que tiene el CS=high no emita y el que tiene CS=low sea el activo... y esto con programa se tiene que poder hacer, pero la verdad no paro de buscar en foros de todos los idiomas y no encuentro nada, y ya probé mil cosas (locas)... no sé porque parece tan raro, o como hace cualquier otro proyectista en usar un w5100 con algún otro sensor spi.... :frowning: seguiré buscando y sino meteré mano en el hardware siguiendo tu consejo palliser. abrazo

Que pasa si hago algo asi?? xq me parece coherente por como trabaja un bus SPI, pero no funciona…)

#include <SPI.h>
#include <sensorXX.h>
#include <Ethernet.h>

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(80);
#define Ethpin 10
#define SensorXpin 52


void setup()
{
  pinMode (SensorXpin, OUTPUT);
  pinMode (Ethpin, OUTPUT);
  digitalWrite(SensorXpin, HIGH);
  digitalWrite(Ethpin, HIGH);
  
  Serial.begin(9600);
  SPI.begin(SensorXpin);
  SPI.begin(Ethpin);
  
  digitalWrite(Ethpin, LOW);
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Servidor Web en la direccion: ");
  Serial.println(Ethernet.localIP());
  digitalWrite(Ethpin, HIGH);
  
  digitalWrite(SensorXpin, LOW);
……. //cosas
  digitalWrite(SensorXpin, HIGH);

}

void loop()
{   …..
}

Te recomiendo que intentes correr de nuevo tu codigo pero moviendo las siguientes dos lineas al final de setup().

Ethernet.begin(mac, ip);
  server.begin();

-p

lo acabo de intentar... nada :frowning:

Que version de Arduino IDE estas usando?

1.7.4

En el pasado he experimentado un problema similar y creo haberlo resuelto usando rutinas de suicheo para los dispositivos SPI, algo como:

// Habilitar sensor e inhabilitar Ethernet
void habilitarSensorX()
{
 pinMode(Ethpin, OUTPUT);
 digitalWrite(Ethpin, HIGH);
 pinMode(SensorXpin, OUTPUT);
 digitalWrite(SensorXpin, LOW);
}

// Habilitar Ethernet e inhabilitar sensor
void habilitarEth()
{
 pinMode(Ethpin, OUTPUT);
 digitalWrite(Ethpin, LOW);
 pinMode(SensorXpin, OUTPUT);
 digitalWrite(SensorXpin, HIGH);
}

-p

Yo siempre he recomendado esto

Ahora con el comentario de Palliser,

la solución es usar un driver con salida de tercer estado como por ejemplo el 74HC125 para aislar el pin MISO cuando el dispositivo en cuestión no sea utilizado. Saludos.

veo que debo antender los dos frentes.

Palliser, esa solución es impecable, yo hice algo parecido pero habilitando y desabilitando el CS de cada uno cada ver que uno de ellos tenia que "entrar"... tu solución es impecable. Pero sigue sin andar...

surbyte, voy a ver si pruebo lo tuyo.. vi ésta solución q la proponés también en otro hilo, pero porque un operacional solo en el slave2 ? cual sería la función?

No es un operacional, hablamos siempre de niveles lógicos, asi que es un inversor y solo por suponer me imagino que ese ESCLAVO tiene el problema que sugiere Palliser. Hasta ahora no me di cuenta a no ser por tu pregunte y el comentario anterior de Palliser.

Despues de mil idas y vueltas con el scketch y de 2 semanas con éste problema, veo en una página perdida en medio de la nada que a alguien le estaba pasando algo parecido, y el problema era el firewall del router... sin nada para perder puse DISABLE en la configuración y mágicamente empezó a andar... increible... gracias Palliser y surbyte (como siempre)

PD: de todas formas no sé cual es la explicación lógica de ésto... :o

el problema era el firewall del router… sin nada para perder puse DISABLE en la configuración y mágicamente empezó a andar.

Qué!!!
y qué tiene que ver con el SPI?

Ahh el que no te funcionaba era el ETHERNET, asi que parece que mezclamos cosas.

Una pregunta, como alimentas todo? SI me dices que con el USB te diré que eso tmb conspira.
Cuando uses Shield Ethernet alimenta todo con fuente externa.

Fuente externa siempre...! la verdad no se que tiene que ver lo del firewall con SPI, pero soy testigo, funcionó!

Quiero dejar en claro, que sin usar ningún tipo de configuración rara como he visto mucho en todos los foros de todos los idiomas que encontré, pude hacer convivir en un Arduino DUE, el shield Ethernet junto a un sensor SPI, la trampa (por asi decirlo) es que usé la CS = 4, reservada para el SD, y para ésto le soldé unas patas superiores al SPI de la shield para conectar mi sensor... espero que le sirva a algún otro y no pierda tanto tiempo como yo... saludos!