Forum: Mikrocontroller und Digitale Elektronik STM32F429 CAN


von Dirk Ka. (Gast)


Lesenswert?

Guten Abend,

da der STM32 nun so populär geworden ist, habe ich mir den auch mal 
zugelegt.
Und zwar auf dem discovery board mit LCD. Dort ist der F429 drauf.

Wollte etwas mit dem Can spielen, habe die CAN2 Schnittstelle frei 
gemacht, indem ist den OTG weg gemacht habe. Der CAN1 wird komplett 
blockiert.
Ich benutze also die Pins PB12 und PB13.

Leider klappt das nach 2 Tagen immer noch nicht.
Sehe keine andere Möglichkeit mehr, als Euch zu fragen.
Diverse Threads schon durchgelesen, hilft alles nix.

Als Anhang gleich mein Code.
Die Libr. habe ich direct von ST.
Der µC läuft mit 180MHz.
CAN Baud ist 500kb
Falls noch was fehlt, Bescheid sagen, lade ich hoch.
1
#include "main.h"
2
#include "stm32f4xx_conf.h"
3
#include "stm32f4xx_tim.h"
4
#include "stm32f4xx_rcc.h"
5
#include "stm32f4xx.h"
6
#include "misc.h"
7
#include "stm32f4xx_gpio.h"
8
#include "stm32f4xx_can.h"
9
10
11
int main(void)
12
{
13
14
 SystemInit(); 
15
16
17
 
18
//__________CAN INIT__________
19
  
20
  GPIO_InitTypeDef GPIO_InitStructure;
21
  NVIC_InitTypeDef NVIC_InitStructure;
22
  CAN_InitTypeDef CAN_InitStructure;
23
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
24
25
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
26
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
27
28
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
29
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_CAN2);
30
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_CAN2);
31
32
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
33
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
34
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
35
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
36
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
37
  GPIO_Init(GPIOB, &GPIO_InitStructure);
38
39
  CAN_DeInit(CAN2);
40
  CAN_InitStructure.CAN_ABOM = DISABLE;
41
  CAN_InitStructure.CAN_AWUM = DISABLE;
42
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
43
  CAN_InitStructure.CAN_NART = DISABLE;
44
  CAN_InitStructure.CAN_RFLM = DISABLE;
45
  CAN_InitStructure.CAN_SJW  = CAN_SJW_2tq;
46
  CAN_InitStructure.CAN_TTCM = DISABLE;
47
  CAN_InitStructure.CAN_TXFP = DISABLE;
48
49
  CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
50
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
51
  CAN_InitStructure.CAN_Prescaler = 5;
52
  CAN_Init(CAN2, &CAN_InitStructure);
53
54
    // Init the CAN filter
55
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
56
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
57
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
58
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
59
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
60
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
61
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
62
    CAN_FilterInitStructure.CAN_FilterNumber = 0;
63
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
64
    CAN_FilterInit(&CAN_FilterInitStructure);
65
66
    NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
67
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
68
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
69
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
70
    NVIC_Init(&NVIC_InitStructure);
71
72
    // Enable "FIFO 0 message pending" interrupt
73
    CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
74
75
//__________ENDE CAN INIT
76
77
78
79
  while(1)
80
  {
81
    }
82
}
83
84
85
void CAN2_RX0_IRQHandler()
86
{
87
  // Check CAN2_Rx status
88
  if( CAN_GetITStatus(CAN2, CAN_IT_FMP0))
89
  {
90
    if(GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_13)){
91
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, RESET);
92
        }else{
93
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, SET);
94
        }
95
96
    // Clear CAN buffer
97
//  clear_CanRxMessage();
98
  }
99
}

Mit dem Code will ich erreichen, dass die LED am Pin PG13 wenigstens ein 
Mal angeht. Würde heißen, dass der Can Controller was empfangen hat, und 
die Routinen funktionieren.
Die LED bleibt natürlich aus.
Die LED ist eingestellt, und funktioniert soweit. Den Part habe ich halt 
rausgelöscht.


