HPM SDK
HPMicro Software Development Kit
hpm_can_drv.c File Reference
#include "hpm_can_drv.h"
#include <assert.h>

Data Structures

struct  can_bit_timing_table_t
 

Macros

#define TSEG1_MIN_FOR_CAN2_0   (2U)
 
#define TSEG1_MAX_FOR_CAN2_0   (65U)
 
#define TSEG1_MIN_FOR_CANFD_NOMINAL   (2U)
 
#define TSEG1_MAX_FOR_CANFD_NOMINAL   (65U)
 
#define TSEG1_MIN_FOR_CANFD_DATA   (2U)
 
#define TSEG1_MAX_FOR_CANFD_DATA   (17U)
 
#define TSEG2_MIN_FOR_CAN2_0   (1U)
 
#define TSEG2_MAX_FOR_CAN2_0   (8U)
 
#define TSEG2_MIN_FOR_CANFD_NOMINAL   (1U)
 
#define TSEG2_MAX_FOR_CANFD_NOMINAL   (32U)
 
#define TSEG2_MIN_FOR_CANFD_DATA   (1U)
 
#define TSEG2_MAX_FOR_CANFD_DATA   (8U)
 
#define TSJW_MIN_FOR_CAN2_0   (1U)
 
#define TSJW_MAX_FOR_CAN2_0   (16U)
 
#define TSJW_MIN_FOR_CANFD_NOMINAL   (1U)
 
#define TSJW_MAX_FOR_CANFD_NOMINAL   (16U)
 
#define TSJW_MIN_FOR_CANFD_DATA   (1U)
 
#define TSJW_MAX_FOR_CANFD_DATA   (8U)
 
#define NUM_TQ_MIN_FOR_CAN2_0   (8U)
 
#define NUM_TQ_MAX_FOR_CAN2_0   (TSEG1_MAX_FOR_CAN2_0 + TSEG2_MAX_FOR_CAN2_0)
 
#define NUM_TQ_MIN_FOR_CANFD_NOMINAL   (8U)
 
#define NUM_TQ_MAX_FOR_CANFD_NOMINAL   (TSEG1_MAX_FOR_CANFD_NOMINAL + TSEG2_MAX_FOR_CANFD_NOMINAL)
 
#define NUM_TQ_MIN_FOR_CANFD_DATA   (8U)
 
#define NUM_TQ_MAX_FOR_CANFD_DATA   (TSEG1_MAX_FOR_CANFD_DATA + TSEG2_MAX_FOR_CANFD_DATA)
 
#define MIN_TQ_MUL_PRESCALE   (10U)
 
#define NUM_PRESCALE_MAX   (256U)
 
#define CAN_FILTER_INDEX_MAX   (15U)
 
#define CAN_FILTER_NUM_MAX   (16U)
 
#define CAN_TIMEOUT_CNT   (0xFFFFFFUL)
 
#define CAN_SAMPLEPOINT_MIN   (750U)
 
#define CAN_SAMPLEPOINT_MAX   (875U)
 
#define CAN_DEFAULT_FILTER_SETTING   {0, can_filter_id_mode_both_frames, true, 0, (1UL << 29) - 1U }
 

Functions

static uint32_t find_optimal_prescaler (uint32_t num_tq_mul_prescaler, uint32_t start_prescaler, uint32_t max_tq, uint32_t min_tq)
 
static uint8_t can_get_data_words_from_dlc (uint32_t dlc)
 
static void can_fill_tx_buffer (CAN_Type *base, const can_transmit_buf_t *message)
 
static bool is_can_bit_timing_param_valid (can_bit_timing_option_t option, const can_bit_timing_param_t *param)
 
hpm_stat_t can_calculate_bit_timing (uint32_t src_clk_freq, can_bit_timing_option_t option, uint32_t baudrate, uint16_t samplepoint_min, uint16_t samplepoint_max, can_bit_timing_param_t *timing_param)
 Calculate the CAN bit timing for CAN BUS. More...
 
hpm_stat_t can_set_bit_timing (CAN_Type *base, can_bit_timing_option_t option, uint32_t src_clk_freq, uint32_t baudrate, uint16_t samplepoint_min, uint16_t samplepoint_max)
 Configure the CAN bit timing for CAN BUS. More...
 
