Forum: Mikrocontroller und Digitale Elektronik ESP32 CAN controller


von Bert S. (kautschuck)


Lesenswert?

Hi,

Ich habe auf Espressif gelesen, dass der ESP32 einen integrierten CAN 
controller besitzt, jedoch scheint im Datenblatt des ESP32-WROOM nichts 
dazu zu stehen.

https://riot-os.org/api/group__cpu__esp32__esp__can.html#details

https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/can.html#overview

Jemand eine Idee, wie man da einen externen CAN tranceiver anschließt, 
damit man auch den integrierten Controller verwenden kann?

Grüsse Bert

von John Doe (Gast)


Lesenswert?

Bert S. schrieb:
> 
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/can.html#overview
>
> Jemand eine Idee, wie man da einen externen CAN tranceiver anschließt,
> damit man auch den integrierten Controller verwenden kann?


Steht doch alles auf der Seite, die Du verlinkt hast. Wieso die Frage?

von Bert S. (kautschuck)


Lesenswert?

John Doe schrieb:
> Steht doch alles auf der Seite, die Du verlinkt hast. Wieso die Frage?

Es steht schon, dass es mit RX und TX verbunden wird, doch braucht es 
Pins zu einem internen UART oder kann man da irgendwelche IOs nehmen, 
die dann über die GPIO Matrix eingestellt werden?

von Rudolph R. (rudolph)


Lesenswert?

Wenn Du Dir einen normalen High-Speed CAN-Transceiver wie den TJA1051T/3 
ansiehst stellst Du fest, dass der sowas wie CLKOUT überhaupt nicht 
kennt.
Und mit dem BUS-OFF Signal könnte man den "S" Pin bedienen, aber 
normalerweise ist das überflüssig und "S" liegt einfach auf GND.

Also CAN_TX and TXD vom Transceiver, CAN_RX an RXD vom Transceiver.

Und den TJA1051T/3 habe ich gewählt, weil der 3,3V I/O unterstützt mit 
einem Pin für die I/O Spannung (Pin 5, VIO).
Zusätzlich benötigt der Transceiver aber auch 5V für den CAN an Pin 3 
(VCC).

Aber Vorsicht, es gibt auch TJA1051T ohne Funktion von Pin 5.
Und TJA1051T/E mit "EN" auf Pin 5.

Möchte man den ESP32 über den CAN wecken bräuchte man zum Beispiel einen 
TJA1043.

von Bert S. (kautschuck)


Lesenswert?

Rudolph R. schrieb:
> Also CAN_TX and TXD vom Transceiver, CAN_RX an RXD vom Transceiver.

Das ist schon klar, CAN_TX und CAN_RX sind aber auf dem ESP32 nicht 
spezifiziert, das ist ja das Problem.

von John Doe (Gast)


Lesenswert?

Bert S. schrieb:
> John Doe schrieb:
>> Steht doch alles auf der Seite, die Du verlinkt hast. Wieso die Frage?
>
> Es steht schon, dass es mit RX und TX verbunden wird, doch braucht es
> Pins zu einem internen UART oder kann man da irgendwelche IOs nehmen,
> die dann über die GPIO Matrix eingestellt werden?


Steht doch da:
The CAN controller’s interface consists of 4 signal lines known as TX, 
RX, BUS-OFF, and CLKOUT. These four signal lines can be routed through 
the GPIO Matrix to GPIOs.

Verstehe die Frage jetzt nicht.

von Rudolph R. (rudolph)


Lesenswert?

Richtig, aber wenn Du dem Link von Espressif folgst siehst Du, dass die 
für das Beispiel GPIO21 und GPIO22 benutzt haben.
Also zumindest dieses Paar funktioniert wohl dafür.

Vor einer Woche habe ich hier die Frage gestellt, wohin man die Pins 
routen kann: Beitrag "ESP32 CAN Pins?"

Nur eine Antwort gab es darauf nicht.
Aber immerhin gibt es ein paar Beispiele die wohl funktionieren.

Eine Platine habe ich schon auf
CAN_RX = GPI35
CAN_TX = GPIO5
verdrahtet, also wie Olimex das gemacht hat.
Und das hat wohl funktioniert, zumindest gab es keine Beschwerden.

Meine neue Platine hat
CAN_RX = GPIO22
CAN_TX = GPIO21
wie eben bei Espressif, schauen wir mal, die beiden Pins hatte ich 
zufällig sowieso frei.

Woanders hatte ich GPIO4 für CAN_RX gesehen.
Möglicherweise kann man die auch fast überall hin legen.

Ein externer SPI-CAN-Controller ist vielleicht sogar besser.
So mit weniger Bugs und der Möglichkeit CAN-FD zu nutzen.
Dem gegenüber steht das CAN durch SPI zu drücken eher unlustig ist wenn 
man das auch direkt haben kann.

von John Doe (Gast)


Lesenswert?

