Forum: Mikrocontroller und Digitale Elektronik CAN mit STM32, Frage


von Tobias P. (hubertus)


Lesenswert?

Hallo Kollegen

ich versuche, mit einem STM32F407 einen CAN Node zu implementieren.
Ich habe mir jetzt mal einen einfachen Testcode zusammengeschustert, der 
den CAN1 Controller initialisiert und ein paar Telegramme versenden 
soll.

Dazu habe ich CANTX und CANRX zusammengeschlossen. Alles in allem 
funktioniert es tatsächlich, wenn ich das Sende-Bit setze, beginnt der 
Controller auch umgehend, das erste Telegramm zu senden, aber er hört 
gar nicht mehr auf, sondern sendet ständig das selbe Telegramm.

Liegt das etwa daran, dass ich noch keinen CAN-Transceiver angeschlossen 
habe und somit auch noch kein anderes CAN-Device? im Moment ist mein 
STM32 allein, und es besteht noch keine Verbindung zum Bus. Irgendwas 
war da mit ACK, aber ich bin nicht sicher, bin CAN-Anfänger :-)


Gruss
Tobias

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Servus,

jup das ist korrekt. Die Nachricht wird automatisch neu gesendet wenn 
kein ACK kommt. Und das kommt von einem beliebigen anderen Knoten den du 
ja nicht hast.

von Dr. Sommer (Gast)


Lesenswert?

Tobias Plüss schrieb:
> Irgendwas war da mit ACK, aber ich bin nicht sicher, bin CAN-Anfänger
> :-)
Ganz genau, wenn kein ACK kommt sendet der Sender immer wieder. Ein CAN 
Controller kann sich selbst keine Nachricht senden, aber der F4 hat ja 2 
davon. Verbinde TX vom CAN1 mit RX von CAN2 und stell CAN1 auf Loopback 
Modus, dann kannst du das senden auf CAN1 und empfangen auf CAN2 
halbwegs sinnvoll testen.

von Tobias P. (hubertus)


Lesenswert?

Ach so. Also muss ich erst mal einen anderen Node noch haben, der das 
ACK sendet. Danke!

Noch eine andere Frage, nicht direkt STM32, aber dennoch CAN:

Es gibt ja diese Regel, dass niemals zwei Knoten Telegramme mit der 
selben CAN ID versenden dürfen. Den Grund habe ich irgendwo mal gelesen, 
aber in der Zwischenzeit wieder vergessen :-) aber ich will mich an 
diese Regel halten.

Jetzt ist es so: ich werde 3 Nodes an meinem Bus haben. Einen 
'Zentralrechner' und 2 abgesetzte Sensoren. Die Sensoren messen das 
selbe, aber an unterschiedlichen Orten. Der 'Zentralrechner' sendet 
jeweils an einen Sensor ein Telegranmm, mit der Aufforderung, einen 
bestimmten Wert zu messen. Der Sensor muss dann seinerseits nach  einer 
bestimmten Frist mit einem Telegramm antworten, wo der gewünschte 
Messwert drin ist. Wie soll man da die CAN IDs geschickt zuordnen? Ich 
habe mal folgendes gemacht:

Telegramm mit der Messaufforderung --> CAN ID 0x001
Antworttelegramm mit dem Messwert --> CAN ID 0x002

Dummerweise müssen ja aber beide Sensoren das 2. Telegramm verwenden, 
d.h. ihre CAN ID ist gleich. Was ja nicht sein darf. Wie sollte ich die 
Telegramme besser aufteilen? Die Nodes zu nummerieren, und die 
Node-Nummer als CAN ID zu verwenden sei unüblich, habe ich mir sagen 
lassen. Zumal mir dann irgendwie eine 'Broadcast' Adresse fehlt.

von Thomas F. (igel)


Lesenswert?

Tobias Plüss schrieb:
> Telegramm mit der Messaufforderung --> CAN ID 0x001
> Antworttelegramm mit dem Messwert --> CAN ID 0x002
>
> Dummerweise müssen ja aber beide Sensoren das 2. Telegramm verwenden,
> d.h. ihre CAN ID ist gleich. Was ja nicht sein darf.

Genau.

Ein Vorschlag (von vielen Möglichkeiten):

Anforderung: ID 0x050 DLC:1 Databyte:Sensor-Nummer

Sensor 1: ID 0x051 [Sensorwerte]
Sensor 2: ID 0x052 [Sensorwerte]

So würde ich das anpacken.

von huhu (Gast)


Lesenswert?

Dr. Sommer schrieb:
> Tobias Plüss schrieb:
>> Irgendwas war da mit ACK, aber ich bin nicht sicher, bin CAN-Anfänger
>> :-)
> Ganz genau, wenn kein ACK kommt sendet der Sender immer wieder. Ein CAN
> Controller kann sich selbst keine Nachricht senden, aber der F4 hat ja 2
> davon. Verbinde TX vom CAN1 mit RX von CAN2 und stell CAN1 auf Loopback
> Modus, dann kannst du das senden auf CAN1 und empfangen auf CAN2
> halbwegs sinnvoll testen.

Das ist m.E. nicht richtig. Es gibt Möglichkeiten, ohne Tranceiver 
auszukommen, aber nicht durch kreuzen von TX mit RX, siehe:

http://www.mikrocontroller.net/attachment/28831/siemens_AP2921.pdf

Im Loopbackmodus kannst Du ganz ohne Tranceiver testen. Hier kommen die 
Daten genauso wieder auf dem CAN Controller an - perfekt zum testen 
Deines Codes.

von Tobias P. (hubertus)


Lesenswert?

Hallo Hallo

Danke noch für den Tip mit den CAN IDs. Ich werde die Aufteilung der IDs 
dementsprechend anpassen. Es ist zwar eigentlich nicht möglich, dass 
zwei Knoten zur selben Zeit die selbe ID verschicken wollen, aber wenn 
ich die Node ID noch mit in die CAN ID nehme, dann bin ich sicher, dass 
die Telegramme immer eine eindeutige ID haben.


Gruss
Tobias

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.