Forum: Mikrocontroller und Digitale Elektronik STM32 CAN Bus Problem


von Schrauber (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Ich habe kleines Problem mit dem CAN-BUS und mangels Erfahrung 
komme ich nicht auf die Lösung.

Ich habe ein Ethernet CAN Koppler und möchte daran einige STM32F105 
Module via CAN steuern.

Um es einfach zu halten habe ich erstmal ein STM32F105 an den Ethernet 
CAN Koppler angeschlossen. Natürlich habe ich bim STM32 zwischen CANL 
und CANH einen 120 Ohm Widerstand. Wenn ich jetzt eine Message vom PC 
mittels Ethernet CAN Koppler sende tut sich gar nicht, ich messe einen 
konstanten High Pegel (Siehe Anhang CANL_mit_STM32.png). Im STM32 wird 
auch kein Interrupt ausgelöst.

Nehme Ich jetzt aber das STM32 Modul raus und lasse nur den Widerstand 
dran, dann kann ich was auf dem Ozi sehen (Anhang CANL.png CANH.png).

Weiß jemand woran das liegt?

von J. V. (janvi)


Lesenswert?

wahrscheinlich sind die CAN Pins von deinem F105 falsch initialisiert 
und schliessen das CAN Signal kurz (Ausgang) anstelle es einzulesen.

Sollte eigentlich tun, wenn du gar nix initialsierst weil die Pins dann 
auf Input stehen. Als Ausgang brauchst du natürlich einen Bus Tranceiver 
der auf der korrekten Richtung stehen muss

von Schrauber (Gast)


Lesenswert?

Im STM32F105 (72 MHz mit 25MHz Quarz) habe ich das ganze wie folgt 
gemacht:

1
void HWinitCAN(void)
2
{
3
  GPIO_InitTypeDef GPIO_InitStructure;
4
  CAN_InitTypeDef CAN_InitStructure; 
5
  NVIC_InitTypeDef NVIC_InitStructure;
6
7
  // Initialisiert den RX Fifo Buffer
8
  RingFifo_Init(&CAN1_RX_Fifo, CAN1_Rx_Buffer, CAN_RX_DATA_SIZE);
9
10
  // Aktiviert die Clocks für den CAN-Bus 
11
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_AFIO, ENABLE);
12
  RCC_APB1PeriphClockCmd(CAN1_RCC, ENABLE);  
13
14
  // CAN Configure pin RX
15
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;        // PD0 => CANRX
16
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
17
  GPIO_Init(GPIOD, &GPIO_InitStructure);
18
19
  // CAN Configure pin TX
20
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;        // PD0 => CANTX
21
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
22
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
23
  GPIO_Init(GPIOD, &GPIO_InitStructure);
24
25
  // CAN1 PD0 -> CAN1_RX, PD1 -> CAN1_TX
26
  GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);
27
28
  // CAN register init
29
  CAN_StructInit(&CAN_InitStructure);
30
  CAN_DeInit(CAN1);
31
32
  // Enable or disable the time triggered communication mode. This parameter can be set either to ENABLE or DISABLE. 
33
  CAN_InitStructure.CAN_TTCM = DISABLE;
34
35
  // Enable or disable the automatic bus-off management. This parameter can be set either to ENABLE or DISABLE
36
  CAN_InitStructure.CAN_ABOM = DISABLE;
37
38
  // Enable or disable the automatic wake-up mode. This parameter can be set either to ENABLE or DISABLE. 
39
  CAN_InitStructure.CAN_AWUM = DISABLE;
40
41
  // Enable or disable the no-automatic retransmission mode. This parameter can be set either to ENABLE or DISABLE.
42
  CAN_InitStructure.CAN_NART = DISABLE;
43
44
  // Enable or disable the Receive FIFO Locked mode. This parameter can be set either to ENABLE or DISABLE. 
45
  CAN_InitStructure.CAN_RFLM = DISABLE;
46
47
  // Enable or disable the transmit FIFO priority. This parameter can be set either to ENABLE or DISABLE. 
48
  CAN_InitStructure.CAN_TXFP = DISABLE;
49
50
  // Specifies the CAN operating mode. This parameter can be a value of CAN_operating_mode. {CAN_Mode_Normal, CAN_Mode_LoopBack, CAN_Mode_Silent, CAN_Mode_Silent_LoopBack} 