Quellcode-Beispiel ist auch da:
1
    can_general_config_t g_config = CAN_GENERAL_CONFIG_DEFAULT(GPIO_NUM_21, GPIO_NUM_22, CAN_MODE_NORMAL);

Und unter
1
struct can_general_config_t

steht der Rest.

von Rudolph R. (rudolph)


Lesenswert?

John Doe schrieb:
> These four signal lines can be routed through
> the GPIO Matrix to GPIOs.

Und mit welchen Einschränkungen?
Das Problem ist doch nur, dass das nicht dokumentiert ist.
Und mit dem Code könnte man auch versuchen CANTX auf GPI34 / GPI35 zu 
legen.

von John Doe (Gast)


Lesenswert?

Rudolph R. schrieb:
> John Doe schrieb:
>> These four signal lines can be routed through
>> the GPIO Matrix to GPIOs.
>
> Und mit welchen Einschränkungen?
> Das Problem ist doch nur, dass das nicht dokumentiert ist.
> Und mit dem Code könnte man auch versuchen CANTX auf GPI34 / GPI35 zu
> legen.

Ja, wenn man meint, sich das Doku-Lesen sparen zu können.
Nach kurzem Blick ins Technical Reference Manual würde man Deine Kombi 
sicherlich nicht mehr nehmen.

Jaja, ich weiss, in Zeiten von CubeMX und Arduino ist Lesen verpönt, 
erst recht, wenn es vierstellig wird...

von Rudolph R. (rudolph)


Lesenswert?

John Doe schrieb:
> Ja, wenn man meint, sich das Doku-Lesen sparen zu können.
> Nach kurzem Blick ins Technical Reference Manual würde man Deine Kombi
> sicherlich nicht mehr nehmen.

Okay, auf welcher Seite des Technical Reference Manual für den ESP32 
finde ich denn CANRX und CANTX?

In der Tabelle 17 im Kapitel 4.9 "Peripheral Signal List" taucht CAN 
nicht als Funktion auf welche durch die GPIO Matrix geroutet werden 
kann.
In der Tabelle 18 im Kapitel 4.10 fehlt das ebenso.
Es gibt dort auch keine Kapitel "CAN Controller" und der entsprechende 
I/O Bereich ist als "reserved" markiert.

John Doe schrieb:
> Jaja, ich weiss, in Zeiten von CubeMX und Arduino ist Lesen verpönt,

Glashaus und so.

von John Doe (Gast)


Lesenswert?

Rudolph R. schrieb:
> John Doe schrieb:
>> Ja, wenn man meint, sich das Doku-Lesen sparen zu können.
>> Nach kurzem Blick ins Technical Reference Manual würde man Deine Kombi
>> sicherlich nicht mehr nehmen.
>
> Okay, auf welcher Seite des Technical Reference Manual für den ESP32
> finde ich denn CANRX und CANTX?
>
> In der Tabelle 17 im Kapitel 4.9 "Peripheral Signal List" taucht CAN
> nicht als Funktion auf welche durch die GPIO Matrix geroutet werden
> kann.
> In der Tabelle 18 im Kapitel 4.10 fehlt das ebenso.
> Es gibt dort auch keine Kapitel "CAN Controller" und der entsprechende
> I/O Bereich ist als "reserved" markiert.
>
> John Doe schrieb:
>> Jaja, ich weiss, in Zeiten von CubeMX und Arduino ist Lesen verpönt,
>
> Glashaus und so.

Genau.

Es steht:
 Note that the I/O GPIO pads are 0-19, 21-23, 25-27, 32-39, while the 
output GPIOs are 0-19, 21-23, 25-27,32-33. GPIO pads 34-39 are 
input-only.

Damit ist klar, welche Pins als RX und welche als TX genutzt werden 
können.

von Rudolph R. (rudolph)


Lesenswert?

John Doe schrieb:
> Damit ist klar, welche Pins als RX und welche als TX genutzt werden
> können.

Warum ist das klar, wo steht das man CAN RX und TX überall hin routen 
kann?

Input-only Pins kann man offensichtlich nicht als Ausgang verwenden, das 
ist aber auch schon alles was man daraus ableiten kann.
Und wenn ich das nicht wüsste hätte ich GPI34 und GPI35 nicht erwähnt.

von John Doe (Gast)


Lesenswert?

Ist es denn so schwer:

The CAN controller’s interface consists of 4 signal lines known as TX,
RX, BUS-OFF, and CLKOUT. These four signal lines can be routed through
the GPIO Matrix to GPIOs.

und

Note that the I/O GPIO pads are 0-19, 21-23, 25-27, 32-39, while the
output GPIOs are 0-19, 21-23, 25-27,32-33. GPIO pads 34-39 are
input-only.

Eine simple Und-Verknüpfung...

von Rudolph R. (rudolph)


Lesenswert?

John Doe schrieb:
> Ist es denn so schwer:

Sieht so aus, sonst hättest Du inzwischen mal die Frage verstanden und 
mit "weiss ich nicht" oder anders beantwortet.

von Martin Fischer (Gast)


Lesenswert?


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.