ESP32 & MCP 2515 verursacht Rebooting

Hallo miteinander,
mein letzter Auftritt hier ist schon etwas her....der ein oder andere erinnert sich bestimmt an das Rennbahn-Projekt, war ja auch was über Monate bzw. Jahre dauerte. Aber wenn jemand meint ich wäre fertig.... :joy:

Aber nun zu meinem Problem:
Ich habe...
1 x ESP32 Wroom-32 (AZ-......) ich glaub der Name ist hier nicht gern gesehen.
1 x TCA9548A I2C IIC 8 Channel
3 x 0,96 Zoll 128 x 64 12864 Pixel OLED
1 x MCP2515 CAN Bus Shield

Der Sketch ist abgespeck, aber es sollte das wichtigste vorhanden sein.
Nun zum Problem, sobald ich die Lib für den MCP2515 aktiviere rebootet der EPS32 ständig.
Hier die Fehlermeldung:

Rebooting...
ets Jun 8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1412
load:0x40078000,len:13400
load:0x40080400,len:3640
entry 0x400805f0
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400d237f PS : 0x00060d30 A0 : 0x800d2a6c A1 : 0x3ffb27a0
A2 : 0x00000000 A3 : 0xffffffff A4 : 0xffffffff A5 : 0xffffffff
A6 : 0xffffffff A7 : 0x00000008 A8 : 0x800896fa A9 : 0x3ffb2780
A10 : 0x00000001 A11 : 0x0000164d A12 : 0x00001275 A13 : 0xb33fffff
A14 : 0x00000001 A15 : 0x00000001 SAR : 0x00000017 EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000004 LBEG : 0x400d31b4 LEND : 0x400d321a LCOUNT : 0x0000000b

Backtrace:0x400d237c:0x3ffb27a0 0x400d2a69:0x3ffb27c0 0x400d112f:0x3ffb27e0 0x400d542b:0x3ffb2820

Da ich Aufgrund Speicher und Möglichkeiten mit der u8g2-Lib, auf den mir noch unbekannten ESP32 gekommen bin hänge ich nun an diesem Problem.....
Ist die Lib nicht für ESP32 geeignet...? Ober habe ich das MCP2515 CAN Bus Shield falsch angeschlossen? Ich komme nicht dahinter. :sleepy:

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>
#include <SPI.h>
#include <mcp_can.h>       // https://github.com/coryjfowler/MCP_CAN_lib
#include <TimeLibB.h>      // auf deutsch umgeschriebene TimeLib von Paul Stoffregen

// CAN BUS
MCP_CAN CAN0(5);          
// MCP2515 - ESP32
// SCK - 18
// SI  - 23
// SO  - 19
// CS  - 5
// INT - nicht angeschlossen





// Multiplexer- ESP32
// SDA - 21
// SCL - 22
#define TCA9548A 0x70
void tcaselect(uint8_t i) {
  if (i > 7) return;
  Wire.beginTransmission(TCA9548A);
  Wire.write(1 << i);
  Wire.endTransmission();
}
// 
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE);   // All Boards without Reset of the Display

uint32_t TimeForAnzeige = 0;  
bool Chaos = true;

