Forum: Mikrocontroller und Digitale Elektronik STM32F105xx keine CAN Nachrichten!


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Mooooin Moin,

ich werde noch Wahnsinnig! Versuche schon seit Stunden eine fu** CAN 
Message zu senden. Egal welche Baudrate ich nehme, nichts wird vom PC 
Empfangen.

Andere Nachrichten, von anderen Geräten empfängt der PC. Also diese 
Seite ist ok.

Meine Hardware ist ein DevBoard. Das sollte auch in Ordnung sein.

Die Initialisierung.:
1
void _canInit(void)
2
{
3
    GPIO_InitTypeDef GPIO_InitStructure;
4
    CAN_InitTypeDef canx;
5
6
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
7
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
8
9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
10
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
11
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
12
    GPIO_Init(GPIOB, &GPIO_InitStructure);
13
14
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
15
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
16
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
17
    GPIO_Init(GPIOB, &GPIO_InitStructure);
18
19
    GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);
20
21
    CAN_DeInit(CAN1);
22
23
    // Konfiguriert die CAN Baudrate für eine 72MHz Clock
24
    canx.CAN_SJW        = CAN_SJW_1tq;  // SJW 1-4
25
    canx.CAN_BS1        = stBitrate[_20_kbit].BS1; // Samplepoint 72%
26
    canx.CAN_BS2        = stBitrate[_20_kbit].BS2;  // Samplepoint 72%
27
    canx.CAN_Prescaler  = stBitrate[_20_kbit].Prescaler;
28
29
    /*Initializes the CAN1 */
30
    CAN_Init(CAN1, &canx);
31
32
}

Meine Testnachricht.:
1
int main(void)
2
{
3
4
    SystemInit();
5
    
6
    //SysTick_Config(SystemCoreClock / 10);
7
    //_uartInit();
8
    //_ledInit();
9
    _canInit();
10
11
    //_uartStr("****************************\r\n",USART2);
12
    //_uartStr("*  STM32F105R8T6 - CAN Board\r\n",USART2);
13
    //_uartStr("****************************\r\n",USART2);
14
15
  while(1)
16
  {
17
        CanTxMsg canMessage;
18
19
        canMessage.StdId = 0x123;
20
        canMessage.ExtId = 0;
21
        canMessage.RTR = CAN_RTR_DATA;
22
        canMessage.IDE = CAN_ID_STD;
23
        canMessage.DLC = 8;
24
25
        canMessage.Data[0] = 0;
26
        canMessage.Data[1] = 1;
27
        canMessage.Data[2] = 2;
28
        canMessage.Data[3] = 3;
29
        canMessage.Data[4] = 4;
30
        canMessage.Data[5] = 5;
31
        canMessage.Data[6] = 6;
32
        canMessage.Data[7] = 7;
33
34
        CAN_Transmit(CAN1, &canMessage);
35
  }
36
}

Was mache ich falsch?

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Die CAN_InitTypeDef Struktur hat noch mehr Felder. Die hast du nicht 
initialisiert, somit steht da irgendwas drin und die Initialisierung 
verhält sich zufällig.
Wenn bspw. CAN_Mode zufällig auf CAN_Mode_Silent gesetzt ist, kommt 
nichts raus.
Was ist stBitRate? Wie ist dein Prozessortakt? Was ist der Rückgabewert 
von CAN_Init? Mach mal ein Oszilloskopbild vom TX-Pin, das hilft sehr 
beim Finden von Baudratenproblemen.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
1
const Bitrate_st stBitrate[COUNT_BITRATE]= {
2
//    PRESCal       BS1          BS2
3
      { 6     , CAN_BS1_8tq, CAN_BS2_3tq},    // 500kbit
4
      { 12    , CAN_BS1_8tq, CAN_BS2_3tq},    // 250kbit
5
      { 24    , CAN_BS1_8tq, CAN_BS2_3tq},    // 125kbit
6
      { 30    , CAN_BS1_8tq, CAN_BS2_3tq},    // 100kbit
7
      { 42    , CAN_BS1_6tq, CAN_BS2_2tq},    // 95kbit
8
      { 36    , CAN_BS1_8tq, CAN_BS2_3tq},    // 83kbit
9
      { 60    , CAN_BS1_8tq, CAN_BS2_3tq},    // 50kbit
10
      { 90    , CAN_BS1_8tq, CAN_BS2_3tq},    // 33kbit
11
      { 150   , CAN_BS1_8tq, CAN_BS2_3tq},    // 20kbit
12
      { 300   , CAN_BS1_8tq, CAN_BS2_3tq},    // 10kbit
13
};

