SPI Sendet keine Daten

Hallo liebe Gemeinde,
ich sitze mal wider vor einem komischen Problem.
Ich möchte ganz einfach über SPI eine Dezimalzahl verschicken. Das ging in den alten Versionen meines Programmes auch.
Jetzt kam viel dazu und es geht nicht mehr. Da ich jetzt schon mehr als einen Tag dran hocke und nicht einmal einen Anhaltspunkt habe, möchte ich mal in die Gemeinschaft fragen.
Das komische an der Sache ist auch, das ich noch eine SD Karte über SPI an dem System Hängen habe und dieses wunderbar funktioniert.
Hänge ich aber an den SPI Bus den anderen Microcontroller dem eben eine Dezimalzahl geschickt werden soll, stürzt auch die SD karte ab.
Habe ich nichts dran hängen, also nur SD und Oszi sehe ich das zwar der SS Pin für die Auswahl des anderen Microcontrollers auf LOW gezogen wird aber es werden keine Daten versendet.
Davor wird aber auf die SD Karte geschrieben, dass wiederum sieht okay aus und funktioniert auch.

Ich hoffe Ihr habt eine Idee… der folgende Code ist ein Unterprogramm welches aufgerufen wird.

int SPI_openValve(int valve_device_number,int valvenumber)
{

  if (valve_device_number == 1) 
  {
    slaveSelectPin = 22;
  }
  if (valve_device_number == 2)
  {
    slaveSelectPin = 24;
  }
  if (valve_device_number == 3) 
  {
    slaveSelectPin = 26;
  }
  if (valve_device_number == 4) 
  {
    slaveSelectPin = 28;
  }
  if (valve_device_number == 5) 
  {
    slaveSelectPin = 30;
  }
  
  
// take the SS pin low to select the chip:
  digitalWrite(slaveSelectPin,LOW);
  delay(5);
  //  send in the address and value via SPI:
  SPI.transfer(valvenumber);
  SPI.transfer(valvenumber);
  //SPI.transfer(openvalve);
  // take the SS pin high to de-select the chip:
  digitalWrite(slaveSelectPin,HIGH); 
 
}

SPI und Wire sind included und SPI.begin() aktiviere ich im Setup

beste Grüße

Sind die Kabel zu lang? Was mißt Du genau mit dem Oszi? Hast Du den 2. Microcontroller falsch programmiert sodaß er den Bus kurzschließt? Hast Du den anderen Microcontroller falsch angeschlossen? Funktioniert ein Minimalbeispielprogramm wo Du nur 1 Byte an den anderen Microcontroller schickst und sonst nichts anderes am Bus hängen hast? Grüße Uwe

Hallo Uwefed,

Was mißt Du genau mit dem Oszi?

Ja :smiley:

Microcontroller falsch programmiert sodaß er den Bus kurzschließt?

Nein, ich denke nicht… Da die alte version (Steuerbox 1) an dem Microcontroller funzt :disappointed_relieved:

Funktioniert ein Minimalbeispielprogramm wo Du nur 1 Byte an den anderen Microcontroller schickst und sonst nichts anderes am Bus hängen hast?

Ich habe die SD Karte schon im Code entnommen bringt auch nichts und die geht ja.
Ansonsten hängt nichts am Bus.
Ich schicke ja jetzt schon eigentlich nur eine Zahl von 1-8 geht es noch Minimaler :smiley: es kommt ja gar nichts, also reagiert Null

Habe jetzt noch ein Oszi Bild (Anhang) von dem Funktionierenden Teil gemacht was mich auch sehr durcheinander bring. Da die Signale gar nicht schön aussehen bzw. der SS Pin nicht richtig auf Masse gezogen wird.
Ich habe an den Tastköpfen kleine Kabel dran die ich dann aufs Board gesteckt habe, diese verfälschen zwar auch, aber wirklich so krass? ich kann es mir nicht vorstellen!

Viele Grüße

alt1____.png

Wie sollen wir den Fehler finden wenn Du und ein Oszi-Bild gibst das bei einer funktionierenden Schaltung aufgenommen wurde?

Sind die Kabel zu lang? Was mißt Du genau mit dem Oszi?

