Problemas BUS SPI con un maestro y dos esclavos

Estoy con un proyecto de enviar datos de 2 sensores de temperatura ( dht22 y sonda termopar k con amplificador max31856 ). Tengo arduino UNO con la shield Ethernet w5100( comunicación con UNO a
través de SPI) el problema viene cuando intento ver los datos del amplificador max31856, que tambien tiene comunicación por SPI. No llego a entender muy bien la manera de hacer el código para que los la shield y el amplificador puedan enviar los datos, no me hace falta que sean a la vez. No se si alguien haya conseguido algún código de maestro con dos esclavos como es mi caso.

Leyendo tutoriales supuestamente para que el esclavo envie un dato hay que ponerlo en LOW, hasta ahi bien, pero en que parte del código se pone, se supone que dentro de la funcion loop no? En la función setup tengo los dos pines SS como salida.

Seguire el hilo de comentarios por si alguien se le ocurre algo.

Muchas gracias de ante mano. Un saludo

Elproblema esta en como trabajas con el bus de modo que quede deshabilitado uno y habilitado otro.
Esta ampliamente respondida esta consulta en el foro.
Debes usar un resistor pull-up para asegurar la inhibición del bus y usar diferentes Chip Selects para cada dispositivo que compart CLK MOSI y MISO. Lo que cambia es CS con una R pull-up

Cuando se selecciona se hace via LOW de modo que al inhibir hay que asegurar HIGH.

Busca en el foro dispositivos Multiples SPI o en ingles

Estado repasando los hilos referentes a spi, pero por mi tremenda torpeza...jeje no me queda claro el tema.
Montare la resistencia pull-up al pin ss del max31856, ( pin 9 ). Pero como lo hago con la shield? ya que va montado justo encima del arduino??
Le paso el código para ver si puede ver que me falta alguna funcion de la libreria o algo parecido...

#include <DHT.h>
#include <ThingSpeak.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Adafruit_MAX31856.h>


#define DHTPIN 3
#define DHTTYPE DHT22
#define oneWireBus
DHT dht(DHTPIN, DHTTYPE);



#define ONE_WIRE_BUS 2
int oneWirePin = 2;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensor(&oneWire);
Adafruit_MAX31856 max = Adafruit_MAX31856(9, 11, 12, 13);
const int slaveSelectPinNet = 10;
const int slaveSelectPin = 9;




// Iniciamos el Ethernet Shield
EthernetClient client;




void setup() {
  Serial.begin(9600);
  SPI.begin();
  dht.begin();
  sensor.begin();
  max.begin();
  max.setThermocoupleType(MAX31856_TCTYPE_K);
  Serial.println("Prueba  ds18b y dht22");
  SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0));
  

  // parte termopar k
    pinMode (slaveSelectPinNet , OUTPUT);
    pinMode (slaveSelectPin, OUTPUT);







 

  // Connect to local network and internet
  Ethernet.begin(W5100_MacAddress);
  Serial.println();
  Serial.print("W5100 IP Address: ");
  Serial.println(Ethernet.localIP());
  Serial.print("W5100 Subnet Mask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("W5100 Gateway: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.println();
  // Connect to Thingspeak server
  if (ThingSpeak.begin(client))
    // Connect to Thingspeak server
    if (ThingSpeak.begin(client))
    {
      Serial.println();
      Serial.println("Connect to Thingspeak Server...");
      Serial.println();
    }
    else
    {
      Serial.println();
      Serial.println("Failed to connect to Thingspeak Server!!!");
      Serial.println();
    }


}

void loop() {



  // termopar tipo k
  float k = max.readThermocoupleTemperature();

  
  // sensor dht22
  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Serial.println("Error al Leer Sensor DHT¡");
    return;
  }

  // sensor ds18b20
  int lectura = digitalRead(oneWirePin);
  float temp = sensor.getTempCByIndex(0);

  // impresiones monitor serial
  Serial.print("Temperatura en ds18b20: ");
  Serial.print(temp);
  Serial.println(" *C ");
  sensor.requestTemperatures();
  Serial.print("Humedad en dht22: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura en dht22: ");
  Serial.print(t);
  Serial.println(" *C "); 
  Serial.print("Termopar k: ");
  Serial.print(k);
  Serial.println(" *C "); 

// max31856 
  
digitalWrite(10, HIGH);
digitalWrite(9, LOW);
SPI.transfer( k);
digitalWrite(9, HIGH);




#ifndef W5100_MacAddress

  ThingSpeak.setField(1, temp);
  ThingSpeak.setField(2, t);
  ThingSpeak.setField(3, h);

#endif

  ThingSpeak.writeFields(Channel_Number, Write_API_Key);
  {
    Serial.println();
    Serial.println("Uploading data to Thingspeak Server...");
    Serial.println();
  }

 delay (5000);

}

La shield ya esta, tiene contemplada esta situación.

okk dices que la propia shield lleva internamente estas resistencias no?. Estado buscando el esquema del max31856 ( es de la marca adafruit) y viendolo, creo que también lleva resistencias pull-up

Como decia anteriormente no se si me falte algo en el código...o en la funcion setup me falte algo de inicializar...si hay que predefinir los valores del bus o vienen por defecto...no se.... :confused:

Esta debe ser tu topología y de hecho la estas haciendo correctamente.

Tienes conflicto con los pines usados y los de la Ethernet Shield

Adafruit_MAX31856 max = Adafruit_MAX31856(9, 11, 12, 13);
const int slaveSelectPinNet = 10;
const int slaveSelectPin = 9;

Tienes entonces
MAX31856_1 con CS 9
MAX31856_1 con CS 10 <== ERROR usado por CS del EthernetSHield

Asigna otro y no olvides que CS = 4 se usa con la SD del Ethernet Shield.

Bueno a ver, el slaveSelectPinNet ( pin 10 ) lo tengo para la shield, si lo elimino del codigo ya no me muestra la información por monitor serial. Lo tengo también como OUTPUT como indican en todos los tutoriales que e visto.

Se Supone que la shield es otro esclavo, por lo tanto tienes que asignarle el pin CS, no?

El slaveSelectPin ( pin 9 para el max31856 ) también como OUTPUT.

En la función setup, inicializo con "SPI.begin() " y el amplificador con " mas.begin() "

Es en la función loop lo que no se si lo estoy haciendo bien.

Si utilizo el ejemplo de codigo del max31856 me funciona con cualquier pin digital.

Gracias por seguir el problema.

Lo que ocurre es que no se asigna asi el CS del Shield. Por eso pensé que tenias de MAX.
Mira los ejemplos que usan tu shield.

Hola buenas, quería pasarme por aquí para contaros como acabo todo este rollo del SPI....jeje. Tras intentar poder juntar el amplificador termopar y la shield ethernet y no saber...decidí hacerme de un Nodemcu, al cual le conectado el amplificador para medir la temperatura de humos, el sensor dht22 y el sensor ds18b20. Estos datos los subo a un canal de thingspeak para poderlos guardar y ver en tiempo real a través del movil.
Muchas gracias por la ayuda recibida y espero algún día llegar a controlar este tipo de bus...
Por si alguien tiene algún proyecto parecido y le interesa el código que no dude en ponerse en contacto conmigo, un saludo!!