hpm_stat_t can_set_filter (CAN_Type *base, const can_filter_config_t *config)
 Configure the acceptable filter. More...
 
hpm_stat_t can_send_message_blocking (CAN_Type *base, const can_transmit_buf_t *message)
 Send CAN message using blocking transfer. More...
 
hpm_stat_t can_send_high_priority_message_blocking (CAN_Type *base, const can_transmit_buf_t *message)
 Send high-priority message using blocking transfer. More...
 
hpm_stat_t can_send_message_nonblocking (CAN_Type *base, const can_transmit_buf_t *message)
 Send CAN message using non-blocking transfer. More...
 
hpm_stat_t can_send_high_priority_message_nonblocking (CAN_Type *base, const can_transmit_buf_t *message)
 Send high-priority message using non-blocking transfer. More...
 
hpm_stat_t can_receive_message_blocking (CAN_Type *base, can_receive_buf_t *message)
 Receive CAN message using blocking transfer. More...
 
hpm_stat_t can_read_received_message (CAN_Type *base, can_receive_buf_t *message)
 Read Received CAN message. More...
 
hpm_stat_t can_get_default_config (can_config_t *config)
 Get default CAN configuration parameters. More...
 
hpm_stat_t can_init (CAN_Type *base, can_config_t *config, uint32_t src_clk_freq)
 Initialize the CAN controller. More...
 
void can_deinit (CAN_Type *base)
 De-initialize the CAN controller. More...
 

Variables

static const can_bit_timing_table_t s_can_bit_timing_tbl [3]
 CAN bit timing list for all supported bit timing modes. More...
 

Macro Definition Documentation

◆ CAN_DEFAULT_FILTER_SETTING

#define CAN_DEFAULT_FILTER_SETTING   {0, can_filter_id_mode_both_frames, true, 0, (1UL << 29) - 1U }

◆ CAN_FILTER_INDEX_MAX

#define CAN_FILTER_INDEX_MAX   (15U)

◆ CAN_FILTER_NUM_MAX

#define CAN_FILTER_NUM_MAX   (16U)

◆ CAN_SAMPLEPOINT_MAX

#define CAN_SAMPLEPOINT_MAX   (875U)

◆ CAN_SAMPLEPOINT_MIN

#define CAN_SAMPLEPOINT_MIN   (750U)

◆ CAN_TIMEOUT_CNT

#define CAN_TIMEOUT_CNT   (0xFFFFFFUL)

◆ MIN_TQ_MUL_PRESCALE

#define MIN_TQ_MUL_PRESCALE   (10U)

◆ NUM_PRESCALE_MAX

#define NUM_PRESCALE_MAX   (256U)

◆ NUM_TQ_MAX_FOR_CAN2_0

#define NUM_TQ_MAX_FOR_CAN2_0   (TSEG1_MAX_FOR_CAN2_0 + TSEG2_MAX_FOR_CAN2_0)

◆ NUM_TQ_MAX_FOR_CANFD_DATA

#define NUM_TQ_MAX_FOR_CANFD_DATA   (TSEG1_MAX_FOR_CANFD_DATA + TSEG2_MAX_FOR_CANFD_DATA)

◆ NUM_TQ_MAX_FOR_CANFD_NOMINAL

#define NUM_TQ_MAX_FOR_CANFD_NOMINAL   (TSEG1_MAX_FOR_CANFD_NOMINAL + TSEG2_MAX_FOR_CANFD_NOMINAL)

◆ NUM_TQ_MIN_FOR_CAN2_0

#define NUM_TQ_MIN_FOR_CAN2_0   (8U)

◆ NUM_TQ_MIN_FOR_CANFD_DATA

#define NUM_TQ_MIN_FOR_CANFD_DATA   (8U)

◆ NUM_TQ_MIN_FOR_CANFD_NOMINAL

#define NUM_TQ_MIN_FOR_CANFD_NOMINAL   (8U)

◆ TSEG1_MAX_FOR_CAN2_0

#define TSEG1_MAX_FOR_CAN2_0   (65U)

◆ TSEG1_MAX_FOR_CANFD_DATA

#define TSEG1_MAX_FOR_CANFD_DATA   (17U)

◆ TSEG1_MAX_FOR_CANFD_NOMINAL