Wäre für jede Hilfe sehr dankbar.
mfg DK

von Dr. Sommer (Gast)


Lesenswert?

Was hast du denn am CAN angeschlossen?

von Dirk Ka. (Gast)


Lesenswert?

Hast Recht, ist natürlich auch wichtig.
an den Pins ist ein High-Speed Transceiver (slope control auf GND), 120 
Ohm Widerstand.
Als Sender benutze ich den PEAK CAN USB.
Habe schon oft mit CAN gearbeitet, und kann den Hardwarefehler 
eigentlich komplett ausschließen.
Muss also an der Software liegen.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Probiere es mal damit:

  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);

von Dirk Ka. (Gast)


Lesenswert?

Danke, das war definitiv der Fehler Nr. 1! :)
Jetzt kann der PEAK CAN die Nachricht wenigstens abschicken.
(Wenn der Empfänger nicht da oder nicht bereit ist, geht keine Nachricht 
raus).
Leider wird die LED am PG13 immer noch kein einziges Mal gesetzt.
Muss man die Interrupts sonst noch wo aktivieren, außer das was schon 
gemacht wurde?
Danke

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Globales Interrupt enable?

von Dirk Ka. (Gast)


Lesenswert?

Im Programm habe ich schon einen Timer-Interrupt, der auch funktioniert.
Somit ist doch automatisch Globales Interrupt enable = aktiv, oder?

von holger (Gast)


Lesenswert?

>>  if( CAN_GetITStatus(CAN2, CAN_IT_FMP0))

Kommentier das doch einfach mal aus und schau
ob du überhaupt in den Interrupt kommst.

von Dr. Sommer (Gast)


Lesenswert?

Dirk Ka. schrieb:
> Im Programm habe ich schon einen Timer-Interrupt, der auch funktioniert.
> Somit ist doch automatisch Globales Interrupt enable = aktiv, oder?
Automatisch auf keinen Fall! Wenn schon weil du die Interrupts dafür 
aktiviert hast. Aktivieren geht mit __enable_irq ();

von holger (Gast)


Lesenswert?

>> Im Programm habe ich schon einen Timer-Interrupt, der auch funktioniert.
>> Somit ist doch automatisch Globales Interrupt enable = aktiv, oder?
>Automatisch auf keinen Fall! Wenn schon weil du die Interrupts dafür
>aktiviert hast. Aktivieren geht mit __enable_irq ();

Muss man nicht. Es reicht wenn die Interrupts einzeln
aktiviert werden. __enable_irq () braucht man nur nach
__disable_irq();

von Dirk Ka. (Gast)


Lesenswert?

Habe ich. Läuft da nicht rein.
1
void CAN2_RX0_IRQHandler()
2
{
3
  // Check CAN2_Rx status
4
//  if( CAN_GetITStatus(CAN2, CAN_IT_FMP0))
5
//  {
6
    if(GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_13)){
7
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, RESET);
8
        }else{
9
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, SET);
10
        }
11
12
    // Clear CAN buffer
13
//  clear_CanRxMessage();
14
//  }
15
}

Was kann ich noch probieren?

von Dirk Ka. (Gast)


Lesenswert?

Die CAN_SJW, CAN_BS1, CAN_BS2 sollten so richtig sein, oder?
Ehrlich gesagt checke ich diese Einstellungen nicht.
Habe das so aus dem Bit Timing Calculator übernommen.

von holger (Gast)


Lesenswert?

Wenn du deinen Prozessor mal auf 168MHz taktest
könntest du diese Einstellungen mal versuchen:

CAN_InitStructure.CAN_SJW       = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1       = CAN_BS1_14tq;
CAN_InitStructure.CAN_BS2       = CAN_BS2_6tq;
CAN_InitStructure.CAN_Prescaler = 4;

Das hat bei mir funktioniert mit 500kBit.

von Dirk Ka. (Gast)


Lesenswert?