51
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
52
53
  
54
  // Konfiguriert die CAN Baudrate für eine 72MHz Clock
55
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;  // SJW 1-4   Specifies the maximum number of time quanta the CAN hardware is allowed to lengthen or shorten a bit to perform resynchronization. This parameter can be a value of CAN_synchronisation_jump_width  
56
  
57
  // Initialize the CAN_BS1 member
58
  CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;    
59
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
60
61
  // Specifies the length of a time quantum. It ranges from 1 to 1024. 
62
  //CAN_InitStructure.CAN_Prescaler = 2;  // 1000 kbit/s = 1Mbit/s
63
  //CAN_InitStructure.CAN_Prescaler = 16; // 250 kbit/s
64
  CAN_InitStructure.CAN_Prescaler = 32;   // 125 kbit/s
65
  //CAN_InitStructure.CAN_Prescaler = 80; // 50 kbit/s
66
67
  // Initialize the CAN_BS2 member
68
  CAN_Init(CAN1, &CAN_InitStructure);    
69
70
  // CAN1 RX Interrupt
71
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
72
  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
73
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
74
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
75
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
76
  NVIC_Init(&NVIC_InitStructure);
77
78
79
  // IT Configuration for CAN1 
80
  CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
81
82
  // CAN filter init
83
  CAN1_UseFilterID();
84
}
85
86
void CAN1_UseFilterID(void)
87
{
88
  CAN_FilterInitTypeDef   CAN_FilterInitStructure;
89
90
  // Zum testen erstmal alles durchlassen
91
  CAN_FilterInitStructure.CAN_FilterNumber           = 0;
92
  CAN_FilterInitStructure.CAN_FilterMode             = CAN_FilterMode_IdMask;
93
  CAN_FilterInitStructure.CAN_FilterScale            = CAN_FilterScale_32bit;
94
  CAN_FilterInitStructure.CAN_FilterIdHigh           = 0x0000;
95
  CAN_FilterInitStructure.CAN_FilterIdLow            = 0x0000;
96
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh       = 0x0000;
97
  CAN_FilterInitStructure.CAN_FilterMaskIdLow        = 0x0000;
98
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment   = CAN_FIFO0;
99
  CAN_FilterInitStructure.CAN_FilterActivation       = ENABLE;
100
  CAN_FilterInit(&CAN_FilterInitStructure);
101
}
102
103
void CAN1_RX0_IRQHandler(void)
104
{
105
  int i;
106
107
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
108
109
  // DEBUG
110
  SetDigOutputLed2(TRUE);
111
  
112
/*
113
  if((RxMessage.StdId == Par4.CAN_ID || RxMessage.StdId == CAN1_STD_ID_TO_ALL) &&
114
     (RxMessage.IDE == CAN_ID_STD) &&
115
     (RxMessage.DLC > 0) &&
116
     (RxMessage.DLC < 8))
117
*/
118
  {
119
    for(i=0; i<RxMessage.DLC; i++)
120
    {
121
      if(CAN1_RX_Fifo.Count < CAN1_RX_Fifo.Size)
122
      {
123
        RingFifo_Put(&CAN1_RX_Fifo, (RingFifoData_t)RxMessage.Data[i]);
124
      }
125
      else
126
      {
127
        // Fehler Buffer ist übergelaufen
128
        break;
129
      }
130
    }    
131
  }
132
}

von Neugieriger (Gast)


Lesenswert?

kann zur Lösung leider nicht beitragen, habe aber eine Frage:
Was für einen Ethernet-CAN-Koppler verwendest Du?

von Schrauber (Gast)


Lesenswert?

@J. V.
Am Ausgang also CANL CANH ist ein CAN-Bus Tranceiver vorhanden.
Den Code für die Initalisierung habe ich ja gerade gepostet,
ich meine es richtig konfiguriert zu haben.
Aber vieleicht sehe ich auch den Walt vor lauter Bäumen nicht.

von Schrauber (Gast)


Lesenswert?

@Neugieriger
Den CAN-Ethernet Gateway V2 von Sys Tec
(w w w [Punkt] systec-electronic [Punkt] com)

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.