ESP32 CAN hängt ohne Transceiver

Ich verwende für den ESP32 die CAN Lib von Sandeep GitHub - sandeepmistry/arduino-CAN: An Arduino library for sending and receiving data using CAN bus.</titl.
Mit CAN-Tranceiver ist alles ok.

Wenn kein CAN-Tranceiver angeschlossen ist, hängt der ESP fest in einer While Schleife

ESP32SJA1000.cpp ca bei Zeile 226

  // wait for TX complete
  while ((readRegister(REG_SR) & 0x08) != 0x08) {
    if (readRegister(REG_ECC) == 0xd9) {
      modifyRegister(REG_CMR, 0x1f, 0x02); // error, abort
      return 0;   Serial.println(F("D224 endPacket"));
    }
    yield();   Serial.println(F("D226 endPacket"));
  }

hat jemand eine Idee, wie man hier einen Fehler zusätzlich abfangen könnte? Oder geht das nur mit einem "schmutzigen" Timeout/Zeitablauf?

Zum Code Entwickeln wäre es schon besser, wenn man auch ohne der gesamten Hardware arbeiten könnte.

Oder verwendet wer am ESP32 eine andere CAN-Lib? Wenn ja - welche?

 return 0;   Serial.println(F("D224 endPacket"));

Diese Debug Ausgabe wird dir nie gezeigt.
Denn das Return beendet die Funktion schon davor.

Hi

