CAN-Kommunikation funktioniert nicht

Ich habe folgende Schaltung gemacht. STM32 sind STM32F103C8T6 (blaue Pillen). Ich habe die offensichtlichen Drähte weggelassen:

  • Alle vier Komponenten gemeinsam geerdet
  • Versorgt RX TJA 1050 mit 5 V von RX STM32
  • Versorgt TX TJA 1050 mit 5 V von TX STM32

schematisch

Simulieren Sie diese Schaltung – Mit CircuitLab erstellter Schaltplan

Die TJAs sind diese:

Geben Sie hier die Bildbeschreibung ein

Wichtigste Software, die auf TX STM32 läuft:

/* CAN init function */
static void MX_CAN_Init(void)
{

  static CanRxMsgTypeDef CanRX;
  static CanTxMsgTypeDef CanTX;
  CAN_FilterConfTypeDef sFilterConfig;

  hcan.Instance = CAN1;

  hcan.pRxMsg = &CanRX;
  hcan.pTxMsg = &CanTX;

  hcan.Init.Prescaler = 8;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_5TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }


  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x07ff;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x07ff;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
      Error_Handler();
  }
}

Im Wesentlichen:

..
hcan.pTxMsg->StdId = 0x100;
hcan.pTxMsg->ExtId = 0x01;
hcan.pTxMsg->IDE = CAN_RTR_DATA;
hcan.pTxMsg->IDE = CAN_ID_STD;
hcan.pTxMsg->DLC = 2;

while (1)
{
  hcan.pTxMsg->Data[0] = 0x10;
  hcan.pTxMsg->Data[1] = 0x1;

      HAL_CAN_Transmit(&hcan, 10)
  HAL_Delay(1000);
 }

Und auf TX STM32 der gleiche Code zum Initialisieren des CAN und im Wesentlichen der folgende Code:

if (HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
{
  Error_Handler();
}


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
{
if ((CanHandle->pRxMsg->StdId == 0x100) &&
    (CanHandle->pRxMsg->IDE   == CAN_ID_STD) &&
    (CanHandle->pRxMsg->DLC   == 2))
{
    printf("1");
}

Der Rückruf wird jedoch nie aufgerufen.

Was ich mit einem Logikanalysator sehe:

  • CANH (Kanal 2) und CANL (Kanal 0) erhalten Informationen
  • Kanal 4 ist mit RX STM32, CAN RX verbunden und empfängt nichts

Ich sehe Xs im Screenshot unten, bin mir nicht sicher, ob dies ein Problem ist.

Geben Sie hier die Bildbeschreibung ein

Was ich getan habe

  • TJAs ersetzt, kein Unterschied
  • Haltepunkte an verschiedenen Stellen setzen, alles scheint ok, außer dem Rückruf

Frage:

  • Was muss ich ändern, um Informationen bei RX STM32, CAN RX empfangen zu können?

Aktualisieren

Ich habe herausgefunden, dass es ein Übertragungsproblem gibt:

innerhalb

HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)

es kommt zu einem Timeout (letzte Zeile):

while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
{
  /* Check for the Timeout */
  if(Timeout != HAL_MAX_DELAY)
  {
    if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
    {
      hcan->State = HAL_CAN_STATE_TIMEOUT;

      /* Cancel transmission */
      __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);

      /* Process unlocked */
      __HAL_UNLOCK(hcan);
      return HAL_TIMEOUT;
    }
  }
}

Woher dieser Fehler kommt, habe ich nicht herausgefunden.

Auch wegen des Fehlers wird danach nichts gesendet.

Jetzt keine Zeit mehr, ich schaue morgen oder Dienstag Abend weiter.

Andere Kontrollen:

  • Oszilloskop: noch nicht geprüft
  • Widerstand zwischen CANL und CANH: 61,4 Ohm (im Nicht-Senden), beim Senden etwas weniger.
  • Die Spannung zwischen CANL und CANH ist 0 V, wenn nicht gesendet wird
  • Das Hinzufügen eines 120-R-Widerstands zwischen CANL und CANH macht keinen Unterschied (immer noch ein HAL_TIMEOUT).

Aktualisieren

