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);
}
}
@NRav, 👍0
Обсуждение1 ответ
Лучший ответ:
Для тех, у кого есть аналогичная проблема с шиной SPI, библиотека SdFat имеет встроенную программную опцию SPI (пример здесь).
Вам необходимо изменить ваш файл SdFat / SdFatConfig.h
, но это минимально. Если у вас есть модуль карты microSD на отдельной шине, он не повредит основную шину SPI.
Переключение модуля SD-карты на собственную шину устранило проблему. Имейте в виду, что SPI программного обеспечения сопровождается штрафом за скорость.
- Как увеличить скорость записи на SD-карту в Ардуино
- Какие контакты можно использовать для выбора микросхемы (CS, CC) на Arduino Nano Every?
- Сделать CS (chip select) для работаты в SPI (для и SD карты и OLED)
- Использование экрана SD-карты на Arduino Due
- Загрузить сайт с SD-карты
- Отобразить изображение с SD-карты на ЖК-дисплей ILI9486
- Аппаратный SPI Arduino NANO не работает
- Сбой при записи данных MPU-6050 на SD-карту
в чем заключается ваш вопрос?, @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