Skip to content

File CAN_Common.h

File List > bsp > Inc > CAN_Common.h

Go to the documentation of this file

#pragma once

#include "stm32xx_hal.h"

#if !defined(CAN1) && !defined(FDCAN1)
  #error "[CONFIG] CAN not enabled on this chip."
#endif

// Default statically allocated size per can payload
// If you want longer messages, redefine this macro
#ifndef MAX_CAN_DATA_SIZE
#define MAX_CAN_DATA_SIZE (8)
#endif

// return code for can driver
typedef enum {
    CAN_ERR,   // unsuccessful operation
    CAN_OK,
    CAN_EMPTY, // recieved nothing with no errors
} can_status_t;


#if ( configUSE_QUEUE_SETS == 1 )
// set to block on multiple IDs
typedef struct
{
    const uint32_t *ids;
    uint32_t id_count;
    QueueSetHandle_t queueSet;
} can_id_set_t;
#endif /* ( configUSE_QUEUE_SETS == 1 ) */

// entries in queues
typedef struct {
    // If we're using FDCAN (stm32g4xx), use FDCAN_TxHeaderTypeDef
#if defined(STM32G4xx)
    FDCAN_TxHeaderTypeDef header;
#else 
    CAN_TxHeaderTypeDef header;
#endif
    uint8_t data[MAX_CAN_DATA_SIZE];
} can_tx_payload_t;

typedef struct {
    // If we're using FDCAN (stm32g4xx), use FDCAN_RxHeaderTypeDef
#if defined(STM32G4xx)
    FDCAN_RxHeaderTypeDef header;
#else
    CAN_RxHeaderTypeDef header;
#endif
  uint8_t data[MAX_CAN_DATA_SIZE];
} can_rx_payload_t;

// metadata for recieve queues
typedef struct {
  uint32_t id;
  uint16_t size;
  QueueHandle_t queue;
  uint8_t* storage;
  bool circular;
  StaticQueue_t buffer;
} can_recv_entry_t;

#if defined(CAN1) || defined(FDCAN1)
extern can_recv_entry_t can1_recv_entries[];
extern const uint32_t can1_recv_entry_count;
#endif /* CAN1 || FDCAN1 */

#if defined(CAN2) || defined(FDCAN2)
extern can_recv_entry_t can2_recv_entries[];
extern const uint32_t can2_recv_entry_count;
#endif /* CAN2 || FDCAN2 */

#if defined(CAN3) || defined(FDCAN3)
extern can_recv_entry_t can3_recv_entries[];
extern const uint32_t can3_recv_entry_count;
#endif /* CAN3 || FDCAN3 */