Immer noch begrenzte Zeit, aber ich habe einen Test ohne Transceiver durchgeführt, sondern direkt mit einer einfachen Schaltung, wie in diesem Dokument beschrieben (danke an Maple). Relevanter Teil:

Geben Sie hier die Bildbeschreibung ein

Das Ergebnis funktioniert aber immer noch nicht. Die Empfängerseiten sind FAST gleich, aber der Sender überträgt kaum etwas

  • Kanal 1: Sender TX
  • Kanal 2: Sender RX
  • Kanal 3: Empfänger TX
  • Kanal 4: Empfänger RX

Geben Sie hier die Bildbeschreibung ein

Auf dem Detail (unten) ist in der ausgewählten Rampe ein kleiner Unterschied zu sehen (es gibt mehr davon). Da sie miteinander verbunden sind, würde ich diese zwar nicht erwarten, aber vielleicht könnte mein billiger Logikanalysator (5 $) diese verursachen.

Geben Sie hier die Bildbeschreibung ein

Ich würde damit beginnen, "offensichtliche" Erdungskabel zwischen Tx- und Rx-Teilen zu entfernen. Dann würde ich sicherstellen, dass die Abschlusswiderstände richtig installiert sind. Schließlich würde ich die Spannung zwischen CANL und CANH mit einem Oszilloskop messen, weil das, was ich auf CANH sehe, nicht richtig aussieht.
Was versuchen Sie auch mit zweimal wiederholter hcan.pTxMsg->IDE zu tun?
@Maple danke für all diese Ratschläge. Ich dachte immer, dass miteinander gekoppelte Geräte so weit wie möglich zusammen geerdet werden sollten? Früher habe ich es mit SPI gemacht. Jetzt bin ich verwirrt, wann es getan werden sollte und wann nicht. Ich denke auch, dass die 120-Ohm-Widerstände bereits auf der Platine sind, aber ich kann mit einem Multimeter überprüfen (zwischen CANL und CANH, denke ich?). Mein Oszilloskop ist wirklich schlecht, es ist kaum nützlich, echte Diagramme zu sehen. Und die doppelte IDE-Zuweisung ist wirklich ein dummer Fehler (muss zweimal übersehen worden sein). Heute Abend später kann ich die Schaltung und den Code erneut überprüfen.
CAN verwendet differenzielle Signalisierung, sodass keine gemeinsame Masse erforderlich ist. Tatsächlich kann es ziemlich viel CN-Spannung tolerieren. Es ist besser, unter erwarteten Betriebsbedingungen zu diagnostizieren. 120 Ohm sind nur für Kabel erforderlich, die länger als ein paar Fuß sind, daher verwenden manche Leute stattdessen 60 Ohm. Stellen Sie sicher, dass dies bei Ihren Modulen nicht der Fall ist.
Sie brauchen kein sehr gutes Oszilloskop - was Sie suchen, ist, dass die Spannung zwischen CANL und CANH auf 0 bleibt, wenn keine Kommunikation stattfindet, und in die richtige Richtung pulsiert, wenn dies der Fall ist. Wenn das Oszilloskop für Sie nicht funktioniert, können Sie beide Leitungen zur Masse jedes Moduls messen. Laut TJA1050-Datenblatt sollen sie im Leerlauf 0,5 V CN-Spannung einspeisen. Dies ist auf einem Logikanalysator für CANL-Kabel schwer zu erkennen. Wenn Sie in Ihrem Screenshot tatsächlich CANH auf Kanal 2 und CANL auf Kanal 0 haben, sieht es so aus, als wären Ihre CANL und CANH gekreuzt.
@Maple ok, vielleicht ist das (auch) das Problem, bisher habe ich es immer benutzt (und CAN nie zum Laufen gebracht). Ich brauche wahrscheinlich 120 Ohm, bei den meisten meiner geplanten Geräte wird der Abstand nebeneinander sein, aber eines wird etwa 3 Fuß entfernt sein. Und ich kann das Oszilloskop auf 0,5 V überprüfen (insbesondere im Ruhezustand). Heute Abend werde ich alle Möglichkeiten ausprobieren und berichten. Vielen Dank für Ihre Erläuterungen.
Bei solch kurzen Drähten besteht die Hauptfunktion des Widerstands/der Widerstände darin, als Pull-Together-Widerstand(e) zu wirken . Als solcher ist der Wert nicht kritisch, aber es ist entscheidend, dass es tatsächlich einen gibt!
Was ist die beabsichtigte Bitrate und was ist die tatsächliche Bitrate, wie sie vom Logikanalysator gemessen wird?
@PeterMortensen Wenn ich 7 Geräte nebeneinander verwenden möchte (serieller DB9-Anschluss an seriellen DB9-Anschluss ohne Kabel), mit Ausnahme eines Geräts, das etwa 3 Fuß weiter entfernt ist, welche Widerstände sollte ich hinzufügen und wo? Die TJA1050-Platine hat auch 120-Ohm-Widerstände (aber nicht sicher, wie diese verwendet werden, da sie bereits auf der Platine platziert sind, siehe Bild oben).
Die Bitrate des CAN-Busses liegt bei 250.000 Baud und der Logikanalysator bei 24 MHz. Irgendwann möchte ich eine höhere Bitrate verwenden (vorzugsweise 1 Mbit / s oder höher, aber ich denke, CAN unterstützt nicht mehr).
Welche CAN-Bus -Bitrate messen Sie mit dem Logikanalysator (kürzeste Impulsbreite in den Daten)?
Ein einzelner 60-Ohm-Widerstand sollte ausreichen, aber um dem CAN-Bus-Standard zu entsprechen, sollten es zwei 120-Ohm-Widerstände sein, einer an jedem Ende des Busses. Ich habe in der realen Welt ein System gesehen, das mit 3 Widerständen mit 40 Ohm effektiv läuft (Fehler bei der Produktion des Systems). Es gab Probleme, aber es lag nicht an den 3 Widerständen.
@Maple Entschuldigung, aber der Teil, dass kein Boden benötigt wird, ist Quatsch. CAN-Transceiver können mit etwas Glück Potenzialunterschiede von bis zu 40 V verarbeiten, aber es gibt keine wirkliche Garantie dafür, dass etwas funktioniert, wenn Sie keine Signalerde anschließen. Dies ist grundlegend für jede nicht galvanisch getrennte Datenübertragungselektronik.
@Maple Als Beispiel aus dem wirklichen Leben habe ich erst gestern bei der Fehlerbehebung eines CAN-Busses geholfen, bei dem die Kommunikation zwischen PC und Gerät vollständig unterbrochen war. Grund: Die Verbindung des Signalmassekabels wurde versehentlich unterbrochen. Dies liegt natürlich daran, dass das Massepotential des PCs, das von der 230-VAC-Leitung stammt, im Vergleich zu dem von einer anderen Quelle versorgten Gerät buchstäblich alles sein kann. Sobald die Signalmasse repariert war, funktionierte alles wie am Schnürchen.
@Lundin Danke für diese Erklärung; Ich werde das Erdungskabel wieder zwischen die beiden STMs legen (und zu beiden CAN-Transceivern gehen), obwohl ich immer noch das gleiche Problem habe, hoffentlich kann ich dieses Wochenende weiter darauf eingehen.
@Lundin Also schlagen Sie im Grunde vor, ein Kabel zwischen zwei Stellen mit 230 V Unterschied zu verlegen? Ja, Gemeinsamkeiten können Fehler reduzieren und werden allgemein empfohlen. Aber es ist nicht so einfach wie "immer Masse verbinden". Ich schlage vor, einen Blick auf 4.4 zu werfen . OP gab an, dass alle seine Knoten bis auf einen nebeneinander liegen werden, also nahm ich an, dass sie bereits eine gemeinsame Stromquelle haben. Das Hinzufügen eines weiteren Erdungskabels ist ein Rezept für eine Erdungsschleife, die oft sehr schwer zu diagnostizieren ist.
@Maple, wenn Sie mit Stromquelle dieselbe "Gruppe" in einem Stromkreis meinen: ja. Ich denke sogar darüber nach, einen Adapter (5 V, 6 A oder so) zu verwenden und alle Geräte über denselben Adapter mit Strom zu versorgen. Einer enthält einen LED-Streifen, der mehr Strom verbraucht, daher die 6A). Und jeder DB9-Anschluss versorgt das nächste Gerät mit +5 V und GND.
@Maple Deshalb muss die Person, die die CAN-Leiterplatte hergestellt hat, jemand sein, der weiß, was sie tut, wenn sie die Grundrisse erstellt. Es ist wirklich so einfach, immer eine Signalerde hinzuzufügen, oder Sie können alle Arten von intermittierenden Fehlern bekommen, insbesondere in Automobilanwendungen mit hohen Strömen in der Versorgung. Ich sehe dieses Versagen immer wieder auf CAN-Bussen und habe dies in den letzten 10 Jahren oder so getan.
Um das Erdungsproblem weiter zu erklären, sollten bei einem System wie einem Auto alle Erdungen wie ein „Stern“ sein, der auf eine einzige Quelle zurückgeht, da große Ströme durch diese Erdung fließen. Wenn Sie dann zwei Knoten an den Rändern dieses Sterns ohne Signalmasse miteinander verbinden, dann dient die schmutzige Mitte des Sterns mit allen Masseströmen am gesamten Fahrzeug als Referenz für alle Signale. Wenn sie jedoch mit einer Signalmasse verbunden sind, wird die unsaubere Versorgungsmasse überhaupt nicht involviert sein.
Wenn jetzt massive Ströme durch die Signalmasse fließen und dadurch Erdschleifen verursachen, dann ist das PCB-Layout Mist. Bei der Herstellung der Leiterplatte muss etwas nachgedacht werden. Sie können nicht einfach einen Draht auf die Versorgungsmasse werfen, nachdem der CAD bereits fertig ist, und ihn "Signalmasse" nennen: Dies kann tatsächlich zu Problemen mit Masseschleifen führen.
Der Logikanalysator ist wahrscheinlich nicht in der Lage, den CAN-Bus direkt abzutasten. Verwenden Sie RX/TX auf einem beliebigen Transceiver.
@Jeroen3 Ich werde das (auch) tun, ich habe 8 Kanäle, also kann ich RX/TX sowohl vom Empfänger als auch vom Sender und CANL/CANH machen ... der Logikanalysator kann CAN als Decoder verwenden, also habe ich vermutet, dass es so wäre kann auch CAN-Nachrichten verarbeiten.
@MichelKeijzers Vielleicht wird erwartet, dass es für die RX / TX-Leitungen hinter dem Transceiver verwendet wird? Weil Sie dort denselben Binärstrom haben, aber auf Ihren normalen Logikpegeln (3,3 V / 5 V). Ich habe logische Analysatoren nicht viel verwendet, daher bin ich dort keine große Hilfe.
@Lundin Ich werde es überprüfen, danke ... Der Logikanalysator ist sehr billig, hat mir aber bisher sehr geholfen (obwohl vielleicht die gleiche Qualität). Mein Oszilloskop ist wirklich schlecht, kaum brauchbar (alter analoger Typ mit einigen Aktualisierungsproblemen).
@MichelKeijzers von Ihrem Update sieht es tatsächlich nach einem Softwareproblem aus. Ich kenne diese Bibliothek nicht und als ich im Internet nach Beispielen suchte, sah ich nichts als Leute, die sich frustriert an den Haaren zogen. Sogar Low-Level-Code, den ich hier gefunden habe, sieht viel einfacher aus als diese Bibliothek. Nun, (ohne jegliches Wissen) scheint die Verwendung der Bibliothek mehr zu erfordern als in Ihrem Codebeispiel, wie Uhreinstellungen, E / A-Konfiguration usw. Das Timeout ist häufig ein Hinweis auf verpasste Konfigurationsschritte oder eine nicht ordnungsgemäße Handhabung von EOT.
@Maple Ich habe tatsächlich einige Probleme mit Cube/Hal, aber es scheint der Standardweg zu sein und würde davon ausgehen, dass es von ST behoben/unterstützt werden sollte. Ich bin ein ziemlicher Anfänger, daher ist es auch etwas überwältigend, in alle Register und zugehörigen Datenblätter einzutauchen. Ich hatte gehofft, CubeMX würde die Arbeit erledigen. Obwohl ich sowieso nie einen LED-Streifen zum Laufen gebracht habe, habe ich mich für die Verwendung der Arduino-Software für STM32 entschieden, konnte aber keine Arduino-Software für STM32 für CAN finden.
Über KEIL habe ich einmal versucht, es zu installieren, aber eines meiner Geräte wird wahrscheinlich ein großes Programm brauchen, also werde ich wahrscheinlich früher oder später sowieso an die Grenze des freien Speicherplatzes von KEIL stoßen und wieder eine andere Lösung finden müssen.
Haben Sie GPIO mit alternativen Funktionen konfiguriert? F103 braucht das
Ja habe ich versucht, keine Besserung.