void setup()
{
  for (int i = 0; i <= 7; i++) {
    tcaselect(i);
    u8g2.begin();
  }
  Wire.begin();
  Serial.begin(115200);
  {
    tcaselect(7);  //multiplex the OLED on Channel 7  
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_4x6_mf);
    u8g2.setDrawColor(2);
    u8g2.drawStr(110, 5, "RTL");  // Spalte, Zeile
    u8g2.sendBuffer();
    delay(1000);
  }
  {
    tcaselect(1);  //multiplex the OLED on Channel 1  
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_samim_16_t_all);
    u8g2.drawStr(20, 50, "2"); // Spalte, Zeile
    u8g2.sendBuffer();
    delay(1000);
  }
  {
    tcaselect(2);  //multiplex the OLED on Channel 2  
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_samim_16_t_all);
    u8g2.drawStr(20, 50, "D U N L O P");  // Spalte, Zeile
    u8g2.sendBuffer();
    delay(1000);
  }

     

  //  CAN BUS
  while (CAN_OK != CAN0.begin(MCP_STDEXT, CAN_125KBPS, MCP_8MHZ))  // init can bus : masks and filters disabled, baudrate, Quarz vom MCP2551
  {
    Serial.println("CAN BUS Shield init fail");
    Serial.println(" Init CAN BUS Shield again");
    //delay(100);
  }
  Serial.println("CAN BUS Shield init ok!");   
  CAN0.setMode(MCP_NORMAL);   // Change to normal mode to allow messages to be transmitted

 

}

void loop()
{
  OledVorne();
}


void OledVorne()
{
   if (Chaos == true)
  {
                      // OledAusgabe(Text,Channel)
    OledAusgabe(1, 2);// Text (4=Bild Unfall,5=Text Unfall,6=Datum,7=Uhrzeit
    OledAusgabe(7, 7);// Channel (1=Oled-Rechts, 2=Oled-Vorne, 7=Oled-Links)
    OledAusgabe(8, 1);
  }
}

void OledAusgabe(byte Text, byte Channel)
{
  tcaselect(Channel);// An welcher Anzeige ausgegeben werden soll
  switch (Text)      // Was an dieser Anzeige ausgegeben werden soll
  {
    case 1: // Smiley
//      u8g2.clearBuffer();
//      u8g2.drawXBM(20, 5, SmileyBreite, SmileyHoehe, Smiley);
//      u8g2.sendBuffer();
      break;

    case 2: // Daumen Hoch
//      u8g2.clearBuffer();
//      u8g2.drawXBM(20, 1, DaumenBreite, DaumenHoehe, Daumen_Hoch);
//      u8g2.sendBuffer();
      break;

    case 3: // Werbung Dunlop
//      u8g2.clearBuffer();
//      u8g2.drawXBM(30, 1, DunlopBreite, DunlopHoehe, Dunlop);
//      u8g2.sendBuffer();
      break;
    case 4: // Bild Unfall
//      u8g2.clearBuffer();
//      u8g2.drawXBM(20, 0, AutoUnfallB, AutoUnfallH, AutoUnfall);
//      u8g2.sendBuffer();
      break;
    case 5: // Text Unfall
      if (millis() - TimeForAnzeige >= 2000)
      {
        u8g2.clearBuffer();
        u8g2.setFont(u8g2_font_samim_16_t_all);
        u8g2.drawStr(8, 40, " A C H T U N G  !");  // Spalte, Zeile
        u8g2.sendBuffer();
        TimeForAnzeige = millis();
      }
      else
      {
        if (millis() - TimeForAnzeige >= 1000) {
          u8g2.clearBuffer();
          u8g2.drawStr(8, 40, " U N F A L L  !");  // Spalte, Zeile
          //u8g2.drawXBM(20, 0, AutoUnfallB, AutoUnfallH, AutoUnfall);
          u8g2.sendBuffer();
        }
      }
      break;
    case 6: // Datum
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_samim_16_t_all);
      u8g2.setCursor(24, 20);
      if (day() < 10) {
        u8g2.print("0");
      }
      u8g2.print(day(), DEC);
      u8g2.print('.');
      if (month() < 10) {
        u8g2.print("0");
      }
      u8g2.print(month(), DEC);
      u8g2.print('.');
      u8g2.print(year(), DEC);
      //u8g2.drawStr(8, 40, minute());  // Spalte, Zeile
      u8g2.sendBuffer();
      break;

    case 7: // Uhrzeit
      u8g2.clearBuffer();
      u8g2.setFont(u8g2_font_samim_16_t_all);
      u8g2.setCursor(24, 30);
      if (hour() < 10) {
        u8g2.print("0");
      }
      u8g2.print(hour(), DEC);
      u8g2.print(':');
      if (minute() < 10) {
        u8g2.print("0");
      }
      u8g2.print(minute(), DEC);
      u8g2.print(':');
      if (second() < 10) {
        u8g2.print("0");
      }
      u8g2.print(second(), DEC);
      //u8g2.drawStr(8, 40, minute());  // Spalte, Zeile
      u8g2.sendBuffer();
      break;
    
    case 8: // an der Spitze   
    u8g2.clearBuffer();
    u8g2.setFont(u8g2_font_4x6_mf);    
    u8g2.drawStr(115, 8, "RTL");  // Spalte, Zeile
    u8g2.setFont(u8g2_font_9x15_mf);   
    u8g2.drawStr(10, 30, "an der Spitze");  // Spalte, Zeile
    u8g2.setFont(u8g2_font_helvB10_tf);   
    //u8g2.drawUTF8(10, 60, F);  // Spalte, Zeile  
    u8g2.drawUTF8(10, 60, "Fahrer[1]" );  // Spalte, Zeile  
    u8g2.sendBuffer();
    break;
  }
}

