Forum: Mikrocontroller und Digitale Elektronik CAN Grundsatzfrage bitte um HILFE!


von Anfänger (Gast)


Lesenswert?

Hallo zusammen,

ich hätte eine grundsätzlich Frage zum CAN - Bus.

Ich nutze den Busmaster in Verbindung mit einem Vector VN 1610.
Mittels des Busmasters erstelle ich eine Nachricht (Zyklische 
Übertragung alle 100ms) die ich senden möchte.
Beim Start der Nachrichtenübertragung sehe ich im Message - Window des
Busmasters, dass die Nachricht übertragen wird.
Mit dem Oszi zähle ich die Anzahl der gesendeten Frames.
Nach 204 Frames stoppt die Übertragung plötzlich und ich muss den
USB - CAN - Adapter vom USB trennen und neu verbinden um wieder eine 
Übertragung starten zu können.

Nun zu meiner Frage, warum werden die Nachrichten nicht in einer 
Endlosschleife übertragen?
Läuft hier ein Buffer über?


Viele Grüße!

von Dr. Sommer (Gast)


Lesenswert?

Weil kein Empfänger angeschlossen ist, der das ACK Bit sendet, stellt 
der Sender einen Fehler fest. Bitte erst den Wikipedia Artikel zu CAN 
vollständig lesen, diese Frage kommt hier alle 3 Tage...

von Anfänger (Gast)


Lesenswert?

Es ist ein STM32 angeschlossen, auf dem der CAN - Konfiguriert ist.
Dieser schickt zyklisch Daten, welche auch ohne Probleme empfangen und 
gelesen werden können.
Nur das Senden bereitet Probleme.

von Narfie (Gast)


Angehängte Dateien:

Lesenswert?

Nein, fehlende ACKs führen dazu, dass der Knoten in den Zustand 
"Fehler-passiv" wechselt, aber nicht in den Zustand Bus-off. Er sendet 
weiterhin, allerdings lediglich passive Fehlerflags und mit einer 
zusätzlichen Verzögerung (SUSPEND TRANSMISSION). Ich hänge mal die 
CAN-Spec. Version 2 an, die mal in der englischen Wikipedia verlinkt war 
(siehe Kapitel 7).

von Anfänger (Gast)


Lesenswert?

Hier mal meine Konfiguration des CAN - Empfängers in meinem STM32
1
main.c
2
3
  // CAN RX Filter
4
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
5
  CAN_FilterInitStructure.CAN_FilterNumber = 0;
6
  CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
7
  CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
8
  CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0200 << 5;
9
  CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
10
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF;
11
  CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0xFFFF;
12
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
13
  CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
14
  CAN_FilterInit(&CAN_FilterInitStructure);
15
16
17
18
stm32f10x_it.c
19
20
  void USB_LP_CAN1_RX0_IRQHandler(void)
21
            {
22
23
24
 CanRxMsg canRxMessage;
25
 CAN_Receive(CAN1, CAN_FIFO0, &canRxMessage);
26
27
 switch(canRxMessage.StdId)
28
          {
29
  case 200: // Mode Command
30
  WriteRegisters[0][0] = canRxMessage.Data[0];
31
        WriteRegisters[0][1] = canRxMessage.Data[1];
32
  WriteRegisters[0][2] = canRxMessage.Data[2];
33
        WriteRegisters[0][3] = canRxMessage.Data[3];
34
                break;
35
36
37
             default:break;
38
              }
39
40
41
42
             CAN_ClearITPendingBit(CAN1, CAN_IT_FF0);
43
44
            }

von Rudolph (Gast)


Lesenswert?

Was passiert denn, wenn Du die Daten über den zweiten Kanal des VN1610 
wieder zurück liest?

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.