Hallo,
ich habe einige Fragen zum CAN, habe diesen noch nicht benutzt.
Geplannt ist über einen CAN Ethernet Koppler mehrern STM32 anzusteuern.
Die STM32 Modulen sollen mit STM32F105V8T6 72Mhz (mit 25Mhz Quarz)
ausgestattet sein.
Der CAN Ethernet Koppler soll der Master sein und die STM32 module dann
die Slaves. Jedes STM32 Modul muß eine eindeutige ID haben, diese kann
in einen externen EEPROM gespeichert werden.
Meine Frage sind also:
- Kann man die STM32 als CAN Slaves benutzen?
- Wie gibt man denen eine ID, wird das mit CAN_FilterInitTypeDef
gemacht?
- Wie konfiguriert man einen STM32 als CAN Slave?
Ich habe bislang folgenden für die Konfiguration
> Jedes STM32 Modul muß eine eindeutige ID haben, diese kann> in einen externen EEPROM gespeichert werden.
Die stm32 haben bereits eine eindeutige ID. Eine Tabelle im ROM für das
Mapping, und das externe Flash kann man sich sparen. Die
Flash-EEPROM-Emulation gibt es auch noch.
Geplannt ist das 20 STM32 Module von den CAN Ethernet Koppler gesteuert
werden. Die Steuerung erfolg von einen PC via Ethernet. Die STM32 Module
werden nicht untereinander kommunizieren.
Vom PC aus muß jedes einzehlne STM32 Modul geziehlt angesteuert werden
können, da hatte Ich halt an einer ID gedacht.
Ich kann mich natürlich irren ist es nicht so, dass beim CAN-Bus eine
11-Bit ID oder Adresse benutzt wird, um die einzelnen Client zu
unterscheiden?
Wenn da tatsächlich eine eindeutige ID aus den ROM benutzt werden kann,
soll es mir recht sein, wie komme ich an dieser ID ran?
Schrauber schrieb:> Ich kann mich natürlich irren ist es nicht so, dass beim CAN-Bus eine> 11-Bit ID oder Adresse benutzt wird, um die einzelnen Client zu> unterscheiden?
Nicht ganz.
Auf den CAN-Bus werden Nachrichten (Messages) verschickt.
Jede Nachricht hat eine ID (11 oder 29 Bit breit).
Diese ID kennzeichnet die Nachricht, das ist wichtig.
Alle Geräte am CAN-Bus empfangen grunsätzlich alle Nachrichten, aber
in jedem Gerät kannst Du über Filterung der Message-ID festlegen, ob
eine empfangene Nachricht weiterverarbeitet oder ignoriert werden soll.
Es ist beim CAN also nicht so, daß eine Nachricht mit ID xyz nur vom
Gerät xyz empfangen wird. Das kannst Du zwar in Deiner Anwendung so
festlegen (über Message-Filterung), aber dazu mußt Du das auch so
implementieren.
Ich habe mir mal das Tutorial angesehen, das mit den IDs ist wohl so wie
von mir zuerst gedacht, diese werden mit CAN_FilterInitTypeDef
festgelegt. Es gibt zwei ID Modis, Standard und Extended. Die Standard
ID, welche weniger Bits hat, ist für meine Zwecke ausreichend. Eine ID
aus den ROM wird wohl beim CAN-Bus nicht benutzt.
@ Bronco
Das hatte ich mir schon so gedacht, ich werde also bevor ich die Module
im CAN-Netzwerk betreiben kann erstmal jeden eine ID geben müssen z.B.
1..20.
Gibt es Eigendlich, außer dem Adressraums, eine Beschränkung, wie viel
CAN-Clients in einen Netzwerk betrieben werden können?
Und gibt es sowas wie ein Master, oder kann Theoretisch jeder Client als
Master arbeiten?
1. CAN ist ein Multi-Maater-System.
Denn - wie bereits erklärt wurde - kennzeichnen die Identifier nur die
Nachricht, nicht aber den Teilnehmer.
2. Es gibt eine Physikalische Grenze, die an der Treiberleistung der
CAN-Transceiver hängt.
Ich weiß, dass DeviceNet 127 Teilnehmer erlaubt, mehr geht mit den
Standard-Treiberbausteinen auch physikalisch nicht mehr.
Es gibt keinen Master.
Wenn eine Nachtricht gesendet wird (egal von wem), bestimmt die
Message-ID, mit welcher Priorität sich diese Nachricht auf dem Bus
durchsetzt.
D.h. wenn zwei Teilnehmer gleichzeitig anfangen, etwas zu senden (was
sie dürfen), entscheidet sich über die Message-ID, wer weitermachen darf
und wer aufhören muß.
Du mußt auch wissen, daß die CAN-Spec nur die Netzwerkebenen 1 und 2
abdeckt. D.h. für den Anwender gibt es CAN-Messages mit Message-IDs, die
die Messages priorisieren. Was Du damit anfängst, bleibt Dir überlassen.
Alles ab Netzwerkebene 3 darfst Du selber festlegen:
Du kannst festlegen, daß das Gerät mit der Gerät-ID 0x1234 nur
CAN-Messages mit Message-ID 0x1234 empfängt.
Du kannst festlegen, daß das Gerät mit der Gerät-ID 0x1234 alle
CAN-Messages mit Message-ID zwischen 0x123400 und 0x1234FF empfängt.
Du kannst festlegen, daß das Gerät mit der Gerät-ID 0x1234 die
CAN-Messages mit Message-ID 0xCAFE, 0xAFFE und 0xD00F empfängt.
Bei z.B. Ethernet ist das anders: Über die MAC-Adresse oder IP-Adresse
wird explizit ein bestimmter Teilnehmer adressiert. Das ist innerhalb
der CAN-Spec nicht der Fall, aber Du kannst das natürlich auf CAN oben
draufsetzen, wenn Du willst.
Alle Details findest Du hier:
http://ece.eng.wayne.edu/~smahmud/CANWeb/CAN_Spec_BOSCH.pdf
@ Schrauber
Was für ein Modul nimmst du denn da?
Bin momentan auf der Suche nach einem Modul mit dem STM32F105, welches
beide CAN-Schnittstellen und evtl. ein paar I/Os hat.