Bitte Bild vom nichtfunktionierenden SPI Übertragung und Foto vom Aufbau.

Grüße Uwe

Hallo Uwe, du hast recht, aber was mich an dem Bild sehr wundert ist, dass die SS Leitung (Grün) nicht richtig auf Masse gezogen wird...?!?!

Grüße

ps. nicht funktionierende Schaltung kommt gleich.

Kleiner Nachtrag,
Bild von dem nicht funktionierenden SPI Bus.
Grün ist das SS Signal, davor kann man sehen wie er auf die SD Karte schreibt.

Grüße

neu1___.png

Eine kurze einfache frage, wenn ich zwei Arduino per SPI miteinander verbinden will, verbinde ich einfach die SS pin´s und den MOSI an MOSI damit ich von einem Arduino zum anderen was schicken kann oder?

MFG

Nein. MOSI (Master Out Slave In) oder SDO muß auf MISO (Master In Slave Out) bzw SDI und umgekehrt. Der eine muß Master sein und der andere Slave. Der SCK kommt vom Master.

Ich hatte mich nicht getraut das nachzufragten :astonished: :astonished: Grüße Uwe

ups... :blush: :blush: :blush: :blush:

Eine noch eine Frage, warum sendet der eine als Standard auf High und der andere auf LOW das kann ja auch nicht sein?!?!?! Und warum ging es dann mit MOSI an MOSI? ist das nicht logisch Master out Slave in?? finde Mosi zu Miso unlogisch.. :fearful: :blush:

Grüße

Du verbindest ja auch TX mit RX und nicht TX mit TX. ;) ;) ;)

http://arduino.cc/en/Reference/SPI http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus#Mode_Numbers

Korrektur: MOSI ist beim Master ein Ausgang beim Slave ein Eingang. Der Arduino ist als Master beschriftet darum muß gekreuzt werden.

Grüße Uwe

Hallo Masterboy,

verwendest Du zum schreiben auf die SD-Card die SD-Card-Library?

Falls ja, musst Du vor dem Zugriff auf den SPI-Bus die Registerinhalte retten und danach wieder herstellen, sonst geht das schief!

Es sind diese Variablen zu deklarieren:

byte saved_spcr = 0;
byte saved_spsr = 0;

und ein bei mir im Zusammenhang mit SD-Card funktionierendes Codefragment sieht dann so aus:

void SPI_Lesen()
{
// save the SPI registers
saved_spcr = SPCR;
saved_spsr = SPSR;  
SPI.begin();
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0);
SPI.setClockDivider(SPI_CLOCK_DIV4); 
//digitalWrite(Test_Select, LOW);
SPI_Senden(UA_Soll);
delay(200);
//digitalWrite(Test_Select, HIGH);
delay(200);
//digitalWrite(Test_Select_2, LOW);
//SPI_Empfangen();
delay(200);
//digitalWrite(Test_Select_2, HIGH);
SPI.setBitOrder(LSBFIRST);
//SPI.setClockDivider(SPI_CLOCK_DIV);
SPI.end();
// restore the SPI registers
SPCR = saved_spcr;
SPSR = saved_spsr;
}

Erst nach dem wiederherstellen der SPI-Register ist ein Zugriff auf die SD-Card wieder möglich! Die delays sind nur zu Testzwecken drin, damit man die an den /CS-Anschlüssen befindlichen LED's flackern sieht. Da ich kein Speicheroszilloskop besitze, muss ich mir halt anders helfen.

Grüße

Martin

Hallo @ All, danke für euere Antworten!

Korrektur: MOSI ist beim Master ein Ausgang beim Slave ein Eingang. Der Arduino ist als Master beschriftet darum muß gekreuzt werden.

Ich mache den Arduino aber zum Slave siehe Code:

  // have to send on master in, *slave out*
  pinMode(MISO, OUTPUT);
  
  // turn on SPI in slave mode
  SPCR |= _BV(SPE);

Ich muss zu alle dem sagen, ich mache dort weiter wo jemand aufgehört hat, sprich ich weiss auch nicht 100% was der sich bei den Sachen so gedacht hat :~

Grüße