Connettere due dispositivi via SPI - Arduino UNO

Sto provando a connettere due dispositivi via SPI. So che devo avere due CS diversi in modo che si alternino per farli funzionare separatamente. Ho scritto i due codici dei 2 dispositivi (che sono un BME280 e un LIS3DH) e funzionano separatamente. Ho provato a scrivere un codice combinato dei due ma on riesco a farlo funzionare.
Potreste spiegarmi il codice da inserire o spiegarmi in generale cosa ci dovrebbe essere?

Posta il codice che hai scritto e quali errori riscontri (sia di compilazione se ci sono che di funzionamento)

Attivi singolarmente prima uno e poi l'altro ? ... perché se singolarmente funzionano, salvo errori di programmazione, devono funzionare anche assieme, purché disabiliti l'uno prima di abilitare l'altro.

Ah ... mi racconado di NON allungare troppo il bus SPI ... max 10/15 cm.

Guglielmo

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_LIS3DH.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>

// Used for software SPI
#define LIS3DH_CLK 13
#define LIS3DH_MISO 12
#define LIS3DH_MOSI 11
// Used for hardware & software SPI
#define LIS3DH_CS1 10

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS2 9
#define SEALEVELPRESSURE_HPA (1013.25)

// software SPI
Adafruit_LIS3DH lis = Adafruit_LIS3DH(LIS3DH_CS1, LIS3DH_MOSI, LIS3DH_MISO, LIS3DH_CLK);
Adafruit_BME280 bme(BME_CS2, BME_MOSI, BME_MISO, BME_SCK); // software SPI

#if defined(ARDUINO_ARCH_SAMD)
// for Zero, output on USB Serial console, remove line below if using programming port to program the Zero!
   #define Serial SerialUSB
#endif

int CS1= 10;
int CS2= 9;
byte address = 0x00;

void setup(void) {
  
//pinMode (CS1, OUTPUT);
//pinMode (CS2, OUTPUT);

  
#ifndef ESP8266
  while (!Serial);     // will pause Zero, Leonardo, etc until serial console opens
#endif

  //LIS3DH test
  
  Serial.begin(9600);
  Serial.println("LIS3DH test!");
  
  if (! lis.begin(0x18)) {   // change this to 0x19 for alternative i2c address
    Serial.println("Couldnt start");
    while (1);
  }
  Serial.println("LIS3DH found!");
  
  lis.setRange(LIS3DH_RANGE_4_G);   // 2, 4, 8 or 16 G!
  
  Serial.print("Range = "); Serial.print(2 << lis.getRange());  
  Serial.println("G");
  
  
  //bme280 test
  //Serial.begin(9600);
  Serial.println(F("BME280 test"));

  bool status;
    
  // default settings
  status = bme.begin();
  if (!status) {
        Serial.println("Could not find a valid BME280 sensor, check wiring!");
        while (1);
  }
    
  Serial.println("-- Default Test --");

  Serial.println();

  delay(100); // let sensor boot up
}

void loop() {
  
    
 
    int value; 
    
    SPI.begin();
    digitalWrite(CS1, LOW);
    SPI.transfer(address);
    SPI.transfer(value);
    digitalWrite(CS1, HIGH);

    delay(1000);

    digitalWrite(CS2, LOW);
    SPI.transfer(address);
    SPI.transfer(value);
    digitalWrite(CS2, HIGH);
    

  //LIS3DH printing values
  
  lis.read();      // get X Y and Z data at once
  // Then print out the raw data
  Serial.print("X:  "); Serial.print(lis.x); 
  Serial.print("  \tY:  "); Serial.print(lis.y); 
  Serial.print("  \tZ:  "); Serial.print(lis.z); 

  /* Or....get a new sensor event, normalized */ 
  sensors_event_t event; 
  lis.getEvent(&event);
  
  /* Display the results (acceleration is measured in m/s^2) */
  Serial.print("\t\tX: "); Serial.print(event.acceleration.x);
  Serial.print(" \tY: "); Serial.print(event.acceleration.y); 
  Serial.print(" \tZ: "); Serial.print(event.acceleration.z); 
  Serial.println(" m/s^2 ");

  Serial.println();
 
  delay(200); 

  //bme280 printing values
  printValues();
  delay (1000);
  
}

void printValues() {
    Serial.print("Temperature = ");
    Serial.print(bme.readTemperature());
    Serial.println(" *C");

    Serial.print("Pressure = ");

    Serial.print(bme.readPressure() / 100.0F);
    Serial.println(" hPa");

    Serial.print("Approx. Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Humidity = ");
    Serial.print(bme.readHumidity());
    Serial.println(" %");

    Serial.println();
}[\code]

Perché usi la SPI software e non quella HW della MCU ? ? ? :o

Guglielmo

Ho cambiato e funziona perfettamente.
Grazie mille.
Mi sapresti spiegare la differenza tra la hardware e la software mode per SPI?

La prima è interamente gestita dalla MCU, la seconda ... è emulata via software ... a volte, per chip non completamente aderenti alle specifiche, può servire (basta modificare il codice 'C' in cui è scritta), ma, se non ci sono esigenze particolari ... assolutamente inutile usare una emulazione invece che l'HW dedicato alla funzione.

Guglielmo

Chiarissimo. Grazie :slight_smile: