SD Karte SPI kommunikation

Hallo,

Ich habe mir ein Leistungsmessgerät gebaut. Benutze zum Messen das IC ADE9153A und lese die Daten über SPI mithilfe meines Arduino Nanos aus.

Jetzt möchte ich die Möglichkeit haben, die gemessenen Daten auf einer SD Karte zu speichern. (Über SPI)

Problem: Wenn ich nur das IC im System habe funktioniert es gut. Stecke ich allerdings den SD Karten Adapter auf seinen Steckplatz, kann das IC nicht mehr mit dem Arduino Nano ESP32 kommunizieren.

Miso, Mosi und CLK liegen auf der gleichen Leitung und für das IC ist CS_PIN 10 und für das SD Modul SD_CS_PIN 9.

Sobald das Programm in die Funktion IC_Init geht wird auf die Kommunikation gewartet... Vergeblich.

Ich habe schon viel rumprobiert, bin allerdings noch auf keine Lösung gekommen.

Vielleicht kann mir jemand hier aus dem Forum eine Unterstützung liefern.


#include <SPI.h>
#include <SD.h>
#include <ADE9153A.h>
#include <ADE9153AAPI.h>

// Pinbelegung für den ESP32 und die SD-Karte
#define SD_CS_PIN 9 // Chip Select-Pin für die SD-Karte (ändere dies entsprechend deiner Verkabelung)
#define SPI_SPEED 1000000
#define RESET_PIN 19
#define IRQ_PIN 18
#define CS_PIN 10  

ADE9153AClass ade9153A;
File dataFile;

void SD_init(void);
void IC_reset(void);
void IC_Init(void);

void setup() {
  pinMode(RESET_PIN, OUTPUT);   //RESET PIN als OUTPUT
  digitalWrite(RESET_PIN, LOW);
  pinMode(IRQ_PIN, INPUT);           //IRQ Pin als Input
  pinMode(SD_CS_PIN, OUTPUT);
  digitalWrite(SD_CS_PIN, HIGH);
  digitalWrite(CS_PIN, HIGH);

  Serial.begin(9600);
  delay(1000);
  SD_init();
  Serial.println("SD Initialisiert!");
  delay(2000);
  IC_reset();
  Serial.println("Reset Fertig!");
  delay(2000);
  IC_Init();
  Serial.println("IC READY!");
  delay(2000);

}

void loop() {
  /*
  delay(5000); // Warte 5 Sekunden

  // Öffnen der Datei im Lesemodus
  dataFile = SD.open("/a.txt");
  if (dataFile) {
    Serial.println("Datei geöffnet:");
    
    // Lesen und Anzeigen der Inhalte der Datei
    while (dataFile.available()) {
      Serial.write(dataFile.read());
    }

    // Schließen der Datei
    dataFile.close();
  } else {
    Serial.println("Fehler beim Öffnen der Datei!");
  }
  */
}

void SD_init(){
  // Initialisierung der SD-Karte
  if (!SD.begin(SD_CS_PIN)) {
    Serial.println("Fehler beim Initialisieren der SD-Karte!");
    return;
  }

    Serial.println("SD-Karte initialisiert.");
  delay(1000);
  // Öffnen der Datei
  dataFile = SD.open("/a.txt", FILE_WRITE);
  if (!dataFile) {
    Serial.println("Fehler beim Öffnen der Datei!");
    return;
  }
  delay(1000);
  if (dataFile.println("Bitte helfen sie mir! Ich bin in Gefahr!")) {
  Serial.println("Text erfolgreich in die Datei geschrieben.");
  } else {
    Serial.println("Fehler beim Schreiben in die Datei!");
  }
  // Schließen der Datei
  dataFile.close();
  delay(500);
}

void IC_reset(){
  //Durchführen Reset
  digitalWrite(RESET_PIN, LOW);
  delay(1000);

  digitalWrite(RESET_PIN, HIGH);
  delay(500);
  Serial.println("Reset durchgeführt!");
  //Prüfen des Interrupt Pins
  int IRQ = digitalRead(IRQ_PIN);
  Serial.print("Der IRQ Pin ist: ");
  Serial.println(IRQ);
}

