Tripple CAN-FD USB Dongle
Realsierung mit dem STM32G474-RB Prozessor.
.... in kürze ist hier mehr zu finden Sobald die Prototypen überprüft wurden.
Vorschau:
Bestückungsplan:
Prototyp V1.0
Dieser Prototyp funktioniert auch ohne bestückten Quarz, d.h. der interne DFU-USB Bootloader und CAN-FD1 hatten auf Anhieb funktioniert. Ein kompletter Funktionstest, bei dem alle Hardware Module getestet werden, steht noch aus. Ebenso ist ja der Einsatz eines 24 MHz Quarz geplant. Für diesen Kurztest wurde der interne HSI verwendet und mittels PLL der System-Takt auf 160 MHz eingestellt. Die 160 MHz wurden gewählt, da dieser günstiger ist, um die üblichen CAN-Bus Baudraten einzustellen.
Hinweis: Der interne USB-Bootloader aktiviert den Ausgang PA6 (blaue LED). Dies hängt wohl damit zusammen, dass der interne SPI-Bootloader den PA6 als Ausgang konfiguriert. Mich wundert es etwas, dass diese Konfiguration nicht rückgängig gemacht wird, wenn der USB-Bootoader erkannt wird. Ist aber praktisch, da man jetzt automatisch eine Statusanzeige für den internen USB-Bootloader hat :-). Und hier noch das Foto von meinem ersten Prototyp:
Abb.1.4 - Prototyp V1.0
Funktionstests
Die Tests wurden mit einer Testsoftware, die mit dem STM32CubeMX für den MDK-Keil erstellt wurde, durchgeführt.
Als 2. CAN-Device kam ein Raspberry Pi mit meinem Pi-CAN FD - Duo - HAT-Modul zum Einsatz bei dem der CAN0 mit:
sudo ip link set can0 up type can bitrate 1000000 dbitrate 2000000 restart-ms 1000 berr-reporting on fd on
konfiguriert wurde.
Hier sind meine Testergebnisse:
- SWD Debug-Schnittstelle funktioniert.
- USART2 Debug Schnittstelle inkl. (Retargeting) funktioniert
- USB-DFU Bootloader funktioniert
- Die Logik PB8-Boot0 und Jumper J1 muss nochmal überdacht, bzw. überarbeitet werden. Macht diese hier überhaupt Sinn wegen dem CAN-FD1 Treiber?
- CAN-FD1, CAN-FD2 und CAF-FD3 Rx und Tx mit den Baudraten:
- nominal 1 MBit/s
- Datenrate 2 MBit/s
getestet
- Ansteuerung der LEDs in Ordnung (Vorwiderstände wurden angepasst, s. V1.1)
Hinweis: PA6 (blaue LED) wird vom interne DFU-USB Bootloader ebenfalls angesteuert. - to dos:
- weitere CAN-FD Baudraten testen
- last, but not least, die Firmware schreiben :-)
Für den ersten Test bei der alle 3 FDCANs verwendet werden, habe ich über die Debug-USART Schnittstelle die empfangenen Botschaften ausgegeben. Dabei wird von FDCAN2 die 0x111 Botschaft gesendet, die von FDCAN3 empfangen wird. Und der FDCAN1 empfängt die Botschaften die mein Raspberry Pi sendet:
#####################################
# Startup:
# HW: STM32-CANFD
# SW: SW 1.0.0 (23:23:28 - Feb 19 2021)
#######################
# STM32G4:
# STM32 Device-ID: 0469 Revision: 2001
# Flash-Size: 128 kBytes
# Package = 00 (LQFP64)
# SN: 4500264752501820393855
#######################
[FDCAN3] 111 (BRS) 16 50 34 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN1] 7AF (___) 64 60 1A 24 39 91 2B 11 77 60 1A 24 39 91 2B 11 77
60 1A 24 39 91 2B 11 77 60 1A 24 39 91 2B 11 77
60 1A 24 39 91 2B 11 77 60 1A 24 39 91 2B 11 77
60 1A 24 39 91 2B 11 77 60 1A 24 39 91 2B 11 77
[FDCAN1] C (___) 5 BA E0 7C 56 10
[FDCAN1] 6FC (___) 8 AA 11 79 04 85 B7 7F 2B
[FDCAN1] 6AD (BRS) 2 A3 9B
[FDCAN3] 111 (BRS) 16 38 38 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN1] 47B (___) 0
[FDCAN1] x12F2D3A3 (___) 20 61 C8 9F 53 40 C3 33 77 61 C8 9F 53 40 C3 33 77
61 C8 9F 53
[FDCAN1] x1192058C (___) 0
[FDCAN1] x0057A18E (___) 8 06 FD BF 1F 48 82 D4 36
[FDCAN1] 4E2 (___) 4 B8 7B F1 4A
[FDCAN3] 111 (BRS) 16 20 3C 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN1] 26 (___) 1 86
[FDCAN1] 4DF (___) 4 40 52 B6 7A
[FDCAN1] x19FFBCB3 (___) 8 D1 7F 14 0E 15 85 9F 4D
[FDCAN1] 3DE (___) 1 2A
[FDCAN1] x084209AB (___) 8 85 1A 5A 45 B1 06 02 68
[FDCAN3] 111 (BRS) 16 08 40 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN1] 28E (___) 3 E5 05 05
[FDCAN1] x06F173B9 (BRS) 24 88 87 01 21 40 01 BD 27 88 87 01 21 40 01 BD 27
88 87 01 21 40 01 BD 27
[FDCAN1] x16C7A3C8 (___) 8 79 82 29 7A 09 F6 7D 31
[FDCAN1] x118C8C6E (___) 8 6F AC E0 2D 3F 0C A1 3F
[FDCAN1] x010E04AA (___) 8 72 C2 4E 38 D4 1F 3D 53
[FDCAN3] 111 (BRS) 16 F0 43 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN1] x02366CFF (BRS) 0
[FDCAN3] 111 (BRS) 16 D8 47 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN3] 111 (BRS) 16 C0 4B 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
[FDCAN3] 111 (BRS) 16 A8 4F 03 00 45 46 47 48 6E 65 77 4D 65 73 73 61
Das ganze schaut mal sehr gut aus, somit müsste das mit dem CAN fürs Senden / Empfangen in Ordnung sein.
Zumal keine Botschaften verloren gehen.
Und hier noch ein kurzes Video von einem weiteren Test:
(https://youtu.be/Ao3T23NJt5g )
Hier noch das CubeMX Konfigurationsfile für den Protoypen. Das Keil-Projekt wurde noch nicht auf Github veröffentlicht (to do).
- FD_Test.ioc - Variante ohne USB und externen 24 MHz Quarz
Die geplante Konfiguration für alle 3 CAN-FDs, USB und Quarz sollte dann so aussehen:
Software
Wie oben schon erwähnt, wurde die Testsoftware mithilfe von STM32CubeMX konfiguriert und als Keil-Projekt exportiert (s. o. FD_Test.ioc )
CAN-FD Baudraten
Um günstige Werte für die CAN-Baudraten Berechnungen zu erhalten wurde der Systemtakt des Prozessors auf 160 MHz festgelegt (168 MHz wären auch gut :-) ).
Die Konfiguration im CubeMX erfolgt dann hier:
Obiges stellt die Baudrate auf 1 MBit/s (nominal) und 8 MBit/s Datenbaudrate ein. Der jeweilige Sampling-Point liegt bei 75%
Mithilfe meines Excels-Sheets ( fdcanBitrateCalculatorSTM32G4 - Wiki )habe ich mal folgende Einstellungen für die diversen Baudraten ermittelt und mit einem PCAN-FD Interface getestet. Diese Werte gelten für einen Systemtakt von 160 MHz
Ebenso wurden die Werte für einen Sampling-Point von 75% festgelegt:
-
250 kBit/s - Normale Baudrate (Es kommt zu Errors in Pcan-View)
-
Init.NominalPrescaler = 8;
-
Init.NominalSyncJumpWidth = 1;
-
Init.NominalTimeSeg1 = 59;
-
Init.NominalTimeSeg2 = 20;
-
-
500 kBit/s - Normale Baudrate
-
Init.NominalPrescaler = 4;
-
Init.NominalSyncJumpWidth = 1;
-
Init.NominalTimeSeg1 = 59;
-
Init.NominalTimeSeg2 = 20;
-
-
1 MBit - Normale Baudrate
-
Init.NominalPrescaler = 4;
-
Init.NominalSyncJumpWidth = 1;
-
Init.NominalTimeSeg1 = 29;
-
Init.NominalTimeSeg2 = 10;
-
-
2 MBit/s - Datenrate
-
Init.DataPrescaler = 4;
-
Init.DataSyncJumpWidth = 1;
-
Init.DataTimeSeg1 = 14;
-
Init.DataTimeSeg2 = 5;
-
-
4 MBit/s
-
Init.DataPrescaler = 1;
-
Init.DataSyncJumpWidth = 1;
-
Init.DataTimeSeg1 = 29;
-
Init.DataTimeSeg2 = 10;
-
-
8 MBit/s - (vereinzelte Stuffbit Fehler in PCAN-View)
-
Init.DataPrescaler = 1;
-
Init.DataSyncJumpWidth = 1;
-
Init.DataTimeSeg1 = 14;
-
Init.DataTimeSeg2 = 5;
-
Da es jeweils nur ein kurzer Test war, sind diese Werte erstmal unter Vorbehalt zu sehen. Weitere Tests werden noch folgen.