Antworten (4)

CANH (Kanal 2) und CANL (Kanal 0) erhalten Informationen

Wenn Kanal 2 wirklich CANH ist, mit der gleichen Zeitbasis wie CANL auf Kanal 0, dann ist das offensichtlich Ihr Problem. Es sieht überhaupt nicht gesund aus, es sollte wie ein differentieller Spiegel von CANL aussehen.

  • Ich würde vermuten, dass etwas wie CANH gegen ein anderes Signal kurzgeschlossen wird oder dass sich etwas in der CAN-Transceiver-Schaltung falsch verhält (schlechtes Löten?).

  • Stellen Sie außerdem sicher, dass keine Pull-Widerstände zwischen der MCU und dem Transceiver oder innerhalb der MCU in den Portregistern vorhanden sind. Wenn dies das Problem wäre, würde dies logischerweise auch dazu führen, dass CANL fehlschlägt.

  • Fügen Sie immer 2x 120 Ohm Abschlusswiderstände hinzu, einen an jedem Ende des Busses, auch wenn Sie mit langsamen Baudraten und kurzen Entfernungen arbeiten. Ein gewisser Impedanzunterschied von ungefähr 60 Ohm zwischen CANH und CANL ist oft erforderlich, damit die CAN-Schaltung glücklich bleibt.

  • Schließen Sie natürlich eine Signalerde zwischen jedem Knoten an, wie es vom CAN-Standard gefordert und vorgeschrieben wird. Andernfalls sind Sie dem Massepotential Ihrer Knoten ausgeliefert, und wenn auf der Versorgungsmasse hohe Masseströme vorhanden sind, kann dies die CAN-Kommunikation beeinträchtigen, wenn keine dedizierte Signalmasse verwendet wird.

    Unter Nicht-Ingenieuren kursiert ein Mythos, dass man für differentielle Signale keine Signalmasse braucht, aber das ist Unsinn, es sei denn, der CAN-Bus ist mit Optokopplern oder ähnlichem galvanisch getrennt. Differenzialsignale sind lediglich viel robuster als andere Signale, sodass sie glücklicherweise auch dann funktionieren können, wenn das Systemdesign schlecht ist und keine Signalmasse enthält. CAN-Transceiver können einer Potentialdifferenz von bis zu 40 V standhalten, bevor die Kommunikation beeinträchtigt wird.

