Due zu Mega I2C problem

Hallo
Ich habe ja schon 2 Mega mit I2C verbunden und das läuft auch gut.
jetzt mit einem Touchscreen muss ich auf einen Due als Master umsteigen ,alleine schon wegen der geschwindigkeit.
Habe mir gedacht das der code der mit 2 Mega funktioniert auch bei einem Due geht.
Aber irgendwie sendet der nix !

Code vom Master: Due

#include <Wire.h>

char customKey;
char bestellung[KeyWord_Lenght];
byte data_count = 0;

void setup()
{
  Serial.begin(9600);
  Wire.begin(8);
}


void loop()
{
    customKey = 'A';
    bestellung[data_count] = customKey;
    data_count++;
    customKey = '1';
    bestellung[data_count] = customKey;
    data_count++;

    bestellung[data_count] = { };    // char bestellung mit angabe der länge und Terminierungszeichen
    Wire.beginTransmission(8);        // verbindung zum slave aufbauen
    Wire.write(bestellung);             // sendet den inhalt von bestellung an den slave
    Wire.endTransmission();            // Verbindung beenden
}

Code vom Slave: Mega

#include <Wire.h>

String drink = "";                                // variable drink auf 0 gesetzt

void setup()
{
  Serial.begin(9600);                           // Verbindung zum serial monitor
  Wire.onReceive(receiveEvent);           // Warte auf befehle vom master
  Wire.begin(8);                                 // Verbindung aufbauen adresse 8 = master
}

void receiveEvent(int howMany)
{
  while (Wire.available())
  {
    drink += char(Wire.read());
  }
    Serial.println(drink);
}

Wie gesagt Bei meinem ersten versuch mit Megas funktioniert das Prima.
Mit dem Due und einem Touchscreen geht es nicht.
Logic level Converter ist dazwischen !
Zum (usb) serial monitor gibt er alles richtig raus nur nicht SCA, SCL, da wird irgendwie nichts gesendet. Ich will nicht hoffen das Hardware defekt ist.

Hat jemand einen tip was da falsch läuft ?

Hast Du die richtigen I2C Pins beim DUE?

Grüße Uwe

Ich denke doch ! pin 20,21 habe ich benutzt

Serial.println(drink);

Das in einer ISR, geht schon mal gar nicht! Sobald der TX-Buffer voll ist, stürzt es in einen Deadlock

Ich will nicht hoffen das Hardware defekt ist.

An den LevelShifter gedacht?

OK dachte nur weil es bei den megas gut klappte könnte ich mir auch jetzt die sachen die übertragen werden anzeigen. Habe ich also in den loop verpflanzt. Dort sollte es gehen. Was meinst du mit levelshifter ein logic level converter habe ich dazwischen.

Das was mir aufgefallen ist ...wenn ich dem Due mit dem Bildschirm den strom weg nehme geht er nicht völlig aus sondern das display bleibt noch etwas an. Das sieht aus als ob der logi converter ihn mit etwas strom versorgt. Sollte das nicht vom converter getrennt gehalten werden ??

Ich habe gerade den beitrag von 2014 mit dem Wire bug gelesen. Sollte ich den ordner \hardware\arduino\sam\ eigentlich im Arduino IDE haben ? Dort ist nur der ordner avr. Ich benutze win 10 vielleicht liegt es daran.

Hat keiner einen Due um mal zu schauen ob es den ordner gibt ?

Topper_Harley: Hat keiner einen Due um mal zu schauen ob es den ordner gibt ?

Ich habe einen Due. Und weiß, dass ich den Due Kram, zumindest in der IDE 1.6.7 nachinstallieren musste.

Und dann landet auch ein sam Ordner auf der Platte...

Dort ist nur der ordner avr.

Unter Win gibt es 3 Orte, wo Hardwaredefinitionen abgelegt sein können. Die solltest du alle 3 mal untersuchen.

Also: 1. DUE installieren 2. Ordner mit den Betriebsystemfunktionen suchen.

Bei mir: C:\Users[UserName]\AppData\Local\Arduino15\packages\arduino\hardware\sam

