Zugriff SD Karte Arduino beenden

Hallo meine lieben Arduinoianer!

ich habe mir ein kleines sketch gebastelt das Daten von einer SD Karte seriell überträgt.

Das funktioniert einwandfrei!

nun habe ich eine SD Karte mit ESP32 drauf und WIFI verwendet

das funktioniert auch einwandfrei

image

nähere Infos hier:

will ich aber mit dem ESP32 auf die Daten zugreifen meckert der rum dass er keinen Zugriff auf die SD Karte hat. zieh ich die Verbindung zwischen SD-Karte und Arduino funktioniert es.

also ich nehme mal an dass der Arduino Nano die Speicherkarte dauerhaft in beschlag nimmt.

gibt es da vielleicht einen Befehl die SD Karte freizugeben?

ich habe den sketch schon so gestaltet, dass nur auf die SD Karte zugegriffen wird wenn der Pin2 HIGH geht... (zumindest glaube ich das programmiert zu haben)

steckt die Karte am Rechner am SD Cardreader geht es daten zu verändern,..

#include <HardwareSerial.h>
#include <HardwareSerial_private.h>
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;

void setup() {
  pinMode(2, INPUT);      // Senden Taster
}

void loop() {
  delay(100);
  if (digitalRead(2) == HIGH) {
    if (!SD.begin(chipSelect)) {
      Serial.begin(19200);
      Serial.println("Card failed, or not present");
      Serial.end();
      //return;
    }
    else {
      File dataFile = SD.open("data.txt");
      if (dataFile ) {                            //wenn das file gefunden wird
        Serial.begin(19200, SERIAL_7E1, 3, 5);    // Open serial communications and wait for port to open
        while (dataFile.available()) {            // ausführen bis Bedingung false wird
          Serial.write(dataFile.read());          // Daten senden
        }
        dataFile.close();
        Serial.end();
        delay(1000);
      }
      else {
        Serial.begin(19200);
        Serial.println("error opening data.txt");
        Serial.end();
        dataFile.close();
        delay(100);
      }
    }
  }
}

schönes Wochenende Männers!

Du versuchst nicht zufällig mit zwei Master den SPI zu bespielen?

1 Like

Zug 3012 nach Sewastobol fährt auf Gleis 3 ein, bitte zurück treten!

:steam_locomotive: :railway_car: :railway_car: :railway_car: :railway_car: **tschuuu tschuuuuu **

aber ja das könnte sein,.. hab die ganzen files von dem Programm des ESP32 durchgescrollt und auch irgendwas von BUS MASTER gelesen,.. ich geh nochmals scrollen!

ist dann in der library zu ändern oder laufe ich da jetzt in ein unangenehmes Problem?

// so BTW - eigentlich könnte ich den Serial Scheiß auch von dem ESP32 übernehmen lassen der auf der SD Karte drauf ist, brauche ja nicht viele I/Os - aber da läuft so viel kryptischer code auf dem Ding, bis ich das da reingepfuscht habe geht vermutlich garnichts mehr!

oha!

Zeile 94, ganz runter scrollen zweiter absatz v.u.

#include "network.h"
#include "serial.h"
#include "config.h"
#include "pins.h"
#include "ESP8266WiFi.h"
#include "ESPWebDAV.h"
#include "sdControl.h"

String IpAddress2String(const IPAddress& ipAddress)
{
  return String(ipAddress[0]) + String(".") +\
  String(ipAddress[1]) + String(".") +\
  String(ipAddress[2]) + String(".") +\
  String(ipAddress[3])  ;
}

bool Network::start() {
  wifiConnected = false;
  wifiConnecting = true;
  
  // Set hostname first
  WiFi.hostname(HOSTNAME);
  // Reduce startup surge current
  WiFi.setAutoConnect(false);
  WiFi.mode(WIFI_STA);
  WiFi.setPhyMode(WIFI_PHY_MODE_11N);
  WiFi.begin(config.ssid(), config.password());

  // Wait for connection
  unsigned int timeout = 0;
  while(WiFi.status() != WL_CONNECTED) {
    //blink();
    SERIAL_ECHO(".");
    timeout++;
    if(timeout++ > WIFI_CONNECT_TIMEOUT/100) {
      SERIAL_ECHOLN("");
      wifiConnecting = false;
      return false;
    }
    else
      delay(100);
  }

  SERIAL_ECHOLN("");
  SERIAL_ECHO("Connected to "); SERIAL_ECHOLN(config.ssid());
  SERIAL_ECHO("IP address: "); SERIAL_ECHOLN(WiFi.localIP());
  SERIAL_ECHO("RSSI: "); SERIAL_ECHOLN(WiFi.RSSI());
  SERIAL_ECHO("Mode: "); SERIAL_ECHOLN(WiFi.getPhyMode());
  SERIAL_ECHO("Asscess to SD at the Run prompt : \\\\"); SERIAL_ECHO(WiFi.localIP());SERIAL_ECHOLN("\\DavWWWRoot");

  wifiConnected = true;

  config.save();
  String sIp = IpAddress2String(WiFi.localIP());
  config.save_ip(sIp.c_str());

  SERIAL_ECHOLN("Going to start DAV server");
  if(startDAVServer() < 0) return false;
  wifiConnecting = false;

  return true;
}