#define TSEG1_MAX_FOR_CANFD_NOMINAL   (65U)

◆ TSEG1_MIN_FOR_CAN2_0

#define TSEG1_MIN_FOR_CAN2_0   (2U)

◆ TSEG1_MIN_FOR_CANFD_DATA

#define TSEG1_MIN_FOR_CANFD_DATA   (2U)

◆ TSEG1_MIN_FOR_CANFD_NOMINAL

#define TSEG1_MIN_FOR_CANFD_NOMINAL   (2U)

◆ TSEG2_MAX_FOR_CAN2_0

#define TSEG2_MAX_FOR_CAN2_0   (8U)

◆ TSEG2_MAX_FOR_CANFD_DATA

#define TSEG2_MAX_FOR_CANFD_DATA   (8U)

◆ TSEG2_MAX_FOR_CANFD_NOMINAL

#define TSEG2_MAX_FOR_CANFD_NOMINAL   (32U)

◆ TSEG2_MIN_FOR_CAN2_0

#define TSEG2_MIN_FOR_CAN2_0   (1U)

◆ TSEG2_MIN_FOR_CANFD_DATA

#define TSEG2_MIN_FOR_CANFD_DATA   (1U)

◆ TSEG2_MIN_FOR_CANFD_NOMINAL

#define TSEG2_MIN_FOR_CANFD_NOMINAL   (1U)

◆ TSJW_MAX_FOR_CAN2_0

#define TSJW_MAX_FOR_CAN2_0   (16U)

◆ TSJW_MAX_FOR_CANFD_DATA

#define TSJW_MAX_FOR_CANFD_DATA   (8U)

◆ TSJW_MAX_FOR_CANFD_NOMINAL

#define TSJW_MAX_FOR_CANFD_NOMINAL   (16U)

◆ TSJW_MIN_FOR_CAN2_0

#define TSJW_MIN_FOR_CAN2_0   (1U)

◆ TSJW_MIN_FOR_CANFD_DATA

#define TSJW_MIN_FOR_CANFD_DATA   (1U)

◆ TSJW_MIN_FOR_CANFD_NOMINAL

#define TSJW_MIN_FOR_CANFD_NOMINAL   (1U)

Function Documentation

◆ can_fill_tx_buffer()

static void can_fill_tx_buffer ( CAN_Type base,
const can_transmit_buf_t message 
)
static

◆ can_get_data_words_from_dlc()

static uint8_t can_get_data_words_from_dlc ( uint32_t  dlc)
static

◆ find_optimal_prescaler()

static uint32_t find_optimal_prescaler ( uint32_t  num_tq_mul_prescaler,
uint32_t  start_prescaler,
uint32_t  max_tq,
uint32_t  min_tq 
)
static

◆ is_can_bit_timing_param_valid()

static bool is_can_bit_timing_param_valid ( can_bit_timing_option_t  option,
const can_bit_timing_param_t param 
)
static

Variable Documentation

◆ s_can_bit_timing_tbl

const can_bit_timing_table_t s_can_bit_timing_tbl[3]
static
Initial value:
= {
{
.tq_min = (8U) ,
.tq_max = ( (65U) + (8U) ) ,
.seg1_min = (2U) ,
.seg1_max = (65U) ,
.seg2_min = (1U) ,
.seg2_max = (8U) ,
.sjw_min = (1U) ,
.sjw_max = (16U) ,
.min_diff_seg1_minus_seg2 = 2,
},
{
.tq_min = (8U) ,
.tq_max = ( (65U) + (32U) ) ,
.seg1_min = (2U) ,
.seg1_max = (65U) ,
.seg2_min = (1U) ,
.seg2_max = (32U) ,
.sjw_min = (1U) ,
.sjw_max = (16U) ,
.min_diff_seg1_minus_seg2 = 2,
},
{
.tq_min = (8U) ,
.tq_max = ( (17U) + (8U) ) ,
.seg1_min = (2U) ,
.seg1_max = (17U) ,
.seg2_min = (1U) ,
.seg2_max = (8U) ,
.sjw_min = (1U) ,
.sjw_max = (8U) ,
.min_diff_seg1_minus_seg2 = 1,
}
}

CAN bit timing list for all supported bit timing modes.