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!
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...
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.
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).
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.