Grade ausprobiert. Nun kann der PEAK CAN wieder keine Nachricht 
rausquetschen :(
Ich habe jetzt nur in der system_stm32f4xx.c
#if defined (STM32F427_437xx) || defined (STM32F429_439xx)
  uint32_t SystemCoreClock = 168000000;
eingestellt.
Und dann natürlich deine Settings übernommern.

Weiß nicht, ob der Takt sonst noch irgendwo eingestellt wird.

Kotzt mich echt langsam an :( :( :(

von holger (Gast)


Lesenswert?

In der system_stm32f4xx.c

#define PLL_N      336

>uint32_t SystemCoreClock = 168000000;

Damit setzt du die Variable SystemCoreClock, mehr aber nicht.

von Dirk Ka. (Gast)


Lesenswert?

Leider immer noch kein Erfolg.
Ich sehe, du willst wohl helfen.
Soll ich den CooCox Projektordner hochladen?
Sollte dann auf den F429I discovery Board geflashed werden.

von hp-freund (Gast)


Lesenswert?

Ich denke Du solltest dich mit den Filterregeln beschäftigen.
Ist zwar F1, aber das Prinzip sollte das Gleiche sein:

http://diller-technologies.de/stm32.html#can

von Dirk Ka. (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang der Projektordner.
Alle .c und .h Dateien aus dem Netz gesammelt ;)

main.c komplett:
1
//--------------------------------------------------------------
2
// File     : main.c
3
// Datum    : 29.10.2013
4
// Version  : 1.1
5
// Autor    : UB
6
// EMail    : mc-4u(@)t-online.de
7
// Web      : www.mikrocontroller-4u.de
8
// CPU      : STM32F429
9
// IDE      : CooCox CoIDE 1.7.4
10
// GCC      : 4.7 2012q4
11
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
12
// Funktion : Demo der LCD-Library (ILI9341)
13
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
14
//              "cmsis_boot/stm32f4xx.h"
15
//              "cmsis_boot/system_stm32f4xx.c"
16
// In Configuration diese Define hinzufügen :
17
// "STM32F429_439xx" , "__ASSEMBLY__" , "USE_STDPERIPH_DRIVER"
18
//--------------------------------------------------------------
19
20
#include "main.h"
21
#include "stm32f4xx_conf.h"
22
#include "stm32_ub_lcd_ili9341.h"
23
#include "stm32_ub_graphic2d.h"
24
#include "stm32_ub_font.h"
25
#include "stm32f4xx_tim.h"
26
#include "stm32f4xx_rcc.h"
27
#include "stm32f4xx.h"
28
#include "misc.h"
29
#include "stm32f4xx_gpio.h"
30
#include "stm32f4xx_can.h"
31
32
33
34
volatile unsigned char X_pos[15];
35
36
37
int main(void)
38
{
39
  uint32_t n;
40
41
42
43
44
  SystemInit(); // Quarz Einstellungen aktivieren
45
46
47
48
49
50
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
51
52
    // Strukturen festlegen
53
    GPIO_InitTypeDef GPIO_InitGPIO;
54
55
    // Pin Parameter einstellen
56
    GPIO_InitGPIO.GPIO_Pin = (GPIO_Pin_14);
57
    GPIO_InitGPIO.GPIO_Mode = GPIO_Mode_OUT;
58
    GPIO_InitGPIO.GPIO_OType = GPIO_OType_PP;
59
    GPIO_InitGPIO.GPIO_PuPd = GPIO_PuPd_NOPULL;
60
    GPIO_InitGPIO.GPIO_Speed = GPIO_Speed_50MHz;
61
62
    // Port initialisieren
63
    GPIO_Init(GPIOG, &GPIO_InitGPIO);
64
65
66
67
  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTIM;
68
  NVIC_InitTypeDef NVIC_InitStructure;
69
70
  // Takt für Timer2 einschalten
71
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
72
73
  // Timer 2 konfigurieren
74
  TIM_TimeBaseInitTIM.TIM_ClockDivision = TIM_CKD_DIV1;
75
  TIM_TimeBaseInitTIM.TIM_CounterMode = TIM_CounterMode_Up;
76
  TIM_TimeBaseInitTIM.TIM_Period = 700;
77
  TIM_TimeBaseInitTIM.TIM_Prescaler = 17999;
78
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitTIM);
79
80
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
81
82
  // Timer Interrupt konfigurieren
83
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
84
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
85
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
86
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
87
  NVIC_Init(&NVIC_InitStructure);
88
89
  // Timer starten
90
  TIM_Cmd(TIM2, ENABLE);
91
92
93
94
95
  // Init vom LCD
96
  UB_LCD_Init();
97
  // Init der Layer
98
  UB_LCD_LayerInit_Fullscreen();
99
  // auf Hintergrund schalten
100
  UB_LCD_SetLayer_1();
101
  // Hintergrund komplett mit einer Farbe füllen
102
  UB_LCD_FillLayer(RGB_COL_WHITE);
103
  // auf Vordergrund schalten
104
  UB_LCD_SetLayer_2();
105
  // Vordergrund komplett mit einer Farbe füllen
106
  UB_LCD_FillLayer(RGB_COL_BLACK);
107
108
//Testrechteck zeichnen
109
  UB_Graphic2D_DrawFullRectDMA(150, 30, 50, 50, 990);
110
111
112
113
114
115
//__________CAN INIT__________
116
  CAN_InitTypeDef CAN_InitStructure;
117
  GPIO_InitTypeDef GPIO_InitStructure;
118
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
119
120
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
121
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);
122
123
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
124
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource12, GPIO_AF_CAN2);
125
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_CAN2);
126
127
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
128
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
129
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
130
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
131
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
132
  GPIO_Init(GPIOB, &GPIO_InitStructure);
133
134
  CAN_DeInit(CAN2);
135
  CAN_InitStructure.CAN_ABOM = DISABLE;
136
  CAN_InitStructure.CAN_AWUM = DISABLE;
137
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
138
  CAN_InitStructure.CAN_NART = DISABLE;
139
  CAN_InitStructure.CAN_RFLM = DISABLE;
140
  CAN_InitStructure.CAN_SJW  = CAN_SJW_1tq;
141
  CAN_InitStructure.CAN_TTCM = DISABLE;
142
  CAN_InitStructure.CAN_TXFP = DISABLE;
143
144
  CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq;
145
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
146
  CAN_InitStructure.CAN_Prescaler = 5;
147
  CAN_Init(CAN2, &CAN_InitStructure);
148
149
    // Init the CAN filter
150
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
151
    CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 0;
152
    CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;
153
    CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
154
    CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;
155
    CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
156
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
157
    CAN_FilterInitStructure.CAN_FilterNumber = 0;
158
    CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
159
    CAN_FilterInit(&CAN_FilterInitStructure);
160
161
//    NVIC_InitTypeDef NVIC_InitStructure;
162
    NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
163
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
164
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
165
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
166
    NVIC_Init(&NVIC_InitStructure);
167
168
    // Enable "FIFO 0 message pending" interrupt
169
    CAN_ITConfig(CAN2, CAN_IT_FMP0, ENABLE);
170
171
//__________ENDE CAN INIT
172
173
174
175
  while(1)
176
  {
177
178
    }
179
}
180
181
182
183
184
void TIM2_IRQHandler(void){
185
 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
186
187
  if(GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_14)){
188
      GPIO_WriteBit(GPIOG, GPIO_Pin_14, RESET);
189
    }else{
190
      GPIO_WriteBit(GPIOG, GPIO_Pin_14, SET);
191
    }