Das rote X auf Ihrem Oszilloskop ist kein Fehler, sondern Bitstuffing. Ihr Bereich fügt sie dort hinzu, um anzuzeigen, dass sie nicht Teil der eigentlichen Daten sind. Es ist wie erwartet, Sie sollten immer ein Füllbit nach 5 aufeinanderfolgenden High/Low-Bits in einem CAN-Frame haben.

Es könnte schlechtes Löten sein, ich bin ein Anfänger im Löten, aber ich habe auch verschiedene CAN-Transceiver (gleicher Typ) ausprobiert und habe das gleiche Problem. Ich hoffe, meine Lötfähigkeiten sind so schlecht (meine STM32 funktionieren einwandfrei). Ich habe selbst keine Widerstände verwendet, aber es gibt einige auf den CAN-Transceiver-Platinen (nicht sicher, wie diese in der Schaltung sind, es ist SMD-Technologie). Ich habe bereits mit einem Multimeter (und gelegentlich 1 Sekunde sendet) einen Widerstand von etwa 60-120 Ohm zwischen CANL und CANH gemessen, also denke ich, dass die Onboard-Widerstände dafür sorgen werden. Also ich denke das ist ok.
"Es sieht überhaupt nicht gesund aus, es sollte wie ein differentieller Spiegel von CANL aussehen." Das war mein erster Kommentar zu diesem Thread. Dann wurde mir klar, dass er einen Logikanalysator verwendet, also sollte er CANL überhaupt nicht sehen können, ohne die Logikpegel anzupassen. Die Tatsache, dass er es sieht, bedeutet höchstwahrscheinlich, dass die Leitungen vertauscht sind.
@Maple Ich werde die Zeilen so schnell wie möglich überprüfen.
Ähm, können Sie mit einem Oszilloskop messen und überprüfen, ob Sie 2,5 V +/- 1 V auf beiden Leitungen haben? CANL geht von 2,5 V auf 1,5 V = dominant, CANH macht genau das Gegenteil.
"genau das Gegenteil" würde von 1,5 auf 2,5 V gehen. CANH ändert sich zwischen 2,5 und 3,6 V, was es möglich macht, auf dem Logikanalysator zu sehen. Aber das alles ist Haarspalterei. Der einfachste Test, bei dem der TX-Pin auf einem Modul und der RX auf dem anderen verglichen werden, zeigt sofort, ob die CAN-Leitungen funktionieren. Und wenn doch, liegt das Problem in der Software.