int Network::startDAVServer() {
  if(!sdcontrol.canWeTakeBus()) {
    return -1;
  }
  sdcontrol.takeBusControl();
  
  // start the SD DAV server
  if(!dav.init(SD_CS, SPI_FULL_SPEED, SERVER_PORT))   {
    DBG_PRINT("ERROR: "); DBG_PRINTLN("Failed to initialize SD Card");
    // indicate error on LED
    //errorBlink();
    initFailed = true;
  }
  else {
    //blink();
  }
  
  sdcontrol.relinquishBusControl();
  DBG_PRINTLN("FYSETC WebDAV server started");
  return 0;
}

bool Network::isConnected() {
  return wifiConnected;
}

bool Network::isConnecting() {
  return wifiConnecting;
}

// a client is waiting and FS is ready and other SPI master is not using the bus HIEEEEEEERRRRRR 
bool Network::ready() {
  if(!isConnected()) return false;
  
  // do it only if there is a need to read FS
	if(!dav.isClientWaiting())	return false;
	
	if(initFailed) {
	  dav.rejectClient("Failed to initialize SD Card");
	  return false;
	}
	
	// has other master been using the bus in last few seconds
	if(!sdcontrol.canWeTakeBus()) {
		dav.rejectClient("Marlin is reading from SD card");
		return false;
	}

	return true;
}

void Network::handle() {
  if(network.ready()) {
	  sdcontrol.takeBusControl();
	  dav.handleClient();
	  sdcontrol.relinquishBusControl();
	}
}

Network network;

das scheint dann doch interessanter zu sein als die Fehlermeldung

#include <ESP8266WiFi.h>
#include "sdControl.h"
#include "pins.h"

volatile long SDControl::_spiBlockoutTime = 0;
bool SDControl::_weTookBus = false;

void SDControl::setup() {
  // ----- GPIO -------
	// Detect when other master uses SPI bus
	pinMode(CS_SENSE, INPUT);
	attachInterrupt(CS_SENSE, []() {
		if(!_weTookBus)
			_spiBlockoutTime = millis() + SPI_BLOCKOUT_PERIOD;
	}, FALLING);

	// wait for other master to assert SPI bus first
	delay(SPI_BLOCKOUT_PERIOD);
}

// ------------------------
void SDControl::takeBusControl()	{
// ------------------------
	_weTookBus = true;
	//LED_ON;
	pinMode(MISO_PIN, SPECIAL);	
	pinMode(MOSI_PIN, SPECIAL);	
	pinMode(SCLK_PIN, SPECIAL);	
	pinMode(SD_CS, OUTPUT);
}

// ------------------------
void SDControl::relinquishBusControl()	{
// ------------------------
	pinMode(MISO_PIN, INPUT);	
	pinMode(MOSI_PIN, INPUT);	
	pinMode(SCLK_PIN, INPUT);	
	pinMode(SD_CS, INPUT);
	//LED_OFF;
	_weTookBus = false;
}

bool SDControl::canWeTakeBus() {
	if(millis() < _spiBlockoutTime) {
    return false;
  }
  return true;
}

ich habe mal versucht

SPI.end() und SPI.endTransaction(); an ganz vielen stellen einzufügen,..

bringt nix :confused:

#include <HardwareSerial.h>
#include <HardwareSerial_private.h>
#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;

void setup() {
  pinMode(2, INPUT);      // Senden Taster
}

void loop() {
  delay(100);
  if (digitalRead(2) == HIGH) {
    SPI.begin();
    if (!SD.begin(chipSelect)) {
      Serial.begin(19200);
      Serial.println("Card failed, or not present");
      Serial.end();
      //return;
    }
    else {
      File dataFile = SD.open("data.txt");
      if (dataFile ) {                            //wenn das file gefunden wird
        Serial.begin(19200, SERIAL_7E1, 3, 5);    // Open serial communications and wait for port to open
        while (dataFile.available()) {            // ausführen bis Bedingung false wird
          Serial.write(dataFile.read());          // Daten senden
        }
        dataFile.close();
        SPI.endTransaction();
        Serial.end();
        delay(1000);
      }
      else {
        Serial.begin(19200);
        Serial.println("error opening data.txt");
        Serial.end();
        dataFile.close();
        SPI.end();
        SPI.endTransaction();
        delay(100);
      }
    }
  }
  SPI.end();
}

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.