Mit dem µC Takt stehe ich noch auf Kriegsfuß. Bin mir nicht sicher ob er 
jetzt wirklich mit 72MHz läuft.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Und wie ist _20_kbit definiert? Wie SystemInit? Es ist immer ziemlich 
lästig wenn nur halbe Codes gezeigt werden und man fröhlich raten muss 
was da eigentlich passiert.

von Frickelfritze (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> somit steht da irgendwas drin

Nein, es steht das drin was mit
1
CAN_DeInit(CAN1);

hineingeschrieben wurde.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Frickelfritze schrieb:
> Dr. Sommer schrieb:
>> somit steht da irgendwas drin
>
> Nein, es steht das drin was mit
> CAN_DeInit(CAN1);
>
> hineingeschrieben wurde.

Und woher kennt CAN_DeInit die "canx" Variable? Es wird ja kein Pointer 
übergeben. Entweder man initialisiert "canx" vollständig oder man nutzt 
die CAN_StructInit-Funktion.

von Naj H. (janiiix3)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der gesamte Quellcode.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
1
#ifndef NULL
2
#define NULL (void *) 0
3
#endif

Unnötig, du hast doch bereits stdlib.h inkludiert.

Laut pdf hast du einen 25 MHz Quarz, aber im Code ist HSE_VALUE auf 
8000000 gesetzt. Deine SystemInit ist kaum lesbar und daher hab ich 
keine Lust die zu prüfen. Falls aber wirklich 72MHz rauskommen müsste 
die CAN-Baudrate stimmen.
Du willst mit dem Kenntnisstand CANopen implementieren? Viel Spaß...

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
>
1
#ifndef NULL
2
> #define NULL (void *) 0
3
> #endif
>
> Unnötig, du hast doch bereits stdlib.h inkludiert.
>
> Laut pdf hast du einen 25 MHz Quarz, aber im Code ist HSE_VALUE auf
> 8000000 gesetzt.

/*!< Default value of the External oscillator in Hz.
Das ist doch der externe Quarz gemeint, der ist 8MHz.
Die SystemInit(), erzeugt die IDE oder war schon vorher vorhanden.

von Dr. Sommer (Gast)


Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Das ist doch der externe Quarz gemeint, der ist 8MHz.
Im von dir hochgeladenen Schaltplan steht was von 25MHz.

Jan H. schrieb:
> Die SystemInit(), erzeugt die IDE oder war schon vorher vorhanden.
Na, hoffentlich ist sie richtig. Wie gesagt, Oszilloskop am TX-Pin 
hilft.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Sorry. Es sind 8MHz angeschlossen.

Wenn ich die Versorgungsspannung einschalte, leuchten auch kurz die 
LED´s auf. Danach sind sie aus. Aber nur bei Baudraten unter >50Kbits..

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Wenn ich die Versorgungsspannung einschalte, leuchten auch kurz die
> LED´s auf. Danach sind sie aus.

Und das obwohl die LED-Ansteuerung auskommentiert ist? Mysteriös. Naja, 
bearbeite erstmal die in der 1. Antwort angemerkten Fehler.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Nicht die LED´s die direkt an den GPIOS dran sind, sondern die am CAN_TX 
und CAN_RX dran sind.

von test (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo,

schliesse mal ein 25MHz Quarz an. Ich kann mich dunkel erinnern das ich 
mit 8MHz
auch Probleme mit CAN hatte. Im Datenblatt ist auch irgendwo 
beschrieben, das für die 105er Serie ein 25MHz Quarz empfohlen wird. War 
im Zusammenhang mit dem USB Bootloader.

gruss

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Ich habe einen STM32F105 mit 2x CAN bereits problemlos mit einem 
8MHz-Quarz genutzt. Wie bereits gesagt liegt es wahrscheinlich an 
grundlegenden C-Problemen bei der Initialisierung. Es ist aber auch 
schwierig, eine Bibliotheks-Funktion korrekt aufzurufen.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Ich habe einen STM32F105 mit 2x CAN bereits problemlos mit einem
> 8MHz-Quarz genutzt. Wie bereits gesagt liegt es wahrscheinlich an
> grundlegenden C-Problemen bei der Initialisierung. Es ist aber auch
> schwierig, eine Bibliotheks-Funktion korrekt aufzurufen.


Würdest du deine Initialisierung zur Verfügung stellen?

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Würdest du deine Initialisierung zur Verfügung stellen?
Dem Lerneffekt wäre es sehr zuträglich, wenn du mal selber schauen 
würdest wie das CAN_InitTypeDef struct aussieht und was da so reinkommt. 
Als Tip verrate ich dir, dass du dazu die Datei "stm32f10x_can.h" öffnen 
musst. Einfach nur Beispiele kopieren kann ja jeder.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Jan H. schrieb:
>> Würdest du deine Initialisierung zur Verfügung stellen?
> Dem Lerneffekt wäre es sehr zuträglich, wenn du mal selber schauen
> würdest wie das CAN_InitTypeDef struct aussieht und was da so reinkommt.
> Als Tip verrate ich dir, dass du dazu die Datei "stm32f10x_can.h" öffnen
> musst. Einfach nur Beispiele kopieren kann ja jeder.

Die Struktur ist Initialisiert.
1
CAN_StructInit(&canx);

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Die Struktur ist Initialisiert.

Ach, jetzt schon... Dann prüfe doch mal den Rückgabewert von CAN_Init, 
und das Oszilloskopbild steht auch noch aus.
1
GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);
Ersetze das mal testweise durch
1
AFIO->MAPR = AFIO_MAPR_CAN_REMAP_1;

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Habe ich doch oben weiter geschrieben. Bei höheren Baudraten, gehen die 
LEDs an und aus also da passiert was. Bei kleiner als 50 kbits, gehen 
sie nur einmal beim Booten an und das wars.

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Was ein Oszilloskop ist weißt du?

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Was ein Oszilloskop ist weißt du?

War das nicht irgendwas am Auto?

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Jan H. schrieb:
>> Die Struktur ist Initialisiert.
>
>
1
GPIO_PinRemapConfig(GPIO_Remap1_CAN1 , ENABLE);
> Ersetze das mal testweise durch
>
1
AFIO->MAPR = AFIO_MAPR_CAN_REMAP_1;

Genau das gleiche wie vorher.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Kann es sein das der STM32F105R8x überhaupt keine 72MHz unterstützt?
Wenn ich alles richtig gemacht habe, kann ich mit dem STM32CubeMx bis 
max. 36MHz gehen?!

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Kann es sein das der STM32F105R8x überhaupt keine 72MHz unterstützt?
Nein. In der 2. Zeile vom Datenblatt steht 72MHz. Im Kapitel 5.3.1 wirds 
nochmal ausdrücklich ausgeschrieben.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Dr. Sommer schrieb:
> Jan H. schrieb:
>> Kann es sein das der STM32F105R8x überhaupt keine 72MHz unterstützt?
> Nein. In der 2. Zeile vom Datenblatt steht 72MHz. Im Kapitel 5.3.1 wirds
> nochmal ausdrücklich ausgeschrieben.

Man muss im STM32MxCube extra noch einen Haken setzen, damit es 
funktioniert.

Sobald der Prescaler >84 wird, haut es nicht mehr hin.
1
    canx.CAN_Prescaler  = 84;

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Ich bin schon mal einen Schritt weiter als vorher.
Das Problem ist, dass ich den Takt nicht richtig eingestellt habe.
Aktuell habe ich heraus gefunden das der µC mit 8MHz läuft. Berechne ich 
die CAN Baudrate mit diesem Wert, klappt es.

Meine Frage jetzt.
Wie bekomme ich den Takt auf 72MHz gestellt. Ich dachte die PLL wird mit 
der SystemCoreClockUpdate() konfiguriert?

von Lutz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nicht denken, sondern die Doku lesen.

von Thomas O. (kosmos)


Bewertung
0 lesenswert
nicht lesenswert
welcher CAN Tranceiver wird den verwendet, nicht jeder High Speed CAN 
Treiber macht niedrige Baudraten mit und geht in den Sleep Mode.

von Naj H. (janiiix3)


Bewertung
0 lesenswert
nicht lesenswert
Thomas O. schrieb:
> welcher CAN Tranceiver wird den verwendet, nicht jeder High Speed CAN
> Treiber macht niedrige Baudraten mit und geht in den Sleep Mode.

TJA1040

von Lutz (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Jan H. schrieb:
> Bei kleiner als 50 kbits, gehen
> sie nur einmal beim Booten an und das wars.

The TXD dominant time-out time tdom defines the minimum possible bit 
rate of
40 kBaud.

=> Na dann hast du wohl ein timing-problem. Sicher, daß es unter 50 
kbaud ist?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.