Ein offensichtliches Problem ist, dass Sie keine Abschlusswiderstände auf dem CAN-Bus haben. Denken Sie daran, dass sie nicht nur zum Abschluss der Übertragungsleitung dienen, sondern auch die Zusammenziehwiderstände sind, damit der Bus im rezessiven Zustand ist, wenn er nicht explizit angesteuert wird.

Wenn sich dies auf einer einzelnen Platine befindet, können Sie davonkommen, indem Sie etwa 60 Ω zwischen CANL und CANH legen. Wenn der CAN-Bus ein echtes Kabel ist, legen Sie an jedem Ende 120 Ω zwischen CANL und CANH. In diesem Fall muss das Kabel auch geerdet sein, damit beide Geräte den gleichen Massebezug verwenden.

Danke .. Ich werde es dieses Wochenende versuchen; Ich frage mich immer noch, was die 120R-Widerstände auf der Platine tun ... Ich würde annehmen, dass dies die Widerstände sind, über die Sie schreiben. Ich werde 120R verwenden, da es irgendwann echte Kabel sein werden, wenn auch meist kurze.
@Michel: Wenn diese TJA1050-Dinge Module sind, wenn sich bereits Widerstände darauf befinden, sollten Sie keine eigenen hinzufügen. Es gibt wahrscheinlich eine Option, um sie zu aktivieren oder zu deaktivieren. Normalerweise möchten Sie nicht, dass Knoten versuchen, den Bus zu terminieren. Sie möchten den Bus an jedem Ende abschließen . Aus diesem Grund würde ich nicht erwarten, dass Module die Abschlusswiderstände enthalten, es sei denn, sie wären optional aktiviert.
Es gibt keine Möglichkeit, sie zu deaktivieren (zumindest nicht ohne Entlöten/Kratzen auf der Platine) ... trotzdem wird es einfach sein, zu überprüfen, ob es das Problem löst (wenn es zumindest nur eines gibt).
Ich habe diesen Link gefunden: sparks.gogo.co.nz/… , der besagt: „Beachten Sie, dass dieser Transceiver einen 120R-Abschlusswiderstand installiert hat (Markierung 121). Wenn Sie mehr als 2 Transceiver an einem Bus haben, müssen Sie diesen Widerstand möglicherweise entfernen Für alle außer dem ersten und letzten Transceiver kann Ihr Kilometerstand variieren.".
@MichelKeijzers Das ist eigentlich seltsam; wie Olin sagt, sollten solche Abschlusswiderstände nicht als Standardeinstellung aktiviert werden. Außerdem sehen diese Widerstände wie 0603 oder 0805 aus, was möglicherweise zu schwach für eine ordnungsgemäße CAN-Terminierung ist. Sie sollten einen Widerstand verwenden, der ein paar 100 mW verarbeiten kann. Ich verwende 400 mW als Faustregel, aber ich erinnere mich nicht, woher ich diese Zahl habe.
@Lundin Ich kann den Widerstand abreißen, die beiden Enden des entfernten Widerstands zusammenlöten und meine eigenen Widerstände verwenden. Ich habe vor einiger Zeit einen DMX-Terminator hergestellt, der 120-Ohm-0,5-W-Widerstände verwendet, sodass Ihnen 400 mW bekannt vorkommen.
Wenn Sie sagen "löten Sie die beiden Enden des entfernten Widerstands zusammen", hoffe ich, dass Sie nicht meinen, die Pads dort kurzzuschließen, wo sie waren. Das würde Ihre L- und H-Leitungen kurzschließen.
@Maple anfangs meinte ich das, aber es ist keine gute Idee, ich habe es überprüft und der Widerstand zwischen CANL und CANH beträgt derzeit 61,4 Ohm, also ganz ok.

