Forum: Mikrocontroller und Digitale Elektronik STM32F105xx keine CAN Nachrichten!


von Jan H. (janiiix3)


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)


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 Jan H. (janiiix3)


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)


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)


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)


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 Jan H. (janiiix3)


Angehängte Dateien:

Lesenswert?

Hier mal der gesamte Quellcode.

von Dr. Sommer (Gast)


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 Jan H. (janiiix3)


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:

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 Jan H. (janiiix3)


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)


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 Jan H. (janiiix3)


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)


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)


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 Jan H. (janiiix3)


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)


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 Jan H. (janiiix3)


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)


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 Jan H. (janiiix3)


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)


Lesenswert?

Was ein Oszilloskop ist weißt du?

von Jan H. (janiiix3)


Lesenswert?

Dr. Sommer schrieb:
> Was ein Oszilloskop ist weißt du?

War das nicht irgendwas am Auto?

von Jan H. (janiiix3)


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 Jan H. (janiiix3)


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)


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 Jan H. (janiiix3)


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 Jan H. (janiiix3)


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)


Lesenswert?

Nicht denken, sondern die Doku lesen.

von Thomas (kosmos)


Lesenswert?

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

von Jan H. (janiiix3)


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)


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?

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.