void IC_Init() {
  delay(1000);
  bool kommunikation = ade9153A.SPI_Init(SPI_SPEED,CS_PIN);
  if(!kommunikation) {
    Serial.println("Es kann keine Kommunikation hergestellt werden!");
    Serial.print("Der IRQ Pin ist: ");
    Serial.println(digitalRead(IRQ_PIN));
    while(!kommunikation){
      Serial.println("Warte auf Kommunikation!");
      delay(10000);
    }
  } else {
    Serial.println("Verbindung Aufgebaut!");
    Serial.print("Informationen zum ADE9153A: ");
    Serial.println(String(ade9153A.SPI_Read_32(REG_VERSION_PRODUCT), HEX)); // Version des ICs
  }
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Nur die SD funktioniert?

Das Thema war doch schon einmal von dir, und es gab keine Antwort ob funktioniert die SD oder nicht.
Normalerweise testet man ALE Komponenten bevor man Platinen erstellt.

Noch zwei Fragen welschen Pegel gibt der komischer NANO ESP32 auf den Pins aus, wen 5V dann arbeitest ungewollt mit zwei Level Shifter ESP32 3,3V auf 5V auf die Pins. SD Modul 5V am Eingang zu 3,3V für die SD karte, normaler weise sollte das aber funktionieren.
Noch was der ESP bringt eigene SD Lib im Core, wenn du jedoch "Normale " SD Lib nutzt erstmals die verschieben aus dem Lib Ordner, dadurch wird die ESP32 SD Lib genutzt.
Antworten sollte man schon.
Habe mir Schemtic vom deinem Nano angesehen der ist ein 3,3V System wen es geht um Pin Pegel, Also zwei Möglichkeiten dass das nicht funktioniert:

  1. Zu niedrige Spannung an Pins für das SD Modul.
  2. Falsche SD Lib.
    https://docs.arduino.cc/resources/schematics/ABX00083-schematics.pdf

PS: Aufpassen was man klemmt auf den Nano der ESP32 verträgt nur ganz kurz 5V auf den GPIO's er ist nicht 5V Kompatibel, auch wen so mansche Schlaumeier im Internet was Anderes behaupten.

Also die gesamte Messchaltung funktioniert und liefert tolle Ergebnisse.

Einzel angesteuert funktioniert das SD Karten Modul auch mit der SD.h lib.

Nur die Zusammenführung auf meinem Board funktioniert nicht.

Für das SD Modul habe ich über ein DCDC 5V bereitgestellt.

Der CS PIN (SD Modul) ist HIGH wärend der des ICs LOW ist. Trotzdem erhalte ich keine Daten mehr vom IC.

Ich stelle ja oben im Programm mein SPI Speed ein. Dies wird allerdings nur vom IC verarbeitet. Kann es sein das mir das Probleme bei der kommunikation macht?
Das IC arbeitet auch im SPI Mode 2. Aber habe keine Möglichkeit gefunden das meinem SD Modul mitzuteilen.

Das wäre wichtig zu wissen. Die Beschreibung des Fehlers schildert das nämlich nicht.

Gibt es einen Schaltplan worauf man den ADE9153A, den ESP32 und das SD-Modul sieht?
Welches SD-Modul ist das?

Gruß, Jürgen

Wo zu der ADE tuts = ist 3.3V kompatibel, und funktioniert. Das SD Modul ist ein 5V mit Level Shifter zu sehen, im dem Anderen Thread ist der auch gezeigt.

Genau das IC arbeitet mir 3V3 und das SD Modul mit 5V. Funktionieren beide auch Separat verwendet.

Das wird eine Programmier Geschichte sein. Da der Anschluss von SPI Slaves nicht sonderlich komplex ist. Hier Schaltplan (Etwas unübersichtlich - Sorry - Links das IC - Rechts die Steckplätze für mein Arduino (SPI Ports beschriftet) - ganz Rechts mein Steckplatz für das SD Modul)

Wie ist die Frage mit SD Funktioniert gemeint?

Arduino + SD Modul = Funktioniert Einwandfrei
Arduino + Messaufbau = Funktioniert Einwandfrei
Arduino + Messaufbau + SD Modul = Keine Kommunikation mehr zum IC.

LG

Hatten wir nicht letztens schon mal ein SD-Modul, dass die MISO Leitung nicht frei gibt (hochohmig schaltet)?

Gruß Tommy

Laut schaltplan ist auf 13 was ist D10 oder GPIO 17

Vom Modul selber? Kann man das Problem beheben? Kann man das Messen? Oszi etc. stehen zur Verfügung.

Lg

CS1 (IC) auf D10
CS2 (SD) auf D9

Beim Schaltplan habe ich einfach eine Sockelleiste hergenommen. (Ich weiß geht besser) Daher stimmen die Nummern dort nicht.

Ok Verstanden :wink:

Wurde damals für das andere Gäret SW SPI genutzt?, war schon öfters hier.

Nur bringt nix, alles ist fest verbunden .

Ich schaue mir morgen mit einem Datenlogger die Vorgänge genauer an. Vielleicht kann ich so herausfinden was falsch läuft.

Also nur HW SPI.

Wisst ihr welchen SPI Mode die SD.h benutzt und welchen SPI Speed?

Ohne Ansteuerung mal die Spannung auf MISO gegen GND messen wenn das SD-Modul nicht gesteckt ist und wenn es gesteckt ist.

Gruß Tommy

Also Ohne SD Modul ist auf MISO 3V3.

Wird das SD Modul eingesteckt ist die MISO leitung auf 0,4V ??? :open_mouth:

gemessen mit Multimeter...

Verstehe nicht.. Wie kann das sein?