Ich habe hier eine enorme Menge an Vorschlägen, Argumenten und Gegenargumenten durchgesehen, und ich denke, all dies hat Ihnen einen schlechten Dienst erwiesen. In CAN steckt keine Magie, und hier ist der Beweis:

Geben Sie hier die Bildbeschreibung ein

Dieses schreckliche Durcheinander auf meinem Schreibtisch ist ein schnelles und schmutziges Testfeld für einige Software, an der ich gerade arbeite. Es verfügt über zwei Dual-Motor-Controller mit CAN-Schnittstellen und AVR, die über MCP2515-Controller + TJA1050-Transceiver (genau das gleiche wie Sie!) mit CAN verbunden sind.

Die Motorsteuerungen sind mit 3 Drähten verbunden (einschließlich Masse), aber der AVR hat nur 2. Ich habe nicht einmal einen geraden Bus - es ist alles Stern am unbenutzten (im Moment gab es dort vorher einen anderen Controller) DB15-Stecker, den ich eingekreist habe auf dem Foto. Sie können einen einzelnen 100-Ohm-Widerstand sehen, der dort sitzt und alle CANL und CANH miteinander verbindet. Und bei 500kb/s funktioniert alles einwandfrei.

Ich behaupte nicht, dass dies der richtige Weg ist, Dinge zu tun. Ich sage nur, dass bei dieser Entfernung und Geschwindigkeit, ohne Störungen und mit stabiler Leistung all diese feinen Details und Know-hows einfach keine Rolle spielen.

