Forum: Mikrocontroller und Digitale Elektronik CAN und MCP2515 - Kein Senden möglich


von Hermann G. (df2ds)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
nach einigen Tagen weiß ich nicht mehr weiter und bitte um Hilfe.

Ich habe folgendes CAN-Bus-Minimalsystem aufgebaut:

Node A (Sender): Arduino Nano und MCP2515-Modul.
Node B (Empfänger): ESP32 DevKitC und SN65HV230-Modul

Beide Seiten sind auf 125kHz initialisiert. Verbindung CANH, CANL und 
GND sind da. Ich habe diverse Bibliotheken ausprobiert, dann zur 
Eingrenzung des Problems nur Node A laufen lassen, an Stelle von Node B 
hängt ein weiteres MCP2515-Interface, welches nur mit Betriebsspannung 
versorgt wird.

Die Auswertung der Fehlercodes aus der Library 
(https://github.com/coryjfowler/MCP_CAN_lib) hat mir gezeigt, dass der 
MCP immer in einen TX-Timeout läuft (Fehlercode 7). Wenn ich nicht in 
"loop" initialisiere, ist irgandwann kein TX-Buffer mehr frei und der 
Fehlercode wechselt auf 6.

Das MCP-Interface ist dieses: 
https://42project.net/shop/module/kommunikationsmodule/spi-mcp2515-can-bus-modul-tja1050-transceiver-shield-5v-33v-fuer-arduino-und-pi/

Ich habe folgendes schon getestet/probiert:
* "nacktes" MCP2515-Modul statt Node B
* Spannungsversorgung über Labornetzteil statt über den USB
* CANH/CANL vertauscht
* verschiedene CAN-Bitraten ausprobiert
* SPI_Clock mit 16MHz statt 8MHz ausprobiert

Alles hat keinen Erfolg gebracht. Jetzt weiß ich nicht mehr weiter :-(

Besten Dank im Voraus für jeden konstruktiven Tipp!

Hermann

von Εrnst B. (ernst)


Lesenswert?

Kann deine CAN-Library den loopback-Modus aktivieren, für einen Test mit 
dem MCP2515 alleine?

von Hermann G. (df2ds)


Lesenswert?

Εrnst B. schrieb:
> Kann deine CAN-Library den loopback-Modus aktivieren, für einen Test mit
> dem MCP2515 alleine?

Ja, sorry, das hatte ich vergessen. Ich hatte mit mehreren Libs den 
Loopback-Modus probiert, der hat immer ohne Fehlermeldungen 
funktioniert.

von Florian L. (muut) Benutzerseite


Lesenswert?

Can Bus ist terminiert?

von Hermann G. (df2ds)


Lesenswert?

Florian L. schrieb:
> Can Bus ist terminiert?

Ja, auch das. Ich hatte es auch mal mit einseitiger Terminierung und 
ganz ohne versucht, macht keinen Unterschied.

Außerdem hatte ich auch die beiden CAN-Platinen mal getauscht, auch das 
hat zu keiner Änderung geführt.

Beitrag #7689613 wurde vom Autor gelöscht.
von Sebastian W. (wangnick)


Lesenswert?

Wenn der Sender von niemandem ein ACK bekommt, dann probiert er ewig 
weiter, den ersten Frame zu senden.

Den MCP2515 nur mit Spannung zu versorgen ist glaube ich nicht 
ausreichend, um ihn zum Senden von ACKs zu bringen. Da müsste ich aber 
noch einmal ins Datenblatt schauen.

Zur Diagnose solltest du den LA an den RXD-Ausgang von einem der 
Transceiver (TJA1050 oder SN65HV230) hängen.

LG, Sebastian

von Hermann G. (df2ds)


Lesenswert?

Sebastian W. schrieb:
> Zur Diagnose solltest du den LA an den RXD-Ausgang von einem der
> Transceiver (TJA1050 oder SN65HV230) hängen.

Danke für den Tipp, werde ich am frühen Abend machen. Muss jetzt erst 
andere Dinge erledigen...

von Christian (christiankpunkt)


Lesenswert?

Ein Bus mit nur einem CAN-Node funktioniert nicht.
Es brauch immer mindestens 2.

Wenn ein Node ein CAN-Frame raussendet und dieser nicht von einem 
anderen Node acknowledged (ACK) wird kommt es zu den von dir 
beschreibenden TX-Fehler.

Jeder andere CAN-Node acknowledged jedes Frame das er bekommt, auch wenn 
es nicht für sich bestimmt ist.

von Sebastian W. (wangnick)


Lesenswert?

Sebastian W. schrieb:
> Den MCP2515 nur mit Spannung zu versorgen ist glaube ich nicht
> ausreichend, um ihn zum Senden von ACKs zu bringen. Da müsste ich aber
> noch einmal ins Datenblatt schauen.

Nur Spannung anzulegen st nicht ausreichend. Nach dem Power-On ist der 
MCP2515 im Configuration Mode, und nur im Normal Mode verschickt er 
ACKs. Ist irgendwie auch klar, woher soll er auch die Bitrate kennen ...

LG, Sebastian

von Frank O. (frank_o)


Lesenswert?

Christian schrieb:
> Jeder andere CAN-Node acknowledged jedes Frame das er bekommt, auch wenn
> es nicht für sich bestimmt ist.

Man hätte auch ohne "Denglisch" schreiben können: Jeder CAN-Knoten 
bestätigt jedes Frame, dass er bekommt, auch wenn es nicht für ihn 
bestimmt ist.

SCNR

von Christian (christiankpunkt)


Lesenswert?

Ja tut mir leid,
natürlich muss der Nachrichten-Rahmen vom ersten 
Kontroller-Bereichs-Netzwerk-Konten von einem anderen Knoten bestätigt 
werden, damit der ursprüngliche Konten die erfolgreiche Versendung des 
Rahmens erkennt.

von Hermann G. (df2ds)


Lesenswert?

Hallo, danke für die Unterstützung. Ich habe meinen "Node A" jetzt 
nochmal als Empfänger aufgebaut (sozusagen Node Arx"), und es 
funktioniert.

Morgen muss ich dann mal sehen, was dem Node B (ESP32 mit SN65HV230) 
fehlt...

Nochmals danke und erstmal gute Nacht.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Hermann G. schrieb:
> Die Auswertung der Fehlercodes aus der Library
> (https://github.com/coryjfowler/MCP_CAN_lib) hat mir gezeigt, dass der
> MCP immer in einen TX-Timeout läuft (Fehlercode 7).

Die Beispiele arbeiten mit 500kbs
Du nutzt 125kbps

Aus der Lib:
1
#define TIMEOUTVALUE    2500                                           /* In Microseconds, May need changed depending on application and baud rate */

alles ohne Gewähr

von Alexander (alecxs)


Angehängte Dateien:

Lesenswert?

Weiß jemand ob der Reset Pin floaten darf? Laut Datenblatt reicht ein 
Reset via SPI command, ich habe den Pin daher nicht beschaltet.

> The MCP2515 differentiates between two kinds of Resets:
> 1. Hardware Reset – Low on R̅E̅S̅E̅T̅ pin.
> 2. SPI Reset – Reset via SPI command.
>
> Both of these Resets are functionally equivalent. It is important to
> provide one of these two Resets after power-up to ensure that the logic
> and registers are in their default state. A hardware Reset can be
> achieved automatically by placing an RC on the R̅E̅S̅E̅T̅ pin (see
> Figure 9-1). The values must be such that the device is held in Reset
> for a minimum of 2 μs after Vdd reaches the operating voltage, as
> indicated in the electrical specification (t RL).

Ich hab diesen Fork gefunden aber der scheint älter zu sein. Läuft der 
ESP32 mit der Lib von autowp bei Dir?

https://github.com/dedalqq/esp32-mcp2515

: Bearbeitet durch User
von Soul E. (soul_eye)


Lesenswert?

Alexander schrieb:
> Weiß jemand ob der Reset Pin floaten darf?

Da im Datenblatt nirgendwo von einem internen Pullup die Rede ist, würde 
ich nicht davon ausgehen dass einer vorhanden ist. Der Pin muss also im 
unbenutzten Fall dauerhaft auf High-Pegel gelegt werden.


Aber: Dein ursprünglicher Beitrag ist mehr als 6 Monate alt.

von Thomas T. (runout)


Angehängte Dateien:

Lesenswert?

Hi, ich würde den /RESET-Pin nicht floaten lassen.

siehe Anhang.

Runout

von Alexander (alecxs)


Lesenswert?

Danke. Reicht da ein Klecks Lot oder muss es ein Widerstand sein?

edit: Hat sich erledigt, ich messe 10k also entweder ist das ein 
interner oder ich hatte schon einen drauf gelötet.

: Bearbeitet durch User
von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Kleiner Tip. Das Softwarereset dauert DEUTLICH länger als die 2us im 
Datenblatt! Da hab ich mal fast 2 Tage dran gesucht! Das Projekt vom 
Krativen Chaos lief vor über 10 Jahren mal problemlos in einem 
Testaufbau mit 16 MHz und 10us. Vor ein paar Monaten mit 10 MHz nicht 
mehr! Lösung. Das Delay für das Softwarereset auf 1ms hochsetzen und 
gut. Vermutlich reichen auch 100us, hab ich nicht getestet.
1
bool mcp2515_init(void) {
2
3
    uint8_t tmp;
4
5
    // init IOs
6
  SET(MCP2515_CS);
7
  SET_OUTPUT(MCP2515_CS);
8
  
9
  RESET(P_SCK);
10
  RESET(P_MOSI);
11
  RESET(P_MISO);
12
  
13
  SET_OUTPUT(P_SCK);
14
  SET_OUTPUT(P_MOSI);
15
  SET_INPUT(P_MISO);
16
  
17
  SET_INPUT(MCP2515_INT);
18
  SET(MCP2515_INT);           // internal pull up, why?
19
  
20
  // init SPI master interface, SPI prescaler /4
21
  SPCR = (1<<SPE) | (1<<MSTR);
22
  SPSR = 0;
23
  
24
  // reset MCP2515 by software reset
25
  // After this it is in configuration mode
26
  RESET(MCP2515_CS);
27
  spi_io(SPI_RESET);
28
  SET(MCP2515_CS);
29
  
30
  // wait a little bit until the MCP2515 has restarted
31
    // attention! internal reset time is MUCH longer than 2us minimum pulse width of data sheet!
32
  _delay_ms(1);
33
  
34
  // load CNF1..3 register
35
    tmp = ((CFG_SJW & 0x3)<<6) | (CFG_BRP & 0x3F);
36
  mcp2515_write_register(CNF1, tmp);
37
  mcp2515_write_register(CNF2, ((1<<BTLMODE) | ((CFG_PHSEG1 & 0x7)<<3) | (CFG_PRSEG & 0x7)) );
38
  mcp2515_write_register(CNF3, (CFG_PHSEG2 & 0x7));
39
40
  // activate interrupts
41
  mcp2515_write_register(CANINTE, (1<<RX1IE)|(1<<RX0IE));
42
43
  // test if we could read back the value => is the chip accessible?
44
  if (mcp2515_read_register(CNF1) != tmp ) {
45
    return false;
46
  }
47
  
48
  // deactivate the RXnBF Pins (High Impedance State)
49
  mcp2515_write_register(BFPCTRL, 0);
50
  
51
  // set TXnRTS as normal inputs
52
  mcp2515_write_register(TXRTSCTRL, 0);
53
  
54
  // turn off filters => receive any message
55
  mcp2515_write_register(RXB0CTRL, (1<<RXM1)|(1<<RXM0));
56
  mcp2515_write_register(RXB1CTRL, (1<<RXM1)|(1<<RXM0));
57
  
58
  // reset device to normal mode
59
  mcp2515_write_register(CANCTRL, 0);
60
  
61
  return true;
62
}

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Alexander schrieb:
> Weiß jemand ob der Reset Pin floaten darf? Laut Datenblatt reicht ein
> Reset via SPI command, ich habe den Pin daher nicht beschaltet.

Laut Datenblatt wird bei Low am Reset-Pin ein Reset ausgelöst. Bei einem 
unbeschalteten Pin hast du KEINERLEI Kontrolle über den Pegel. Es wäre 
nicht einmal garantiert, dass sich der Pegel im erlaubten Bereich 
entsprechend Tabelle 13-1 befindet (entweder zwischen VSS und 0.15*VDD 
ODER zwischen 0.85*VDD und VDD).

Nicht ohne Grund ist im Datenblatt in der Beispielkonfiguration für den 
Reset-Pin (Fig. 9-1) der Widerstand R als Pull-Up geschaltet.
https://ww1.microchip.com/downloads/en/DeviceDoc/MCP2515-Stand-Alone-CAN-Controller-with-SPI-20001801J.pdf

: Bearbeitet durch User
von Jörg (lixtop)


Lesenswert?

@Falk B
Aus welcher Biblothek stammt der Code?
Aus (https://github.com/coryjfowler/MCP_CAN_lib) ist er jedenfalls 
nicht.

von Falk B. (falk)


Angehängte Dateien:

Lesenswert?

Jörg schrieb:
> Aus welcher Biblothek stammt der Code?

Vom Kreativen Chaos.

http://www.kreatives-chaos.com/artikel/can-testboard

Hab ich geringfügig aufgeräumt und verbessert. Siehe Anhang.

von Alexander (alecxs)


Lesenswert?

An den MCP2515 Interrupt Pin gehört auch ein Pull-up, dann wird Falling 
Edge erkannt. Das delay(1) nach dem Reset hab ich ebenfalls eingefügt.

von Falk B. (falk)


Lesenswert?

Alexander schrieb:
> An den MCP2515 Interrupt Pin gehört auch ein Pull-up, dann wird Falling
> Edge erkannt.

Falsch! Der Pin ist ein Push-Pull Ausgang, KEIN Open Drain!

Ausgangsstufen Logik-ICs

> Das delay(1) nach dem Reset hab ich ebenfalls eingefügt.

Keine Ahnung was DIESE Funktion macht, aber es reicht ein _delay_ms(1), 
das ist 1ms.

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.