192
193
}
194
195
void CAN2_RX0_IRQHandler()
196
{
197
  // Check CAN2_Rx status
198
//  if( CAN_GetITStatus(CAN2, CAN_IT_FMP0))
199
//  {
200
    if(GPIO_ReadOutputDataBit(GPIOG, GPIO_Pin_13)){
201
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, RESET);
202
        }else{
203
          GPIO_WriteBit(GPIOG, GPIO_Pin_13, SET);
204
        }
205
206
    // Clear CAN buffer
207
//  clear_CanRxMessage();
208
//  }
209
}

Sorry, wenn etwas unübersichtlich und als Baukasten.. ist alles nur zum 
Ausprobieren.

von holger (Gast)


Lesenswert?

>Leider immer noch kein Erfolg.

Dann ist da wohl noch was anderes faul.

>Ich sehe, du willst wohl helfen.

Bei CAN ist das aber leider nicht so leicht wie
bei einem UART.

>Grade ausprobiert. Nun kann der PEAK CAN wieder keine Nachricht
>rausquetschen :(

Dann war deine Einstellung für 180MHz Clock wohl schon passend.
Die Arbitrierung hat geklappt. Sonst würde da irgendwo Busheavy
stehen. Beim PCAN Viewer gibt es eine kleine Gemeinheit.
Da wird auch schon mal funktionierender CAN Verkehr angezeigt
obwohl auf der Schnittstelle nichts rausgeht. Drück da öfter
mal auf den Reset Button.

von hp-freund (Gast)


Lesenswert?

Aus dem link oben:
1
In diesem Beispiel ist ein Filter auf die Standard-ID 0x123 definiert. Alle Nachrichten mit anderen IDs werden von der Hardware ignoriert.

von Dirk Ka. (Gast)


Lesenswert?

Ich kontrolliere mit dem Oszilloscope, dass am PB13 und PB12 was 
passiert.
Also der PEAK sendet, Trancseiver funktioniert.
Wird halt nur kein Interrupt ausgelöst.
Habe schon von der vorgeschlagenen Seite den Filterpart komplett 
reinkopiert.
Sende auch 0x123 als ID.
Kommt trotzdem nicht in den Interrupt.
Sehr komisch, bei einigen läuft das ja, und zwar mit selben 
Bibliotheken, Code...
Hat jemand mein Projekt in CoIDE geöffnet?
Bin schon echt am Ausarten :)