Also, hier ist, was ich vorschlage.

  1. Deine Schaltpläne sind in Ordnung. Stellen Sie sicher, dass alle RX, TX, CANL, CANH entsprechend angeschlossen sind (auch wenn Sie wissen, dass sie in Ordnung sind, schadet es nie, sie zu überprüfen).

  2. Lassen Sie diese 120-Ohm-Widerstände auf den Modulen.

  3. Sie können die Erdung von zwei TJA1050 miteinander verbinden, wenn Sie möchten, aber wenn Ihr Setup so ähnlich wie meines ist, spielt es absolut keine Rolle, da alles von derselben Versorgung gespeist wird und die Entfernung vernachlässigbar ist.

  4. Schließen Sie Ihren Logikanalysator an, um TX (an Masse) auf der Sendeseite und RX (an Masse) auf der Empfangsseite zu messen. Ich glaube, dies wurde bereits mindestens dreimal vorgeschlagen, aber ich habe nie die Ergebnisse gesehen.

  5. Führen Sie Ihre Programme aus. Sie sollten auf RX genau das gleiche Signal sehen wie auf TX. Wenn nicht, liegt das Problem irgendwo in der CAN-Verbindung. Aber wenn Sie dies tun, liegt das Problem in der Software, höchstwahrscheinlich in der Filter- oder Maskenkonfiguration.

AKTUALISIEREN

Der springende Punkt beim direkten Anschließen von Controllern bestand darin, den physischen Aspekt (so weit wie möglich) zu eliminieren. Wenn die Drähte kurz sind, die Dioden schnell sind und der Pull-up korrekt ist, sollte es keinen Unterschied an den RX-Pins geben. Stellen Sie sicher, dass Sie Pull-up mit Ihrem tatsächlichen Vcc verbinden (dieses Dokument wurde für ein 5-V-System geschrieben).