Danke habs jetzt auch auf: C:\Users[UserName]\AppData\Local\Arduino15\packages\arduino\hardware\sam gefunden war ja versteckt. Ist anscheinend alles da. Alles was zu installieren war hatte ich drauf. Und die Due brüder rühren sich nicht. An SDA und SCL tut sich nichts. Ich versteh es nicht ! Habe jetzt 2 Due probiert.

Hattest du mal was programmiert das auf die I2C vom due zugriff ? Also irgend einen code der bei dir lief zum testen ? Den ich dann am mega serial monitor anzeigen lassen könnte ?

Hattest du mal was programmiert das auf die I2C vom due zugriff ? Also irgend einen code der bei dir lief zum testen ?

Ja!

https://github.com/CombiesGit/I2C_EEPROM/blob/master/examples/ArduinoDueWire1/ArduinoDueWire1.ino

Ich verzweifel es geht einfach nicht. Auf dem Due versuch ich es mit wire1 und den sda1,scl1 und am mega mit wire. und sda,scl aber es will nicht klappen. Habe einen zweiten level shifter versucht auch ohne erfolg. Auch zwei due verbinden geht nicht. Nur mit 2 mega klappt es. Die due machen mich wahnsinnig :-) Aber die mega sind für ein 7 zoll display einfach zu langsam. Oder geht es vielleicht nur mit den Due von saintsmart nicht richtig ?

Gerade getestet! Due Master Mega Slave

LevelShifter dazwischen

Kommunikation über I2C, kein Problem, tuts perfekt.

welchen levelshifter benutzt du ?
Mit oder ohne extra pullups ?
Hast du es auch mit meinem code mal probiert ob der geht ?

Da sind Pullups drauf. Weitere Pullups nutze ich nicht. Außer die, welche schon auf den Arduino Boards drauf sein mögen.

Ich nutze diesen LevelShifter: http://www.ebay.de/itm/301883482498 (waren aber billiger)

Bei Master und Slave

Wire.begin(8);

Funktioniert das?

Sicher das der LevelShifter richtig angeschlossen ist? Wenn das eine Board vom anderen mitversorgt wird, finde ich das schon ein wenig seltsam.

Wire.beginn( 8 ) muss beim master nicht rein aber schadet auch nicht. Was meinst du was man in seiner verzweiflung alles versucht :-))))

@ combie der shifter sieht im prinzip aus wie meine sollte also auch ohne pullups gehen.

Funktioniert das?

Interessante Frage!

Das habe ich noch nicht getestet. Denn da sehe ich keinen Sinn drin.

void setup()
{
  Serial.begin(9600);                           // Verbindung zum serial monitor
  Wire.onReceive(receiveEvent);           // Warte auf befehle vom master
  Wire.begin(8);                                 // Verbindung aufbauen adresse 8 = master
}

Wire.onReceive vor Wire.begin?

Nochmal wegen Wire.begin:
In der Reference steht das bei Angabe einer Adresse bei Wire.begin() das Boardsich als Slave anmeldet,
ohne Adresse als Master.

Nochmal wegen Wire.begin: In der Reference steht das bei Angabe einer Adresse bei Wire.begin() das Boardsich als Slave anmeldet, ohne Adresse als Master.

Naja.... Das ist so nicht ganz korrekt...

Wire.begin(18); Bewirkt, dass der der Arduino auf Adresse 18 antwortet, als Slave. Aber er darf trotzdem, wenn es denn nötig ist, Master spielen. Das kommt sich nicht ins Gehege.

Klarer: Der Master "braucht" keine Adresse im Wire.begin(), darf aber eine haben Wire.begin(19)

Doppelte Adressen sind auf dem Bus verboten.

Serial.begin(9600); // Verbindung zum serial monitor Wire.begin(8); // Verbindung aufbauen adresse 8 Wire.onReceive(receiveEvent); // Warte auf befehle vom master

Habe ich im slave mal umgestellt. Der master hat jetzt auch keine adresse() mehr drin.