Skip to content

Commit 6cdbee7

Browse files
Fix CAN
1 parent 7000505 commit 6cdbee7

File tree

1 file changed

+65
-45
lines changed

1 file changed

+65
-45
lines changed

Core/Src/main.c

Lines changed: 65 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
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;
7577
volatile 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

Comments
 (0)