Gruß DK

von Dirk Ka. (Gast)


Lesenswert?

Ich vermute schon fast, dass es mit dieser NVIC_ Geschichte zusammen 
hängt.
Habe schon wie ein Affe alles Andere durchprobiert.

Die Nachrichten kommen an dem uC pin an, also die Hardware funktioniert.
Der CAN-Controller ist scheinbar richtig initialisiert, weil der Sender 
die Nachrichten los bekommt.

Weiss nicht, wie wichtig das ist, aber ich verwende nur Can2, weil der 
Can1 hardwaremäßig komplett blockiert ist.
Alle Beispiele basieren aber auf Can1, ich denke, dass ich da eine 
Kleinigkeit übersehen habe, die nicht sofort auffällt.

Sonst bin ich komplett ratlos im Moment, und morgen nachmittag muss Can 
laufen, sonst ist der uC bei uns in der Firma aus dem Rennen, und wir 
bleiben weiterhin beim PIC :(((((

Ich hoffe, Ihr könnt mir da helfen, selber kriege ich das anscheinend 
net auf die Reihe.

Danke an alle Beteiligte.

DK

von Uwe B. (derexponent)


Lesenswert?

Hi Dirk Ka,

-wenn du in meinem Quellcode für CAN-2 die Kommentare gelesen hättest,
wärst du über das hier gestolpert :
1
//--------------------------------------------------------------
2
// setzt zwei Filter auf std_id [11bit] + Mode mit Maske
3
// falls ein Filter nicht benötigt wird,
4
// dann den Filter doppelt anlegen
5
//
6
// Ein CAN-Frame kommt nur durch, wenn seine ID+Mode
7
// mit Hilfe der Maske übereinstimmt
8
//
9
// nr = [14...27] (für CAN2)
10
//--------------------------------------------------------------
11
void UB_CAN2_std_FilterMask(CAN2_STD_FM_t filter, uint8_t nr)
12
{
13
  if(nr<14) nr=14;
14
  if(nr>27) nr=14;
15
16
  CAN_FilterInitStructure.CAN_FilterNumber = nr;
17
18
   ...
19
}

also das hier ist falsch :
1
CAN_FilterInitStructure.CAN_FilterNumber = 0;

den rest musst du selber suchen

Gruss Uwe

von Dirk Ka. (Gast)


Lesenswert?

Hallo Uwe!

Danke schon mal für die Antwort und für deine tolle Projekte und 
Beispiele!
Habe jetzt mit
>CAN_FilterInitStructure.CAN_FilterNumber = 14;
Probiert.
Bringt leider immer noch nichts.
Ich benutze nur die Standartlib. von ST. Also nur die can.c und can.h
Habe aber gesehen, dass in CAN_FilterInit routine nur vom CAN1 die Rede 
ist. z.B.
>/* Initialisation mode for the filter */
>  CAN1->FMR |= FMR_FINIT;

Habe die alle auf CAN2 geändert, tut sich aber immer noch nichts.
Ergebnis ist immer gleich.
Die Nachrichten kommen an, werden aber nicht "wahrgenommen", das heißt, 
kein Interrupt wird ausgelöst.

Gruß DK

von Uwe B. (derexponent)


Lesenswert?

gibt es einen Grund warum die nicht meine Quellen benutzt
oder funktionieren die auch nicht ?

(ich hab leider nur CAN-1 getestet)

von Henry N. (henry67)


Lesenswert?

Vielleicht mal den CAN Transceiver richtig nach Referenz initialisieren:
1
CAN_OperatingModeRequest(CAN1, CAN_OperatingMode_Initialization);
2
CAN_OperatingModeRequest(CAN1, CAN_OperatingMode_Normal);

von ABCD M. (ramachandran_m)


Lesenswert?

Hallo Dirk Ka

Now I am also facing the same Problem.

I am using CAN2 in STM32F429 and trying to send the messages through 
TJA1041A CAN transreceiver and sending those to PCAN.

I kindly request you to tell me on how did u solve this problem

von Steffen R. (steffen_rose)


Lesenswert?

Selten ist es immer das gleich Problem. Es sind eher die Schritte zur 
Problemfindung immer die gleichen. Doch da würde ich denken, macht sich 
ein neuer Thread besser.

Hast Du alle Tipps, die hier gegeben wurde, bereits geprüft?

von ABCD M. (ramachandran_m)


Lesenswert?

Ich habe nicht gefunden die solution for das problem

von Peter L. (localhost)


Lesenswert?

Wir hatten damals das discovery board mit stm32f4 ohne LCD. Merkwürdig, 
dass bei der neuen 144 Pin Version beide CAN Busse nicht mehr ohne 
Modifikation zur Verfügung stehen.
Wir benutzten das xpcc Framework, funktionierte auf beiden Bussen. Und 
benötigt auch nur 5 Zeilen Code. ;)
https://github.com/roboterclubaachen/xpcc/blob/develop/examples/stm32f4_discovery/can/main.cpp

Für das neue discovery board müsste man uU ein paar Configs anpassen.

: Bearbeitet durch User
von Max (Gast)


Lesenswert?

Ganz wichtig, wenn man den Can2 beim sTM32F4 benutzen moechte ist 
folgendes:
1.) der CAN1 muss angeschaltet sein (zumindest die Clock) denn der Can2 
ist dem irgendwie untergeordnet
2.) man muss den Anfang der Can2 Filter festlegen:
https://github.com/roboterclubaachen/xpcc/blob/develop/src/xpcc/architecture/platform/peripheral/can/stm32/can_filter.cpp.in#L84
Das ganze funktioniert wie ein Slider, der die Filter zwischen Can1 und 
Can2 aufteilt und so weit ich weis bekommt nach dem Reset der Can1 alle 
Filter und der Can2 keine.

Vielleicht hilft das ja.

Max

von Steffen R. (steffen_rose)


Lesenswert?

Default ist halbe/halbe bei den Filterbänken.

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.