проблема с записью SD

У меня есть код Arduino для регистрации данных датчика, времени и даты. Затем я сохраняю все данные на SD-карте, а затем отправляю значение датчика на другой узел с помощью Lora. но я не могу записать данные на SD-карту. Пожалуйста, помогите мне решить эту проблему. Код также прилагается.

#include <RHReliableDatagram.h>
#include <RH_RF95.h>
#include "RTClib.h"
#include <SPI.h>
#include <SD.h>

RTC_DS1307 rtc;
File myFile;

#define node_address 12
uint8_t gateway_address = 11;
const int sensor_pin = A1;
float level;

/* Chip selection */
const int CS1 = 8;/*SD Card*/ 
const int CS2 = 10;/*LoRa*/ 

/* Configure LoRa driver */
RH_RF95 driver(10,2);
RHReliableDatagram manager(driver,node_address);

void setup () {
  pinMode(sensor_pin, INPUT);
  pinMode(CS1,OUTPUT);
  pinMode(CS2,OUTPUT);
// SPI.begin();`
  /*--------Serial port connection setup--------*/
  Serial.begin(9600);

  /*----------RTC Initialization----------*/
  Serial.println(F("Initializing RTC...!"));
  if (! rtc.begin()) {
    Serial.println(F("Couldn't find RTC"));
  }
  if (! rtc.isrunning()) {
    Serial.println(F("RTC is NOT running!"));
// rtc.adjust(DateTime(2019, 11, 12, 12, 32, 0)); // (Год, Месяц, Дата, Час, Мин, Сек)
  }

  /*----------SD CARD Initialization----------*/
  digitalWrite(CS2,HIGH);
  delay(500);
  digitalWrite(CS1,LOW);
  Serial.println(F("Initializing SD card..."));
  if (!SD.begin(CS1)) {
    Serial.println(F("initialization of SD Card is failed!"));
    return;
  }
  Serial.println(F("Initialization of SD Card is done."));
  /*----------LoRa Initialization----------*/
  digitalWrite(CS1,HIGH);
  delay(500);
  digitalWrite(CS2,LOW);
  if (manager.init())
  {
    Serial.println(F("LoRa Successfully Initialised "));
  } else {
    Serial.println(F("LoRa initialization failed"));
  }
  driver.setFrequency(433.0);
  driver.setTxPower(14,false);
  Serial.println();
}

void loop () {  
  DateTime now = rtc.now();
  /*----------Date----------*/
  Serial.print(now.year(), DEC);
  Serial.print('/');
  Serial.print(now.month(), DEC);
  Serial.print('/');
  Serial.print(now.day(), DEC);
  Serial.print(',');
  /*----------Time----------*/
  Serial.print(now.hour(), DEC);
  Serial.print(':');
  Serial.print(now.minute(), DEC);
  Serial.print(':');
  Serial.print(now.second(), DEC);
  Serial.println();

  /*----------SD card----------*/
  digitalWrite(CS2,HIGH);
  delay(500);
  digitalWrite(CS1,LOW);
  delay(100);
  myFile = SD.open("test.txt", FILE_WRITE); 
  if (myFile) {
    /*----------Saving Date----------*/
    myFile.print(now.year(), DEC);
    myFile.print('/');
    myFile.print(now.month(), DEC);
    myFile.print('/');
    myFile.print(now.day(), DEC);
    myFile.print(',');
    /*----------Saving Time----------*/
    myFile.print(now.hour(), DEC);
    myFile.print(':');
    myFile.print(now.minute(), DEC);
    myFile.print(':');
    myFile.print(now.second(), DEC);
    myFile.println(',');
    level = analogRead(sensor_pin);
    myFile.print(level);
    myFile.println();
    myFile.close();
  } else {
    Serial.println("Error opening test.txt");
  }
  delay(500);
  digitalWrite(CS1,HIGH);
  delay(500);
  digitalWrite(CS2,LOW);
  char data[RH_RF95_MAX_MESSAGE_LEN];
  sprintf(data,"$%d#%d",node_address,level);
  Serial.print("Level transferred is ");
  Serial.println(data);
  Serial.println(sizeof(data));
  if(!manager.sendtoWait((uint8_t*)data,sizeof(data),gateway_address))
  {
    Serial.println("Gateway offline");
  }
  delay(500);
}

, 👍0

Обсуждение

пусть библиотека обрабатывает вывод CS, @Juraj

Примечание из документации библиотеки SD: «Обратите внимание, что даже если вы не используете аппаратный вывод SS, его необходимо оставить в качестве вывода, иначе библиотека SD не будет работать». Штифт SS для nano, насколько я знаю, равен 10. Затем вы используете контакт в качестве чипа, выбранного для LoRa. Вероятно, библиотека RoRa что-то с ним делает, поэтому у SD-библиотеки возникли проблемы с ним. Возможно, вы пытаетесь заменить контакты CS. Я не обнаружил никаких проблем с изменением контакта SS для LoRa Lib. И: Как сказал Юрай: зачем вы пишете в CS1 и CS2, если библиотеки SD и LoRa контролируют это?, @Peter Paul Kiefer

@PeterPaulKiefer, вывод CS. это наиболее распространенное использование вывода SS в ведущем режиме. В качестве контакта CS для первого устройства SPI, @Juraj

OP использует два контакта CS: один для LoRa (10) и один для SD (8). Оба настроены на вывод, это верно. Но в документе SD lib есть примечание о том, что даже если изменить вывод CS/SS, необходимо установить вывод 10 для вывода. Для меня это намек на то, что пин 10 все равно влияет на SD lib, даже если он не используется. Я не знаю, какое влияние это оказывает (подумайте о том, что Lora устанавливает контакт 10 CS на вход до тех пор, пока он ему не понадобится; по какой причине вообще). Так что **может** быть влияние библиотеки LoRa на SD Lib. Это просто идея., @Peter Paul Kiefer

@PeterPaulKiefer «Влияние» заключается в оборудовании. Регистр направления для контакта 10 определяет, работает ли периферийное устройство SPI в режиме Master или Slave (INPUT = slave, OUTPUT = master). Если вы измените контакт 10 на INPUT, SPI просто не будет работать., @Majenko

@Majenko Извините, но я никогда не говорил, что хочу изменить его на INPUT. Я сказал, что контакт 10 по-прежнему влияет на библиотеку SD. Поскольку вы дали подсказку, которую я упускаю, я все еще мог представить ситуации, когда библиотека LoRa оказывает влияние, которое приводит к сбою библиотеки SD. Например, библиотека LoRa действует как ведомое устройство и поэтому устанавливает контакт 10 в качестве входа. Поскольку я не знаю, действует ли LoRa lib таким образом. это просто предположение. Но это также может быть неуместный кабель или что-то еще. user60840: Если вы добавите изображение своей установки и предоставите ссылки на библиотеки, которые вы использовали, мы могли бы проверить и это., @Peter Paul Kiefer


1 ответ


2

Не следует вручную управлять выводом CS SD-карты. Таким образом вы путаете библиотеку и SD-карту.

С SD-картами в режиме "SPI" существует специальная операция, которая не является частью стандарта SPI и является частью процедуры инициализации, при которой мастер (Arduino) должен отправить на карту не менее 72 тактовых импульсов с выводом CS в ВЫСОКОМ положении.

Установив вручную на выводе CS НИЗКИЙ уровень, вы нарушаете его.

От вас не требуется ничего делать для вывода CS, кроме как сообщить библиотеке, что это такое — библиотека сделает все остальное за вас. Поэтому удалите все ссылки на digitalWrite(CS1, ...) из своего кода.

,