2 Подчиненных устройства SPI с 2 различными режимами SPI на одном Arduino Mega

Я работаю над проектом, в котором я прочитал 8 датчиков термопары MAX31856, используя библиотеку Adafruit. Это работает просто отлично и выводит считываемые данные в последовательный формат.

Я также хочу сохранить показания на карту microSD. И вот тут-то я и наткнулся на препятствие.

Я пытаюсь использовать библиотеку SdFat.h. Я могу перебирать свои термопары MAX31856 и записывать один раз на свою SD-карту, но после этого шина SPI зависает.

MAX31856 работает на SPI_MODE1 (согласно библиотеке Adafruit), а карта microSD, я полагаю, работает на SPI_MODE0. Я пытаюсь переключить режимы шины SPI до и после записи на SD-карту, но я думаю, что что-то не так после первой успешной записи на SD-карту. После первой итерации цикла кажется, что все данные в основном представляют собой шум на шине SPI.

Я использую плату Adafruit ADA254 microSD breakout, которая имеет пин для определения карты, поэтому я сначала проверяю, вставлена ли SD-карта, а затем записываю в файл.

Вопрос: Есть ли другой или лучший способ переключения SPI_MODES в каждом цикле? есть ли что-нибудь еще, что мне нужно рассмотреть, чтобы я вернулся к SPI_MODE1 соответствующим образом для термопар MAX31856?

Ниже приведен соответствующий код для того, что у меня происходит ...

void setup(){
   int sdCard = 36;
   char filename[10] = "test.txt";
}

void loop(){
....code to read thermocouples ...

/// ТОГДА ЭТО

  // перед записью убедитесь, что SD-карта все еще находится в сокете
  CardDetect = digitalRead(37);
  if(CardDetect == HIGH){
    
     SPI.setDataMode(SPI_MODE0);
     SPI.setClockDivider(SPI_CLOCK_DIV4);
     SPI.setBitOrder(LSBFIRST);
     digitalWrite(sdCard, LOW);
     sd.begin(sdCard, SD_SCK_MHZ(1));
    //ДАВАЙТЕ НАЧНЕМ СОХРАНЯТЬ ДАННЫЕ
          myFile.open(filename, O_WRONLY | O_CREAT | O_EXCL);
          myFile.write(now.unixtime());
          myFile.write(",");
            for(int i = 0; i<8; i++){
              myFile.print(TEMP[i]);
              myFile.write(",");
            }
          myFile.println();
          myFile.close();
          digitalWrite(sdCard, HIGH);
          SPI.setDataMode(SPI_MODE1);
          SPI.setClockDivider(SPI_CLOCK_DIV16);
          SPI.setBitOrder(MSBFIRST);
          delay(200);
    }

}

, 👍0

Обсуждение

в чем заключается ваш вопрос?, @jsotola

если ваш вопрос звучит так: Как мне отладить код?, То удалите весь код датчика и посмотрите, записан ли файл без сбоев, @jsotola

@jsotola - файл записывается без проблем на первой итерации. Однако после первого цикла кода шина SPI "дает сбои", и я неправильно считываю датчики, @NRav

Скорее всего, это связано с тем, что SD-карта или сам преобразователь уровней создают помехи для шины SPI. Я никогда не использую шину SPI совместно с SD-картой - она всегда находится на отдельной выделенной шине., @Majenko

@Majenko Я боялся этого... Мне нужны были все цифровые контакты, поэтому почему проект построен вокруг arduino Mega - есть ли способ добавить вторую шину SPI (возможно, программное обеспечение)? Подождите - вы автор книги: https://github.com/MajenkoLibraries/SoftSPI ?, @NRav

Я мог бы им быть. Прошло так много времени, что я понятия не имею, насколько хорошо это работает. Я настолько привык работать с чипами со встроенными 6 шинами SPI, что у меня не было причин использовать их в течение ряда лет..., @Majenko

библиотека Adafruit имеет встроенный программный SPI. используйте конструктор с номерами контактов "Создайте экземпляр объекта MAX31856 и используйте программные SPI-контакты`, @Juraj

@Juraj Я сделал это, каждый объект термопары MAX31856 создается их программными выводами SPI, например: `Adafruit_MAX31856 (22,50,51,52)` Опять же - мой код работает нормально, пока я не доберусь до логики SD-карты. Если я удалю логику SD-карты, код тоже будет работать. Это как-то связано с шиной SPI после чтения / записи на SD-карту, @NRav

В случае, если вы используете "дешевый" SD-ридер, шина SPI не может быть совместно использована. Мне больше повезло с SD-картой регистратора данных. Это связано с три-констатацией., @Michel Keijzers

@Michel я использую разделительную плату Adafruit... недешево. Я полагаю, что это как-то связано с различными режимами SPI_MODES между моими устройствами spi, @NRav

@NRav хорошо, тогда, вероятно, это не та проблема, которая была у меня давным-давно., @Michel Keijzers

не используйте аппаратные контакты SPI для программного SPI, @Juraj

@Juraj У меня сложилось впечатление, что объявление PIN-вводо было просто излишним... или я неправильно это истолковываю? В каком случае любые 3 цифровых вывода могут быть выводами шины SPI?, @NRav

это выходы, которые будет использовать программное обеспечение SPI. с помощью этого конструктора вы активируете программный SPI на выбранных контактах, @Juraj


1 ответ


Лучший ответ:

2

Для тех, у кого есть аналогичная проблема с шиной SPI, библиотека SdFat имеет встроенную программную опцию SPI (пример здесь).

Вам необходимо изменить ваш файл SdFat / SdFatConfig.h, но это минимально. Если у вас есть модуль карты microSD на отдельной шине, он не повредит основную шину SPI.

Переключение модуля SD-карты на собственную шину устранило проблему. Имейте в виду, что SPI программного обеспечения сопровождается штрафом за скорость.

,