Wie willst Du Code für eine Hardware entwickeln, wenn der Fehlerfall 'Hardware not found' nicht abgefrühstückt wird?
Wenn ich den Snipped richtig verstehe, fragst Du ab, ob fertig eingelesen wurde.
OHNE die Hardware wird wohl 0!=8 in der While-Schleife stehen - blöd.
Entweder verpackst Du den Aufruf in eine weitere Funktion, Die Dir zur Entwicklungszeit Das zurück gibt, was Du gerade brauchst (ggf. per bedingter Compilierung aka #ifdef), oder benutzt Hardware und sorgst dafür, daß Diese Das bekommst, auf Was Du gerade prüfst.
Denke, das Erste ist hier leichter umzusetzen, da Du so nur EINEN Code hast, Der passen muß - Den, Den Du gerade bearbeitest.

MfG

postmaster: ich würde liebend gern erkennen, dass kein Tranceiver angeschlossen ist, nur fehlt mir der Ansatz.
Extra einen Debug mode will ich nicht machen, da arbeite ich lieber mit einem Timeout.

Bei fast jeder Arduino Lib für den MCP2515 gibt es schöne Errorcodes die man auswerten kann, nur diese ESP32 Lib bleibt einfach in einem while hängen. WTF.

Nur damit da kein Missverständnis aufkommt, ich habe auch entsprechende Hardware (konkret den sn65hvd230), nur sollte der Code nicht in den Wald laufen, nur weil der Bus nicht verfügbar ist.

PS: combie hast recht, hab im Eifer nur quasi jede Zeile mit einem print versehen, damit ich überhaupt sehe wie weit er kommt.

PS: combie hast recht, hab im Eifer nur quasi jede Zeile mit einem print versehen, damit ich überhaupt sehe wie weit er kommt.

Genau!
Das war mir schon fast klar....

Aber eben "sehen", tust du nichts davon.
Darum die "Annahme", oder die Wahrscheinlichkeit, dass es zu einer Fehldiagnose kommt.
Es also gar nicht da hängen bleibt, wo du glaubst.

Übrigens:
Der CAN Controler des ESP32 ist kompatibel zum SJA1000
Dort ist die Schnittstelle/Register recht gut beschrieben.

aaaaah, SJA10000. Danke ja, denn im Expressif steht auf gefühlten 130 Seiten exakt 2 mal CAN und keinerlei CAN register.

Nicht als Lösung sondern nur als Workaround, aber ich habe mir gedacht, ich schreibs trotzdem ins Form falls jemand drüber fällt:

  while ((readRegister(REG_SR) & 0x08) != 0x08) { // 0000‭1000‬ Transmission complete status. 0 = incomplete
    //Serial.print(F("D220 REG_SR:")); Serial.print(readRegister(REG_SR)); Serial.print(F("   REG_ECC:")); Serial.println(readRegister(REG_ECC));
    if (readRegister(REG_ECC) == 0xd9) {   // 217=‭11011001‬
      modifyRegister(REG_CMR, 0x1f, 0x02); // error, abort
      return 0;
    }
    if (readRegister(REG_SR) == 0x30) {   // e.g. if no transceiver is connected REG_SR=48 (‭0b00110000‬) ECC=0
      Serial.print(F("D225 abort ")); Serial.println(readRegister(REG_SR));
      modifyRegister(REG_CMR, 0x1f, 0x02); // error, abort
      return 0;
    }
    yield();
  }

OT: Hat noch jemand einen Tipp für einen CAN Transceiver in DIL und 3.3V? Die ganzen SMD Bauteile sind - auch wenns nur 8 Beine sind - ja nicht gerade anfängerfreundlich zu löten. Fast ein Wunder dass die bisher funktionieren ^^

ja nicht gerade anfängerfreundlich zu löten.

Ach, das geht (mit etwas Erfahrung und ein paar eingeübten Tricks) schon ganz gut...
Das Werkzeug sollte allerdings schon stimmig sein.

Evtl. ist dieses als Zwischenlösung hilfreich
Für Prototypen setze ich die gerne ein.

Hi

Auch solche Adapter-Platinen sind, zumindest mir, auch eher nicht wohlgesonnen :o.
Denke, 1/4tel davon löte ich wieder ab, da ich Brücken ‘gebaut’ habe, Die sich nicht wegsaugen lassen - laut INet soll’s gut mit Lotsauglitze gehen - da schmurgeln mir die Finger eher, als daß das Zeug das Lot aufgesaugt hat und ich saubere Beinchen vorfinde.
Bis kurz vor Schluß ist meist Alles ok, spätestens bei den letzten zwei Beinchen versaue ich die Sache.

Und Das ist noch die Rentner-Version von SMD … hätte hier noch kleineres Zeug … werde ich wohl vererben :frowning:
(teils als ‘Schnell-Klick’ oder ‘wird schon nicht sooo schlimm sein’ gekauft … )

MfG

noiasca:
OT: Hat noch jemand einen Tipp für einen CAN Transceiver in DIL und 3.3V?

Wenn es auch einer sein darf, der 3,3 V für die Logik und 5 V für den CAN-Ausgang braucht, dann gäbe es da z.B. den MCP2562.

Ardufe: der MCP2562 macht Sinn! Hast du den selbst in Einsatz? An welchem MC mit welcher VIO?

noiasca:
Ardufe: der MCP2562 macht Sinn! Hast du den selbst in Einsatz? An welchem MC mit welcher VIO?

In einem festen Aufbau im Dauerbetrieb habe ich sie nicht im Einsatz. Ich benutze sie gelegentlich auf Steckplatinen, wenn ich mit Due oder Teensy 3.6 etwas ausprobiere. In beiden Fällen mit 3,3 V VIO, die MCP2551 kann man ja bei den nicht 5V toleranten Boards nicht verwenden.

Hallo,

postmaster-ino:
Hi

Auch solche Adapter-Platinen sind, zumindest mir, auch eher nicht wohlgesonnen :o.
Denke, 1/4tel davon löte ich wieder ab, da ich Brücken 'gebaut' habe, Die sich nicht wegsaugen lassen - laut INet soll's gut mit Lotsauglitze gehen - da schmurgeln mir die Finger eher, als daß das Zeug das Lot aufgesaugt hat und ich saubere Beinchen vorfinde.
Bis kurz vor Schluß ist meist Alles ok, spätestens bei den letzten zwei Beinchen versaue ich die Sache.

bleifrei oder verbleit? Ich bin ja altmodisch und löte bleihaltig.
Meine Vermutung wäre, die Temperatur ist zu niedrig oder die Lötspitze führt nicht schnell genug Wärme nach.
Bei dem Pinabstand sind Brücken doch noch kein wirkliches Problem, einfach Pins verlöten, dann Zinn von der Lötspitze abwischen, großzügig Flußmittel (bei mir einfach Kolophonium) an die Spitze, Zinbrücke flüssig machen und nach außen wegziehen. Schräg halten mit der Lötkolbenspitze unten und das Zinn fließt ganz von alleine von den Pins zur Spitze.
Für Entlötlitze gilt auch vor allem genug Wärme.

Gruß aus Berlin
Michael