Ich schlage vor, Ihre Verbindungen einmal zu überprüfen und die Verdrahtungsfrage beiseite zu legen. Konzentrieren wir uns auf die Softwareseite. So würde ich es diagnostizieren.

  1. Minimieren Sie Ihren Code. Das einzige, was Sie auf der TX-Seite haben sollten, ist gerade genug, um einmal pro Sekunde einen Basisdatenrahmen in einer Schleife zu senden. Ich schlage vor, eine einfache zyklische Ein-Byte-Sequenznummer zu übertragen. Das einzige, was Ihre RX-Seite haben sollte, ist gerade genug, um dieses Byte zu lesen und es vielleicht im Debug auszudrucken. Es sollte nichts zurückgeschickt werden, um eine Kontamination des Tests zu vermeiden.

  2. Debuggen Sie zuerst TX. Sie haben erwähnt, dass Sie an einem Punkt nur eine Nachricht herausbekommen haben. Das Ziel Nr. 1 ist also sicherzustellen, dass TX diese Nachrichten jede Sekunde sendet. Und Sie sollten sie mit Ihrem Logikanalysator auf diesem Eindrahtbus sehen.

Häufige Probleme hier: falsche Verwendung von Sendepuffern, falsche Behandlung von EOT, fehlerhafter Datenrahmen (ID, Steuerbits usw.). Überprüfen Sie auch, wie Ihre Bibliothek/Ihr Controller mit dem ACK-Bit umgeht. Technisch nicht erforderlich, aber einige Implementierungen könnten versuchen, dieselbe Nachricht immer wieder neu zu übertragen, bis ACK empfangen wird, wodurch Tx-Puffer daran gehindert werden, neue Daten zu erhalten.

  1. Bewegen Sie sich mit dieser Arbeit zur RX-Seite und prüfen Sie, ob diese Sequenznummer ordnungsgemäß empfangen wird.

Häufige Probleme hier: unterschiedliche Datenrate, falsche Verwendung von RX-Puffer, falsche Behandlung von Interrupts, falscher Filter oder Filtermaske. Es könnte hilfreich sein, Ihre Filter so zu konfigurieren, dass sie zu Beginn jede Nachricht akzeptieren .

  1. Nur wenn sowohl TX als auch RX ordnungsgemäß funktionieren, können Sie den Sende- und Empfangscode kopieren und mit der Arbeit an der bidirektionalen Anfrage-Antwort-Kommunikation beginnen.
Ich werde das bald kommentieren ... Ich habe ein Problem gefunden, wenn ich einen STM ausschalte, der andere immer noch seine Power-LED brennt, also denke ich, dass es ein Spannungsproblem gibt (oder irgendwo eine Abkürzung). Etwa 4, ich versuche es immer noch, ich bekomme jedes Mal andere Ergebnisse, und RX/TX ist immer noch anders, also denke ich tatsächlich, dass das Problem in der CAN-Verbindung liegt. Glaubst du, ich kann die TJAs umgehen und nur testweise RX und TX beider STMs miteinander verbinden? (STM_Receiver_CAN_RX zu STM_Transmitter_CAN_TX und STM_Receiver_CAN_TX zu STM_Transmitter_CAN_RX ?
Coole Idee, aber nein, es ist (nur ein bisschen) komplizierter als das. Siehe hier
das scheint ganz einfach auszuprobieren.. Ich werde das hoffentlich heute tun, wenn ich noch Zeit habe. Danke für die bisherige Hilfe.
Hallo Maple, ich habe es ohne Transceiver versucht und es funktioniert immer noch nicht, auch gibt es leichte Unterschiede im RX des Empfängers/Senders STM, während ich dies nicht erwarten würde, da sie verbunden sind. Siehe die aktualisierte Frage für den Logikanalysator (unten: siehe Update).
Ich habe der Antwort einige Vorschläge hinzugefügt.
danke ... ich werde es nach dem Wochenende überprüfen, wenn ich mehr Zeit habe. Ich schätze Ihre Bemühungen, mir zu helfen, sehr (und für mich wäre es wirklich ein Schub, wenn ich CAN zum Laufen bekomme). mit UART und SPI hatte ich weniger Probleme.

Obwohl ich es noch nicht versucht habe (ich brauchte CAN schließlich nicht), besteht die Lösung darin, innerhalb von STM32CubeMX die HAL F1-Bibliothek auf 1.7 (oder höher) zu aktualisieren, wo die CAN-Implementierung behoben/geändert wurde.