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.:
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.
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.
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.
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ß...
>> 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.
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.
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..
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.
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
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.
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?
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.
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.
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.
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.
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?!
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.
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.
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?
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
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?