void leseCanBus()
{
  unsigned long rxId = 0;
  byte len = 0;
  byte rxBuf[8];
  char text[32] = {0};
  if (CAN_MSGAVAIL == CAN0.checkReceive())           // check if data coming
  {
    char msg[2][30];
    CAN0.readMsgBuf(&rxId, &len, rxBuf);            // Read data: len = data length, buf = data byte(s)
    byte teil = rxId & 0xF;
    byte num = (rxId & 0xF0) / 16;
    memcpy(msg[num] + teil * len, rxBuf, len);
    if (teil == 2) {
      snprintf(text, sizeof(text), msg[num]);
      //strcpy (text, msg[num]);
      Serial.println(text);
      //AuswertungEmpfang(text);
    }
  }
}

Habe eine Lib für ESP32 gefunden
GitHub - miwagner/ESP32-Arduino-CAN: An Arduino CAN-Bus library for ESP32

Nee, die ist für die CAN-Bus-Register im ESP32 ausgelegt, nicht für MCP2515!

Dein Programm wirft bei mir eine Vielzahl von Warnungen aus, die letztlich als Fehler behandelt werden. Puh!

Ok, haben mich ein wenig die Beispiele irritiert, habe noch nichts mit CAN Bus gemacht

Also nach ESP32 Rezeptur wurde nicht GPIO 5 als CS nutzen,
Hat PWM Signal bei Booten und ist als Straping Pin gezeichnet, vielleicht hilft dir das :wink:
Hier die PIN Liste für ESP32

GPIO Input Output Notes
0 pulled up OK outputs PWM signal at boot, must be LOW to enter flashing mode
1 TX pin OK debug output at boot
2 OK OK connected to on-board LED, must be left floating or LOW to enter flashing mode
3 OK RX pin HIGH at boot
4 OK OK
5 OK OK outputs PWM signal at boot, strapping pin
6 x x connected to the integrated SPI flash
7 x x connected to the integrated SPI flash
8 x x connected to the integrated SPI flash
9 x x connected to the integrated SPI flash
10 x x connected to the integrated SPI flash
11 x x connected to the integrated SPI flash
12 OK OK boot fails if pulled high, strapping pin
13 OK OK
14 OK OK outputs PWM signal at boot
15 OK OK outputs PWM signal at boot, strapping pin
16 OK OK
17 OK OK
18 OK OK
19 OK OK
21 OK OK
22 OK OK
23 OK OK
25 OK OK
26 OK OK
27 OK OK
32 OK OK
33 OK OK
34 OK input only
35 OK input only
36 OK input only
39 OK input only

Hallo Agmue,
nicht nur bei Dir, aber es funktioniert trotzdem wenn ich den CANBUS weglasse. Zu den Fehlern hätte ich später Ausschau im Web gehalten. Ist zwar nicht der Richtige Weg......aber als Laie hab ich die erst einmal ignoriert.

