Problema bus SPI

#include <DS3232RTC.h>
#include <Time.h>
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <EEPROM.h>
File myFile;
#define chipSelectSD  53    // Piedino SS per la Scheda SD
#define chipSelectSonda 9  // Piednino SS per La scheda mikrobus 4..20 mA
int sceltafrequenza;  // prima variabile per sceglere la frequenza di registrazione
int frequenza ;       // seconda variabile per sceglere la frequenza di registrazione
long previousminuti = 0;   // variabile per memorizzare i minuti precedenti
float minuti; //variabile per conteggiare i minuti
unsigned long secondi; // variabile per contegiare i secondi
String ubicazione = "Ubicazione non definita" ;
String copyright = " Copyright xxxxxxx" ;
String inputString = "";
int loop_current;
int received_data;

// Valori ottenuti dalla calibrazione
const int ADC_4mA = 817.17;
const int ADC_20mA = 4008;
// Valori di Inizio e fondoscala
const int data_min_range = 0;
const int data_max_range = 1023;
void  (*software_reboot )(void) = 0; // riavvia Arduino per permettere la riscrittura delle  intestazioni su SD

void setup() {
  pinMode (chipSelectSD, OUTPUT);
  pinMode (chipSelectSonda, OUTPUT);
  //setto e resetto i dua canali SPI
  digitalWrite(chipSelectSD, LOW);
  delay(100);
  digitalWrite(chipSelectSD, HIGH);
  delay(100);
  digitalWrite(chipSelectSonda, LOW);;
  delay(100);
  digitalWrite(chipSelectSonda, HIGH);
  delay(100);

  SPI.begin;
  Serial.begin(115200);
  setSyncProvider(RTC.get);   // funzione per prelevare l'ora da RTC
  if (timeStatus() != timeSet)
    Serial.println("Impossibilitato a sincronizzarsi con  RTC");
  else
    Serial.println("RTC sincronizzato");
  Serial.print("Inizializzazione scheda SD ...");
  // verifica se la scheda SD è presente e funzionante
  if (!SD.begin(chipSelectSD)) {
    Serial.println("Scheda SD non funzionante o non presente");
    // se non lo e' ferma tutto
    digitalWrite(chipSelectSD, HIGH);
    return;
  }


  Serial.println("Scheda di memoria SD inizializzata");
  digitalWrite(chipSelectSD, LOW);
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  // creo ed apro il file datalog.txt
  if (dataFile) {
    dataFile.print(ubicazione);
    dataFile.print(';');
    dataFile.print(';');
    dataFile.print(';');
    dataFile.print(';');
    dataFile.print(copyright);
    dataFile.println(';');
    dataFile.println(';');
    dataFile.print("Giorno");
    dataFile.print(';');
    dataFile.print("Mese");
    dataFile.print(';');
    dataFile.print("Anno");
    dataFile.print(';');
    dataFile.print("Orario");
    dataFile.print(';');
    dataFile.print("Sensore1");
    dataFile.println(';');
    dataFile.println('\r');
    dataFile.close();  // chiudo il file
    digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
  }
}
void loop() {
  digitalWrite(chipSelectSD, HIGH);
  //Inserisco la lettura del canale 4..20mA
  delay(1000);
  digitalWrite(chipSelectSonda, LOW); // abilito la comunicazione SPI per la Sonda
  // read the loop current
  loop_current = ReadFrom420mA();
  // error checking
  if (loop_current == -1)
    Serial.println("Errore: Circuito aperto");
  if (loop_current == -2)
    Serial.println("Errore : Corto Circuito");
  // All is OK, erwmapping to initial data range
  received_data = map(loop_current, ADC_4mA, ADC_20mA, data_min_range, data_max_range);
  Serial.print("Valore letto: ");
  Serial.println(received_data);
  
  digitalWrite(chipSelectSonda, HIGH); // disabilito la comunicazione SPI per la Sonda
  secondi = (millis() / 1000); //Converto in secondi il tempo passato dall'accensione
  minuti = secondi / 60; // Converto i secondi in minuti

  // cambio del tempo di registrazione in base alla scelta inviata dal programma fatto con Visual Studio
  switch (sceltafrequenza) {
    case 1:
      frequenza = 1;
      break;
    case 5:
      frequenza = 5;
      break;
    case 10:
      frequenza = 10;
      break;
    case 15:
      frequenza = 15;
      break;
    case 30:
      frequenza = 30;
      break;
    case 60:
      frequenza = 60;
      break;
  }

  if (minuti - previousminuti > frequenza ) {
    previousminuti = minuti;//Tiene in memoria l'ultimo valore di tempo
    registradati();  // Vado a scrivere le registrazioni sula SD
  }
  
  // leggi il file su SD con comando su seriale su interrogazione da programma fatto con Visual Studio
  while (Serial.available()) {
    char c = (char)Serial.read();

    if ((c < 48) || (c > 57)) {
      return;
    }
    if (c == 48) {// il numero 0 equivale a 48 in ascii    
      delay(100);
      digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD
      myFile = SD.open("datalog.txt");
      while (myFile.available())
      {
        Serial.write(myFile.read());  // invio su seriale i dati registrati/letti sulla SD
      }
      myFile.close();
      digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
      //     inputString = "";
      return;
    }

// altre possibili interrogazooni fatta da programma creato su visual Studio
    
    if (c == 57) {// il numero 9 equivale a 57 in ascii
      delay(100);
      digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD   // COMMENTATO PER PROVARE
      SD.remove ("datalog.txt"); // cancello il file scrito su SD
      digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
      delay(50);
      software_reboot();  // riavvio arduino per ricreare le Inteestazioni
    }


    // da Programma fatto con Visula Studio cambio le frequenza di registrazione 
    if (c == 49) {// il numero 1 equivale a 49 in ascii
      delay(100);
      Serial.println ("1 minuto ");
      sceltafrequenza = 1;
    }
    if (c == 50) {// il numero 2 equivale a 50 in ascii
      delay(100);
      Serial.println ("5 minuti");
      sceltafrequenza = 5;
    }
    if (c == 51) {// il numero 3 equivale a 51 in ascii
      delay(100);
      Serial.println ("10 minuti");
      sceltafrequenza = 10;
    }
    if (c == 52) {// il numero 4 equivale a 52 in ascii
      delay(100);
      Serial.println ("15 minuti");
      sceltafrequenza = 15;
    }
    if (c == 53) {// il numero 5 equivale a 53 in ascii
      delay(100);
      Serial.println ("30 minuti");
      sceltafrequenza = 30;
    }
    if (c == 54) {// il numero 6 equivale a 54 in ascii
      delay(100);
      Serial.println ("60 minuti");
      sceltafrequenza = 60;
    }
  }

}
void registradati(void)
{
  int sensor0 = analogRead(0);  // legge il sensore analogico
  // scrivi su seriale data, ora e lettura degli ingressi Analogici
  digitalWrite(chipSelectSD, LOW); // abilito la comunicazione SPI per la SD
  File dataFile = SD.open("datalog.txt", FILE_WRITE);  // creo ed apro il file datalog.txt
  if (dataFile) {
 
    //se il file esiste lo compilo
    dataFile.print(day());
    dataFile.print(';');
    dataFile.print(month());
    dataFile.print(';');
    dataFile.print(year());
    dataFile.print(';');
    dataFile.print(hour());
    dataFile.print(':');
    dataFile.print(minute());
    dataFile.print(':');
    dataFile.print(second());
    dataFile.print(';');
    dataFile.print(received_data);  // valore in arrivo dallo scheda di conversione 4..20 mA
    dataFile.println(';');
    dataFile.println('\r');
    dataFile.close();  // chiudo il file
    digitalWrite(chipSelectSD, HIGH); // disabilito la comunicazione SPI per la SD
  }
}

unsigned int get_ADC(void) {
  digitalWrite(chipSelectSD, HIGH);
  unsigned int result;
  unsigned int first_byte;
  unsigned int second_byte;
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE1));
  digitalWrite(chipSelectSonda, 0); // abilito la comunicazione SPI per la Sonda
  first_byte = SPI.transfer(0);
  second_byte = SPI.transfer(0);
  digitalWrite(chipSelectSonda, 1); // disabilito la comunicazione SPI per la Sonda
  SPI.endTransaction();
  result = ((first_byte & 0x1F) << 8) | second_byte;
  result = result >> 1;
  return result;
}


int ReadFrom420mA(void)
{
  digitalWrite(chipSelectSD, HIGH);
  int result;
  int ADC_result;
  float ADC_avrg;
  for (int i = 0; i < 100; i++) {
    ADC_result = get_ADC();
    // Measure every 1ms
    delay(1);
    ADC_avrg = ADC_avrg + ADC_result;
  }
  result = (int)(ADC_avrg / 100);
  if (result < 750) {
    return -1;
  }
  if (result > 4009) {
    return -2;
  }
  return result;
}