stm32 F4 Discovery || CAN Problem

Gast #2917857
Lesenswert?

Möchte auf dem stm32 F4 Discovery CAN implementieren. Ich habe jedoch 
ein Problem mit der Baud Rate.

Ich zur Berechnung habe ich das ExcelSheet 
Beitrag "STM32 CAN Baudrate Berechnung (Can Bit Timing)" verwendet. Hatte mir aber 
auch schon selbst ein Sheet erstellt das die gleichen Ergebnisse 
liefert.

So ergeben sich folgende werte bei 42mhz APB1
 Presacaler 2
 CAN_BS1_   14  tq
 CAN_BS2_   6  tq
-->Baudrate 1000 khz

Wenn ich mir das ganze dann aber auf dem Oszi anschaue sehe ich dort 
eine Bitzeit von 3us, also eine Baurate von 333,33 kbit/s.

Den APB clock hab ich mir mit RCC_GetClocksFreq(&RCC_Clocks) ausgelesen:
1
{SYSCLK_Frequency = 168000000, HCLK_Frequency = 168000000, PCLK1_Frequency = 42000000, PCLK2_Frequency = 84000000}

bei den "falschen" Einstellungen von:
 Presacaler 1
 CAN_BS1_   9  tq
 CAN_BS2_   4  tq

Komme ich tatsächlich auf eine Baudrate von 1000 kbit/s.

Bei einem 42Mhz APB Clock wären das aber 1500 kbit/s.

Rück-gerechnet ergibt dies einen Can clock von 28Mhz

Nun der Code:
1
#define CAN1_TX GPIO_Pin_1
2
#define CAN1_RX GPIO_Pin_0
3
#define CAN_PORT GPIOD
4
#define CAN_GPIO_CLK RCC_AHB1Periph_GPIOD
5
#define CAN_TX_SOURCE GPIO_PinSource1
6
#define CAN_RX_SOURCE GPIO_PinSource0
7

8

9

10
void init_can(void)
11
{
12
  CAN_InitTypeDef CAN_InitStruct;
13
  GPIO_InitTypeDef GPIO_InitStructure;
14
  uint8_t propbe;
15

16
  /* CAN GPIOs configuration **************************************************/
17

18
  /* Enable GPIO clock */
19
  RCC_AHB1PeriphClockCmd(CAN_GPIO_CLK, ENABLE);
20

21
  /* Connect CAN pins to AF9 */
22
  GPIO_PinAFConfig(CAN_PORT, CAN_RX_SOURCE, GPIO_AF_CAN1);
23
  GPIO_PinAFConfig(CAN_PORT, CAN_TX_SOURCE, GPIO_AF_CAN1);
24

25
  /* Configure CAN RX and TX pins */
26
  GPIO_InitStructure.GPIO_Pin = CAN1_TX | CAN1_RX;
27
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
28
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
29
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
30
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
31
  GPIO_Init(CAN_PORT, &GPIO_InitStructure);
32

33
  /* CAN configuration ********************************************************/
34
  /* Enable CAN clock */
35
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
36

37
  CAN_DeInit(CAN1);
38
  /* Initialize the time triggered communication mode */
39
  CAN_InitStruct.CAN_TTCM = DISABLE;
40

41
  /* Initialize the automatic bus-off management */
42
  CAN_InitStruct.CAN_ABOM = DISABLE;
43

44
  /* Initialize the automatic wake-up mode */
45
  CAN_InitStruct.CAN_AWUM = ENABLE;
46

47
  /* Initialize the no automatic retransmission */
48
  CAN_InitStruct.CAN_NART = DISABLE;
49

50
  /* Initialize the receive FIFO locked mode */
51
  CAN_InitStruct.CAN_RFLM = DISABLE;
52

53
  /* Initialize the transmit FIFO priority */
54
  CAN_InitStruct.CAN_TXFP = DISABLE;
55

56
  /* Initialize the CAN_Mode member */
57
  CAN_InitStruct.CAN_Mode = CAN_Mode_Normal;
58

59
  /* Initialize the CAN_SJW member */
60
  CAN_InitStruct.CAN_SJW = CAN_SJW_1tq;
61

62
  /* Initialize the CAN_BS1 member */
63
  CAN_InitStruct.CAN_BS1 = CAN_BS1_14tq;
64

65
  /* Initialize the CAN_BS2 member */
66
  CAN_InitStruct.CAN_BS2 = CAN_BS2_6tq;
67

68
  /* Initialize the CAN_Prescaler member */
69
  //CAN_InitStruct.CAN_Prescaler=1;        // 2000 kbit/s
70
  CAN_InitStruct.CAN_Prescaler = 2;        // 1000 kbit/s
71
  //CAN_InitStruct.CAN_Prescaler=4;        //  500 kbit/s
72
  //CAN_InitStruct.CAN_Prescaler=5;        //  400 kbit/s
73
  //CAN_InitStruct.CAN_Prescaler=8;        //  250 kbit/s
74
  //CAN_InitStruct.CAN_Prescaler=10;       //  200 kbit/s
75
  //CAN_InitStruct.CAN_Prescaler=16;       //  125 kbit/s
76
  //CAN_InitStruct.CAN_Prescaler=20;       //  100 kbit/s
77
  //CAN_InitStruct.CAN_Prescaler=40;       //   50 kbit/s
78
  //CAN_InitStruct.CAN_Prescaler=80;       //   40 kbit/s
79
  //CAN_InitStruct.CAN_Prescaler=200;      //   10 kbit/s
80
  propbe = CAN_Init(CAN1, &CAN_InitStruct);
81

82
  can_filter_conf();
83

84
}

Wo liegt mein Fehler?
#2917885
Lesenswert?

Vermutlich stimmt die angegebene Taktfrequenz von 168 MHz für den 
STM32F4xx nicht.

Das STM32F4 Discovery Board hat einen 8 MHz Quarz. Die Libraries / 
Beispiele gehen aber von 25 MHz aus. Wenn das in deinem Programm für die 
Initialisierung nicht angepasst wurde, würde es genau die Differenz 
erklären.

Leider fehlen diese Teile deines Quelltextes.
Gast #2917912
Lesenswert?

Wo gemessen? An den Controllerpins?

Die ganze CAN-Geschichte funktioniert nur, wenn man einen Transceiver 
dranhängt UND auf dem Bus (bzw. zu Testzwecken zwischen CANH und CANL) 
die 120 Ohm Terminierung hat.
Anders würde ich das gar nicht erst testen. Habe Tage mit der Geschichte 
verbracht.

mfg

Michael
Gast #2917979
Lesenswert?

Jetzt gehts. Der externe Quarz war falsch eingestellt. Statt auf 8Mhz 
auf 25Mhz.

"Die ganze CAN-Geschichte funktioniert nur, wenn man einen Transceiver
dranhängt UND auf dem Bus (bzw. zu Testzwecken zwischen CANH und CANL)
die 120 Ohm Terminierung hat.
Anders würde ich das gar nicht erst testen. Habe Tage mit der Geschichte
verbracht."

Hab ich alles dran. Daten kommen jetzt auch bei den Nodes an.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren