G26-Telemetry-Software/include/can.hpp
alejandrogs73 ad23f59ba4 fix(sd): resolver conflicto de pines SPI con CAN y crear archivo de sesion por arranque
La SD usaba VSPI por defecto (SCK=18, MISO=19, MOSI=23, CS=5), y el pin
MOSI (GPIO23) coincidía físicamente con el RX del CAN, por lo que ambos
periféricos competían por el mismo pin y la SD no funcionaba de forma
fiable.

Se migra la SD a un bus SPI propio (HSPI) con los pines validados por
esquemático de la PCB (CS=25, MOSI=26, SCK=27, MISO=14), que no
colisionan con ningún pin usado por el CAN. Se baja además la
velocidad de reloj SPI de 20 MHz a 1 MHz mediante SdSpiConfig,
necesario por la integridad de señal del cableado/PCB actual.

Se añade también la creación de un archivo de sesión nuevo en cada
arranque (G26-1.csv, G26-2.csv, ...) usando O_EXCL para no sobrescribir
nunca sesiones anteriores, evitando que distintas ejecuciones
compartan el mismo archivo con timestamps solapados.
2026-07-21 20:02:00 +02:00

49 lines
1.2 KiB
C++

#ifndef CAN_HPP
#define CAN_HPP
#define RX_PIN 23
#define TX_PIN 22
#define POLLING_RATE_MS 1000
#define TRANSMIT_RATE_MS 1000
#include "driver/twai.h"
#include "common/common_libraries.hpp"
#include "data_processor.hpp"
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "freertos/task.h"
class CAN {
public:
CAN(): _mutex(xSemaphoreCreateMutex()), _listen_task_handle(NULL), _should_stop_listening(false) {}
~CAN();
void start();
void listen();
void start_listening_task();
void stop_listening_task();
void send_frame(twai_message_t message);
twai_message_t createBoolMessage(bool b0, bool b1, bool b2, bool b3, bool b4, bool b5, bool b6, bool b7);
void set_data_proccessor(DataProcessor *data_processor) {
_data_processor = data_processor;
}
SemaphoreHandle_t get_mutex() {
return _mutex;
}
static void listenTask(void *arg) {
CAN *controller = static_cast<CAN*>(arg);
controller->listen();
}
private:
twai_message_t _rx_message;
DataProcessor *_data_processor;
SemaphoreHandle_t _mutex;
TaskHandle_t _listen_task_handle;
volatile bool _should_stop_listening;
int test = 0;
};
#endif