Fehler wie z.B.
WARNUNG: Bibliothek Wire behauptet auf esp32 Architektur(en) ausgeführt werden zu können und ist möglicherweise inkompatibel mit Ihrem derzeitigen Board, welches auf arduino-esp32-master Architektur(en) ausgeführt wird.Scheint wohl eine ungeeignete Lib zu sein....

Und..
: warning: ISO C++11 requires whitespace after the macro name
Keine Ahnung :woozy_face:

Hallo Fony,
nun ja der ESP32 ist für mich noch recht unverständlich, bin mehr die Nano's und Mega's gewohnt.
Wenn ich nun die Pin's so durchgehe, wäre alles ab 16 bis 33 okay, ich probiere mal.....

Normal hat ESP32 so wie ESP8266 eigene Wire im Core, und wird normal auch durch Compiler benutzt, mit der Warnung das es gibt mehrere Wire.h welsche Core Version nutzt du?
Seit längeren nutze nur ESP32 in 36 und 32 Pin Versionen.
Die SPI Pins Mosi, Miso, SCK sind bei dir OK = Standard Pins

Ich hoffe ich blamiere mich jetzt nicht so richtig......
Also Pin-Nr. geht bis 34 oder meinst Du alle Pin's das wären 38

Ich sehe schon die die Hände fliegen.... du Deep :joy: :joy:
Habt nachsicht in Sachen ESP32 mit mir.

Ach, CS = 16 funzt auch nicht

Versuch kostet ja nix :wink:

Das liegt bestimmt an mir und dem ESP, er war mir schon immer etwas unheimlich :wink:

Der ESP32 braucht eigentlich keinen MCP2515 ... der hat CAN schon eingebaut.
Brauchst nur einen Transmitter ala sn65hvd233

Hallo noiasca,
aber könnte er den noch einen?
Hab da noch ein paar rumliegen. Und hab gerade mal im Amazonas nachgeschaut, die Begeisterung von den sn65hvd233 hält sich da in Grenzen. Hingegen meine Erfahrungen mit dem 2515 sind mit Nano und Co ohne klagen.

Daher würde ich gern den 2515 nehmen...auch wenn's den gehen sollte mit dem ESP32

Frage was sollte als erste gestellt werden, mit welscher Spannung wird der MCP betrieben?

Sowas hatte ich auch mit einem SPI OLED display. Das Testprogramm für die Bibliothek hat genau diesen Fehler produziert, und zwar bereits bei der Initialsierung in setup(). Debug Ausgaben davor und dahinter, die dahinter kam nie durch.

Ich habe es letztlich aufgegeben, dieses display zu benutzen, weil ich einfach keine Bibliothek gefunden habe, die auf meinem Board läuft. Mein zweites I2C Display lief dann aber auf Anhieb :slight_smile:

In Deinem Fall könnte auch die eingebaute Hardware der Stolperstein sein und mit gleichen Namen des Boards oder des Systems zu Konflikten führen.

Noch nicht versucht: ein längeres Delay vor der Initialisierung der Bibliothek einbauen, um ggf. dem Chip mehr Zeit zum Hochkommen zu geben.

Mit 5 Volt, bin nach diesem Anschlussbild gegangen.
circuit

Also an den Pins kommt 5V raus was ist ungesund für ESP er darf und kann nur 3,3V, also umschalten auf 3,3V, ob der Chip kann das weis nicht musste Datenblatt suchen

Wire ist die Bibliothek für I2C, nicht für SPI.

Hat aber I2C OLED, steht alles im Post #1

Man muß da aufpassen mit der Versorgung des Boards (oft bis 5V) und den Logik-Spannung an den Signalleitungen, die kann dann oft nur 3,3V sein. Wobei 3,3V Logik perfekt zum ESP32 paßt.