Forum: Mikrocontroller und Digitale Elektronik STM32 CAN Bus


von Schrauber (Gast)


Lesenswert?

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
1
GPIO_InitTypeDef GPIO_InitStructure;
2
CAN_InitTypeDef         CAN_InitStructure;
3
CAN_FilterInitTypeDef   CAN_FilterInitStructure;
4
5
// Aktiviert die Clocks für den CAN-Bus 
6
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
7
RCC_APB1PeriphClockCmd(CAN1_RCC, ENABLE);
8
9
// CAN Configure pin RX
10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        // PD0 => CANRX
11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
12
GPIO_Init(GPIOD, &GPIO_InitStructure);
13
14
// CAN Configure pin TX
15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;        // PD1 => CANTX
16
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
17
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
18
GPIO_Init(GPIOD, &GPIO_InitStructure);
19
20
// CAN1 PD0 -> CAN1_RX, PD1 -> CAN1_TX
21
GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
22
23
// CAN register init
24
CAN_StructInit(&CAN_InitStructure);
25
CAN_DeInit(CAN1);
26
 
27
CAN_InitStructure.CAN_TTCM = DISABLE;
28
CAN_InitStructure.CAN_ABOM = ENABLE;
29
CAN_InitStructure.CAN_AWUM = DISABLE;
30
CAN_InitStructure.CAN_NART = DISABLE;
31
CAN_InitStructure.CAN_RFLM = DISABLE;
32
CAN_InitStructure.CAN_TXFP = DISABLE;
33
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
34
35
// Konfiguriert die CAN Baudrate für eine 72MHz Clock
36
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;  // SJW 1-4   
37
CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq; // Samplepoint 72%   
38
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;  // Samplepoint 72%   
39
// Specifies the length of a time quantum. It ranges from 1 to 1024. 
40
//CAN_InitStructure.CAN_Prescaler = 2;  // 1000 kbit/s = 1Mbit/s
41
//CAN_InitStructure.CAN_Prescaler = 16; // 250 kbit/s
42
CAN_InitStructure.CAN_Prescaler = 32;   // 125 kbit/s
43
//CAN_InitStructure.CAN_Prescaler = 80; // 50 kbit/s
44
45
// Initialize the CAN_BS2 member
46
CAN_Init(CAN1, &CAN_InitStructure);
47
48
  // CAN filter init
49
  CAN_FilterInitStructure.CAN_FilterNumber=0;
50
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
51
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
52
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
53
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
54
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
55
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
56
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
57
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
58
  CAN_FilterInit(&CAN_FilterInitStructure);

von Linüx (Gast)


Lesenswert?


von Roland H. (batchman)


Lesenswert?

> 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.

von Schrauber (Gast)


Lesenswert?

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?

von Bronco (Gast)


Lesenswert?

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.

von Schrauber (Gast)


Lesenswert?

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.

von Schrauber (Gast)


Lesenswert?

@ 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
CANH     -------------------------
2
         |      |   |    |       | 
3
         _      |   |    |       -
4
        | | R1  N1  N2   Nx     | | R2
5
        | |     |   |    |      | | 
6
         -      |   |    |       -
7
         |      |   |    |       |
8
CANL     -------------------------  
9
10
R1 = R2 = 120 Ohm

von Gregor B. (Gast)


Lesenswert?

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.

von Bronco (Gast)


Lesenswert?

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

von P. O. (neop13)


Lesenswert?

@ 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.

von Hoff (Gast)


Lesenswert?

@neop13

Hast du ein entsprechendes Modul gefunden?

von P. O. (neop13)


Lesenswert?

Hi
Sorry ne bin damit auch nicht weitergekommen und habe es nicht weiter 
verfolgt

von Stefan K. (stefan64)


Lesenswert?

--- Thread ist 3 Jahre alt ---

von Ostrich (Gast)


Lesenswert?

ja dennoch habe ich geantwotet. sprich es wird weiter verfolgt.

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.