2323/* USER CODE BEGIN Includes */
2424#include "stdio.h"
2525#include "string.h"
26+ #include <inttypes.h> // ganz oben für PRIX32
27+
2628
2729/* USER CODE END Includes */
2830
@@ -75,6 +77,7 @@ volatile uint8_t triggered = 0;
7577volatile uint8_t startSampling = 0 ;
7678#define CAN_ID_HEADER 0x321
7779#define CAN_DLC 8
80+ volatile uint8_t can_send_requested = 0 ;
7881/* USER CODE END PFP */
7982
8083/* Private user code ---------------------------------------------------------*/
@@ -202,7 +205,9 @@ void send_data_over_can(void)
202205 }
203206 }
204207 rawData [totalBytes ] = crc ;
205-
208+ // 🔎 Debug-Ausgabe
209+ printf ("➡️ CRC berechnet: 0x%02X (vor dem Senden)\r\n" , crc );
210+ printf ("📦 Gesamtlänge (inkl. CRC): %u Bytes\n" , totalLen );
206211 // 📤 3. In 8-Byte-Pakete aufteilen und senden
207212 for (uint16_t i = 0 ; i < totalLen ; i += 8 )
208213 {
@@ -221,18 +226,27 @@ void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
221226{
222227 if (RxFifo0ITs & FDCAN_IT_RX_FIFO0_NEW_MESSAGE )
223228 {
229+ // 🔧 Diese beiden Variablen MÜSSEN hier oben deklariert sein
224230 FDCAN_RxHeaderTypeDef rxHeader ;
225231 uint8_t rxData [8 ];
226- HAL_FDCAN_GetRxMessage (hfdcan , FDCAN_RX_FIFO0 , & rxHeader , rxData );
232+
233+ // ✅ Jetzt dürfen wir sie verwenden
234+ if (HAL_FDCAN_GetRxMessage (hfdcan , FDCAN_RX_FIFO0 , & rxHeader , rxData ) != HAL_OK ) {
235+ printf ("❌ Fehler beim Lesen der CAN-Nachricht\r\n" );
236+ return ;
237+ }
227238
228239 if (rxHeader .Identifier == 0x123 && rxData [0 ] == 0xAB )
229240 {
230- printf ("Anfrage vom MTS erhalten – sende Daten...\r\n" );
231- send_data_over_can (); // oder sendAccelDataViaCAN();
241+ printf ("📥 CAN-Anfrage empfangen (ID=0x123, Data=0xAB)\r\n" );
242+ can_send_requested = 1 ; // ⬅ außerhalb des IRQ senden!
243+ }
244+ else
245+ {
246+ printf ("⚠️ Falsche Nachricht: ID=0x%03" PRIX32 ", Data=0x%02X\r\n" , rxHeader .Identifier , rxData [0 ]);
232247 }
233248 }
234249}
235-
236250/* USER CODE END 0 */
237251
238252/**
@@ -303,47 +317,53 @@ int main(void)
303317 uint8_t power_ctl = ADXL345_ReadRegister (0x2D );
304318 printf ("POWER_CTL: 0x%02X\r\n" , power_ctl );
305319
320+
306321 while (1 )
307322 {
323+ // Trigger prüfen
324+ if (triggered == 0 && HAL_GPIO_ReadPin (Trigger_GPIO_Port , Trigger_Pin ) == GPIO_PIN_SET )
325+ {
326+ printf (" Trigger erkannt\n" );
327+ triggered = 1 ;
328+ startSampling = 1 ;
329+ }
330+
331+ // Aufnahme starten
332+ if (startSampling && recording == 0 )
333+ {
334+ printf ("Aufzeichnung startet...\r\n" );
335+ sampleIndex = 0 ;
336+ recording = 1 ;
337+ startSampling = 0 ;
338+ BSP_LED_On (LED_GREEN );
339+ }
340+
341+ // Ausgabe nach der Aufzeichnung
342+ if (recording == 0 && sampleIndex == SAMPLE_COUNT )
343+ {
344+ printf (" Aufzeichnung abgeschlossen – sende Daten:\r\n" );
345+
346+ for (int i = 0 ; i < SAMPLE_COUNT ; i ++ )
347+ {
348+ printf ("%d,%d,%d\r\n" , accelBuffer [i ].x , accelBuffer [i ].y , accelBuffer [i ].z );
349+ HAL_Delay (1 ); // optional: UART entlasten
350+ }
351+
352+ sampleIndex = 0 ;
353+ triggered = 0 ;
354+ BSP_LED_Off (LED_GREEN );
355+ }
356+
357+ // 🔁 WICHTIG: CAN-Sendeanforderung auswerten – IMMER prüfen!
358+ if (can_send_requested )
359+ {
360+ can_send_requested = 0 ;
361+ send_data_over_can (); // wird außerhalb vom IRQ sicher ausgeführt
362+ }
363+
364+
365+
308366
309- // Trigger prüfen
310- if (triggered == 0 && HAL_GPIO_ReadPin (Trigger_GPIO_Port , Trigger_Pin ) == GPIO_PIN_SET )
311- {
312- printf (" Trigger erkannt\n" );
313- triggered = 1 ;
314- startSampling = 1 ;
315- }
316-
317- // Aufnahme starten
318- if (startSampling && recording == 0 )
319- {
320- printf ("Aufzeichnung startet...\r\n" );
321- sampleIndex = 0 ;
322- recording = 1 ;
323- startSampling = 0 ;
324- BSP_LED_On (LED_GREEN );
325- }
326-
327- // Ausgabe nach der Aufzeichnung
328- if (recording == 0 && sampleIndex == SAMPLE_COUNT )
329- {
330- printf (" Aufzeichnung abgeschlossen – sende Daten:\r\n" );
331-
332- for (int i = 0 ; i < SAMPLE_COUNT ; i ++ )
333- {
334- printf ("%d,%d,%d\r\n" , accelBuffer [i ].x , accelBuffer [i ].y , accelBuffer [i ].z );
335- HAL_Delay (1 ); // optional: UART entlasten
336- }
337- // CAN Senden
338- send_data_over_can ();
339-
340- sampleIndex = 0 ;
341- triggered = 0 ;
342- // LED AUS (Aufzeichnung + Senden fertig)
343- BSP_LED_Off (LED_GREEN );
344-
345-
346- }
347367 /* USER CODE END WHILE */
348368
349369 /* USER CODE BEGIN 3 */
@@ -415,15 +435,15 @@ static void MX_FDCAN1_Init(void)
415435 hfdcan1 .Instance = FDCAN1 ;
416436 hfdcan1 .Init .ClockDivider = FDCAN_CLOCK_DIV1 ;
417437 hfdcan1 .Init .FrameFormat = FDCAN_FRAME_CLASSIC ;
418- hfdcan1 .Init .Mode = FDCAN_MODE_EXTERNAL_LOOPBACK ;
438+ hfdcan1 .Init .Mode = FDCAN_MODE_NORMAL ;
419439 hfdcan1 .Init .AutoRetransmission = ENABLE ;
420440 hfdcan1 .Init .TransmitPause = DISABLE ;
421441 hfdcan1 .Init .ProtocolException = DISABLE ;
422442 hfdcan1 .Init .NominalPrescaler = 34 ;
423443 hfdcan1 .Init .NominalSyncJumpWidth = 1 ;
424444 hfdcan1 .Init .NominalTimeSeg1 = 6 ;
425445 hfdcan1 .Init .NominalTimeSeg2 = 3 ;
426- hfdcan1 .Init .DataPrescaler = 1 ;
446+ hfdcan1 .Init .DataPrescaler = 34 ;
427447 hfdcan1 .Init .DataSyncJumpWidth = 1 ;
428448 hfdcan1 .Init .DataTimeSeg1 = 1 ;
429449 hfdcan1 .Init .DataTimeSeg2 = 1 ;
0 commit comments