Forum: Mikrocontroller und Digitale Elektronik ESP32 CAN funktioniert nicht mit 500Kb/s


von Max B. (max_power123)


Lesenswert?

Hallo,

ich verwende einen ESP32 mit einem SN65HVD230 CAN-Transceiver und den 
ESP32 standard Funktionen für CAN (keine Bibliothek). Das funktioniert 
gut auf 125Kb/s, aber nicht mit höheren Bitraten.
Die Ziel-Bitrate ist 500Kb/s, aber dabei bekomme ich einen 
ESP_ERR_INVALID_STATE Fehler.
Ich habe es schon ohne Verbindung zu einem CAN Bus getestet, mit einem 
Abschlusswiderstand und an den Bus angeschlossen, jedes Mal das gleiche 
Ergebnis.
Leider habe ich nur ein analoges Oszilloskop und einen Logicanalyzer für 
die Fehlersuche, falls das ein Hardware Problemen ist.
Irgendwelche Ideen, was der Fehler sein könnte?
1
#include "driver/gpio.h"
2
#include "driver/can.h"
3
4
can_message_t message;
5
6
void setup() {
7
  Serial.begin(115200);
8
9
  can_general_config_t g_config = CAN_GENERAL_CONFIG_DEFAULT(GPIO_NUM_4, GPIO_NUM_5, CAN_MODE_NO_ACK);
10
  can_timing_config_t t_config = CAN_TIMING_CONFIG_500KBITS();
11
  can_filter_config_t f_config = CAN_FILTER_CONFIG_ACCEPT_ALL();
12
13
  can_driver_install(&g_config, &t_config, &f_config);
14
  can_start();
15
16
  message.identifier = 0x23;
17
  message.flags = CAN_MSG_FLAG_EXTD;
18
  message.data_length_code = 1;
19
  message.data[0] = 0x04;
20
}
21
22
void loop() {
23
  esp_err_t error = can_transmit(&message, pdMS_TO_TICKS(4300));
24
  if (error != ESP_OK) Serial.println(esp_err_to_name(error));
25
  delay(500);
26
}

von Wolfgang (Gast)


Lesenswert?

Max B. schrieb:
> Leider habe ich nur ein analoges Oszilloskop und einen Logicanalyzer für
> die Fehlersuche, falls das ein Hardware Problemen ist.
> Irgendwelche Ideen, was der Fehler sein könnte?

Das wird an unsauberen Signalen, falschem Timing oder einem Fehler in 
der Software liegen.

Also solltest du erstmal mit dem Oszi gucken, wie die Signale aussehen, 
dann mit dem LA gucken, ob der den Datenverkehr sauber mitbekommt und 
alles aussieht, wie erwartet und falls nicht, gucken was falsch ist.

von Max B. (max_power123)


Angehängte Dateien:

Lesenswert?

Ich bin davon ausgegangen, dass man mit dem analog oszi nichts sieht, 
aber geht, wenn das Signal periodisch gesendet wird.

Bei 125Kb/s sieht alles gut aus. Des ESP sendet ein sinnvolles Signal an 
den Transceiver und das Signal auf dem CAN Bus sieht auch gut aus.

Bei 250Kb/s mach das Signal vom ESP keinen Sinn, deshalb passt auch der 
Bus nicht. Die Flanken haben irgendwie vor dem Umschalten noch ne kleine 
Stufe sollte aber eigentlich kein Problem sein.

Bei 500Kb/s sendet der ESP nichts mehr und auf dem Bus kommt auch nichts 
an.

Das Problem scheint also am ESP zu liegen und nicht am Transceiver.
Ich werde mal probieren das Ganze in Platform.io oder dem ESP-SDK zu 
programmieren, vielleich mach die Arduino IDE was falsch.

von Wolfgang (Gast)


Lesenswert?

Max B. schrieb:
> Das Problem scheint also am ESP zu liegen und nicht am Transceiver.

Genau, die Signalpegel sehen vernünftig aus (die kleine Stufe spielt 
keine Rolle). Du kannst also mit dem Logikanalysator weiterarbeite, um 
die komplexere Zeitabläufe zu prüfen.

von Falk B. (falk)


Lesenswert?

Max B. schrieb:
> Bei 250Kb/s mach das Signal vom ESP keinen Sinn, deshalb passt auch der
> Bus nicht. Die Flanken haben irgendwie vor dem Umschalten noch ne kleine
> Stufe sollte aber eigentlich kein Problem sein.

Klingt nach falschen Einstellungen für das Bittiming. Da muss man mal 
schauen, das ist auch ein wenig aufwämndiger, als ein einfacher UART.

von Jens R. (tmaniac)


Lesenswert?

Darf man fragen welche CAN Bibliothek du nutzt? CAN ist ja kein Ardunio 
Standard.

Ich würde nämlich auch auf ein Bittiming tippen.
Bei nem STM32 muss man auch auf die Busclock achten welche den CAN 
Controller versorgt. Wie ist das beim ESP gelöst?

von Max B. (max_power123)


Lesenswert?

Ich verwende die Bibliothek, die vom Hersteller bereitgestellt wird.
Die Bit Timings werden dabei über Makros definiert. Wäre bestimmt einen 
Versuch wert die Timings manuell zu konfigurieren.

https://docs.espressif.com/projects/esp-idf/en/release-v3.3/api-reference/peripherals/can.html

von Mickey L. (drmickeylauer)


Lesenswert?

Wahrscheinlich hast Du Dein Problem schon längst gelöst, aber falls 
nicht: `ESP_ERR_INVALID_STATE` hat nichts mit dem Bus-Status zu tun, 
sondern der (internen) TWAI-State-Machine. Dein gezeigter Code zeigt 
kein `twai_start()` -- das würde den Fehler erklären.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.