HPM SDK
HPMicro Software Development Kit
hpm_can_drv.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2021-2025 HPMicro
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef HPM_CAN_DRV_H
9 #define HPM_CAN_DRV_H
10 
11 #include "hpm_common.h"
12 #include "hpm_can_regs.h"
13 #include "hpm_soc_feature.h"
14 
23 /***********************************************************************************************************************
24  *
25  * Definitions
26  *
27  **********************************************************************************************************************/
28 
32 enum {
44 };
45 
49 #define CAN_EVENT_RECEIVE (CAN_RTIF_RIF_MASK)
50 #define CAN_EVENT_RX_BUF_OVERRUN (CAN_RTIF_ROIF_MASK)
51 #define CAN_EVENT_RX_BUF_FULL (CAN_RTIF_RFIF_MASK)
52 #define CAN_EVENT_RX_BUF_ALMOST_FULL (CAN_RTIF_RAFIF_MASK)
53 #define CAN_EVENT_TX_PRIMARY_BUF (CAN_RTIF_TPIF_MASK)
54 #define CAN_EVENT_TX_SECONDARY_BUF (CAN_RTIF_TSIF_MASK)
55 #define CAN_EVENT_ERROR (CAN_RTIF_EIF_MASK)
56 #define CAN_EVENT_ABORT (CAN_RTIF_AIF_MASK)
61 #define CAN_STB_IS_EMPTY (0U)
62 #define CAN_STB_LESS_EQUAL_HALF_FULL (1U)
63 #define CAN_STB_MORE_THAN_HALF_FULL (2U)
64 #define CAN_STB_IS_FULL (3U)
69 #define CAN_RXBUF_IS_EMPTY (0U)
70 #define CAN_RXBUF_HAS_DATA (1U)
71 #define CAN_RXBUF_ALMOST_FULL (2U)
72 #define CAN_RXBUF_IS_FULL (3U)
78 #define CAN_ERROR_WARNING_LIMIT_FLAG (CAN_ERRINT_EWARN_MASK)
79 #define CAN_ERROR_PASSIVE_MODE_ACTIVE_FLAG (CAN_ERRINT_EPASS_MASK)
80 #define CAN_ERROR_PASSIVE_INT_ENABLE (CAN_ERRINT_EPIE_MASK)
81 #define CAN_ERROR_PASSIVE_INT_FLAG (CAN_ERRINT_EPIF_MASK)
82 #define CAN_ERROR_ARBITRATION_LOST_INT_ENABLE (CAN_ERRINT_ALIE_MASK)
83 #define CAN_ERROR_ARBITRATION_LOST_INT_FLAG (CAN_ERRINT_ALIF_MASK)
84 #define CAN_ERROR_BUS_ERROR_INT_ENABLE (CAN_ERRINT_BEIE_MASK)
85 #define CAN_ERROR_BUS_ERROR_INT_FLAG (CAN_ERRINT_BEIF_MASK)
91 #define CAN_KIND_OF_ERROR_NO_ERROR (0U)
92 #define CAN_KIND_OF_ERROR_BIT_ERROR (1U)
93 #define CAN_KIND_OF_ERROR_FORM_ERROR (2U)
94 #define CAN_KIND_OF_ERROR_STUFF_ERROR (3U)
95 #define CAN_KIND_OF_ERROR_ACK_ERROR (4U)
96 #define CAN_KIND_OF_ERROR_CRC_ERROR (5U)
97 #define CAN_KIND_OF_ERROR_OTHER_ERROR (6U)
98 #define CAN_KIND_OF_ERROR_BUS_OFF (7U)
103 #define CAN_TIME_STAMPING_POSITION_SOF (0U)
104 #define CAN_TIME_STAMPING_POSITION_EOF (1U)
106 #define CAN_TIMESTAMP_OFFSET_IN_RX_MSG_IN_WORDS 18
107 
108 typedef struct {
109  uint32_t nano_sec;
110  uint32_t second;
115 typedef enum _can_mode {
121 
125 typedef enum _can_bit_timing_option {
130 
134 enum {
152 };
153 
157 typedef struct {
158  uint16_t prescaler;
159  uint16_t num_seg1;
160  uint16_t num_seg2;
161  uint16_t num_sjw;
163 
167 typedef union _can_rx_buf {
168  uint32_t buffer[20];
169  struct {
170  struct {
171  uint32_t id: 29;
172  uint32_t : 1;
173  uint32_t error_state_indicator: 1;
174  };
175  struct {
176  uint32_t dlc: 4;
177  uint32_t bitrate_switch: 1;
178  uint32_t canfd_frame: 1;
179  uint32_t remote_frame: 1;
180  uint32_t extend_id: 1;
181  uint32_t : 4;
182  uint32_t loopback_message: 1;
183  uint32_t error_type: 3;
184  uint32_t cycle_time: 16;
185  };
186  uint8_t data[];
187  };
189 
193 typedef union _can_tx_buf {
194  uint32_t buffer[18];
195  struct {
196  struct {
197  uint32_t id: 29;
198  uint32_t : 2;
199  uint32_t transmit_timestamp_enable: 1;
200  };
201  struct {
202  uint32_t dlc: 4;
203  uint32_t bitrate_switch: 1;
204  uint32_t canfd_frame: 1;
205  uint32_t remote_frame: 1;
206  uint32_t extend_id: 1;
207  uint32_t : 24;
208  };
209  uint8_t data[];
210  };
212 
216 typedef enum _can_filter_id_mode {
221 
225 typedef struct {
226  uint16_t index;
228  bool enable;
229  uint32_t code;
230  uint32_t mask;
232 
236 typedef struct {
237  union {
238  struct {
239  uint32_t baudrate;
240  uint32_t baudrate_fd;
249  };
250  struct {
253  };
254  };
255 
262  bool enable_tdc;
264  uint8_t filter_list_num;
273 } can_config_t;
274 
275 
276 #ifdef __cplusplus
277 extern "C" {
278 #endif
279 
280 
289 static inline void can_reset(CAN_Type *base, bool enable)
290 {
291  if (enable) {
293  } else {
295  }
296 }
297 
302 static inline void can_force_bus_off(CAN_Type *base)
303 {
305 }
306 
317 static inline void can_set_node_mode(CAN_Type *base, can_node_mode_t mode)
318 {
320  if (mode == can_mode_loopback_internal) {
321  cfg_stat |= CAN_CMD_STA_CMD_CTRL_LBMI_MASK;
322  } else if (mode == can_mode_loopback_external) {
323  cfg_stat |= CAN_CMD_STA_CMD_CTRL_LBME_MASK;
324  } else if (mode == can_mode_listen_only) {
325  cfg_stat |= CAN_CMD_STA_CMD_CTRL_LOM_MASK;
326  } else {
327  /* CAN normal work mode, no change needed here */
328  }
329  base->CMD_STA_CMD_CTRL = cfg_stat;
330 }
331 
339 static inline void can_enable_listen_only_mode(CAN_Type *base, bool enable)
340 {
341  if (enable) {
343  } else {
345  }
346 }
347 
355 static inline void can_enter_standby_mode(CAN_Type *base, bool enable)
356 {
357  if (enable) {
359  } else {
361  }
362 }
363 
370 static inline void can_disable_ptb_retransmission(CAN_Type *base, bool enable)
371 {
372  if (enable) {
374  } else {
376  }
377 }
378 
387 {
388  return ((base->CMD_STA_CMD_CTRL & CAN_CMD_STA_CMD_CTRL_TPSS_MASK) != 0);
389 }
390 
397 static inline void can_disable_stb_retransmission(CAN_Type *base, bool enable)
398 {
399  if (enable) {
401  } else {
403  }
404 }
405 
414 {
415  return ((base->CMD_STA_CMD_CTRL & CAN_CMD_STA_CMD_CTRL_TSSS_MASK) != 0);
416 }
417 
418 
426 static inline void can_select_tx_buffer(CAN_Type *base, bool select_secondary_buffer)
427 {
428  if (select_secondary_buffer) {
430  } else {
432  }
433 }
434 
441 {
443 }
444 
450 {
452 }
453 
458 static inline void can_start_message_transmit(CAN_Type *base)
459 {
461 }
462 
467 static inline void can_start_all_message_transmit(CAN_Type *base)
468 {
470 }
471 
476 static inline void can_abort_message_transmit(CAN_Type *base)
477 {
479 }
480 
485 static inline void can_switch_to_next_tx_buffer(CAN_Type *base)
486 {
488 }
489 
497 static inline void can_select_tx_buffer_priority_mode(CAN_Type *base, bool enable_priority_decision)
498 {
499  if (enable_priority_decision) {
501  } else {
503  }
504 }
505 
513 {
515 }
516 
523 {
524  return ((base->CMD_STA_CMD_CTRL & CAN_CMD_STA_CMD_CTRL_TPE_MASK) != 0U);
525 }
526 
533 {
535 }
536 
544 static inline bool can_is_in_bus_off_mode(CAN_Type *base)
545 {
546  return ((base->CMD_STA_CMD_CTRL & CAN_CMD_STA_CMD_CTRL_BUSOFF_MASK) != 0U);
547 }
548 
555 static inline void can_enable_self_ack(CAN_Type *base, bool enable)
556 {
557  if (enable) {
559  } else {
561  }
562 }
563 
571 static inline void can_set_receive_buffer_overflow_mode(CAN_Type *base, bool override_enable)
572 {
573  if (override_enable) {
575  } else {
577  }
578 }
579 
585 static inline bool can_is_receive_buffer_overflow(CAN_Type *base)
586 {
588 }
589 
595 static inline void can_release_receive_buffer(CAN_Type *base)
596 {
598 }
599 
605 static inline void can_allow_store_all_data_in_receive_buffer(CAN_Type *base, bool allow)
606 {
607  if (allow) {
609  } else {
611  }
612 }
613 
619 static inline uint8_t can_get_receive_buffer_status(CAN_Type *base)
620 {
622 }
623 
630 {
632 }
633 
634 
640 static inline void can_enable_can_fd_iso_mode(CAN_Type *base, bool enable)
641 {
642  if (enable) {
644  } else {
646  }
647 }
648 
654 static inline void can_enable_tx_rx_irq(CAN_Type *base, uint8_t mask)
655 {
656  base->RTIE |= mask;
657 }
658 
664 static inline void can_disable_tx_rx_irq(CAN_Type *base, uint8_t mask)
665 {
666  base->RTIE &= ~mask;
667 }
668 
674 static inline void can_clear_tx_rx_flags(CAN_Type *base, uint8_t flags)
675 {
676  base->RTIF = flags;
677 }
678 
685 static inline uint8_t can_get_tx_rx_flags(CAN_Type *base)
686 {
687  return base->RTIF;
688 }
689 
695 static inline void can_enable_error_irq(CAN_Type *base, uint8_t mask)
696 {
697  base->ERRINT |= mask;
698 }
699 
706 static inline void can_disable_error_irq(CAN_Type *base, uint8_t mask)
707 {
708  base->ERRINT &= ~mask;
709 }
710 
716 static inline uint8_t can_get_error_interrupt_flags(CAN_Type *base)
717 {
718  return (base->ERRINT & (uint8_t) ~(CAN_ERRINT_EPIE_MASK | CAN_ERRINT_ALIE_MASK | CAN_ERRINT_BEIE_MASK));
719 }
720 
726 static inline void can_clear_error_interrupt_flags(CAN_Type *base, uint8_t flags)
727 {
729  base->ERRINT |= flags;
730 }
731 
737 static inline uint8_t can_get_last_error_kind(CAN_Type *base)
738 {
739  return CAN_EALCAP_KOER_GET(base->EALCAP);
740 }
741 
748 {
749  return CAN_EALCAP_ALC_GET(base->EALCAP);
750 }
751 
759 static inline void can_set_transmitter_delay_compensation(CAN_Type *base, uint8_t sample_point, bool enable)
760 {
761 #if defined(CAN_SOC_CANFD_TDC_REQUIRE_STUFF_EXCEPTION_WORKAROUND) && (CAN_SOC_CANFD_TDC_REQUIRE_STUFF_EXCEPTION_WORKAROUND == 1)
762  (void) sample_point;
763  (void) enable;
764  base->TDC = CAN_TDC_TDCEN_SET((uint8_t) enable);
765 #else
766  base->TDC = CAN_TDC_SSPOFF_SET(sample_point) | CAN_TDC_TDCEN_SET((uint8_t) enable);
767 #endif
768 }
769 
776 static inline void can_set_warning_limits(CAN_Type *base, uint8_t almost_full_limit, uint8_t error_warning_limit)
777 {
778  base->LIMIT = CAN_LIMIT_AFWL_SET(almost_full_limit) | CAN_LIMIT_EWL_SET(error_warning_limit);
779 }
780 
786 static inline uint8_t can_get_receive_error_count(CAN_Type *base)
787 {
788  return base->RECNT;
789 }
790 
796 static inline uint8_t can_get_transmit_error_count(CAN_Type *base)
797 {
798  return base->TECNT;
799 }
800 
805 static inline void can_disable_time_stamping(CAN_Type *base)
806 {
808 }
809 
815 static inline bool can_is_time_stamping_enabled(CAN_Type *base)
816 {
817  return ((base->TIMECFG & CAN_TIMECFG_TIMEEN_MASK) != 0);
818 }
819 
826 static inline void can_set_time_stamping_mode(CAN_Type *base, uint8_t position, bool enable)
827 {
828  /* Note: TIMEPOS can only be changed if TIMEEN is 0, the TIMEEN bit must be cleared prior to he TIMEPOS change */
829  if (enable && can_is_time_stamping_enabled(base)) {
831  }
832  base->TIMECFG = CAN_TIMECFG_TIMEPOS_SET(position) | CAN_TIMECFG_TIMEEN_SET(enable);
833 }
834 
841 static inline void can_enable_filter(CAN_Type *base, uint32_t index)
842 {
843  base->ACF_EN |= (uint16_t) (1U << index);
844 }
845 
852 static inline void can_disable_filter(CAN_Type *base, uint32_t index)
853 {
854  base->ACF_EN &= (uint16_t) ~(1U << index);
855 }
856 
863 
871 hpm_stat_t can_init(CAN_Type *base, can_config_t *config, uint32_t src_clk_freq);
872 
877 void can_deinit(CAN_Type *base);
878 
879 
885 static inline void can_set_slow_speed_timing(CAN_Type *base, const can_bit_timing_param_t *param)
886 {
887  base->S_PRESC = CAN_S_PRESC_S_PRESC_SET(param->prescaler - 1U) | CAN_S_PRESC_S_SEG_1_SET(param->num_seg1 - 2U) |
889 }
890 
896 static inline void can_set_fast_speed_timing(CAN_Type *base, const can_bit_timing_param_t *param)
897 {
898  base->F_PRESC = CAN_F_PRESC_F_PRESC_SET(param->prescaler - 1U) | CAN_F_PRESC_F_SEG_1_SET(param->num_seg1 - 2U) |
900 }
901 
913  uint32_t src_clk_freq, uint32_t baudrate,
914  uint16_t samplepoint_min, uint16_t samplepoint_max);
915 
916 
927 hpm_stat_t can_calculate_bit_timing(uint32_t src_clk_freq, can_bit_timing_option_t option, uint32_t baudrate,
928  uint16_t samplepoint_min, uint16_t samplepoint_max,
929  can_bit_timing_param_t *timing_param);
930 
931 
932 
940 
948 
956 
964 
973 
981 
989 
1006 
1007 
1026 
1033 #ifdef __cplusplus
1034 }
1035 #endif
1036 
1037 
1038 #endif /* HPM_CAN_DRV_H */
#define CAN_S_PRESC_S_SEG_2_SET(x)
Definition: hpm_can_regs.h:846
#define CAN_CMD_STA_CMD_CTRL_RSTAT_GET(x)
Definition: hpm_can_regs.h:148
#define CAN_S_PRESC_S_PRESC_SET(x)
Definition: hpm_can_regs.h:824
#define CAN_CMD_STA_CMD_CTRL_TPA_MASK
Definition: hpm_can_regs.h:333
#define CAN_S_PRESC_S_SJW_SET(x)
Definition: hpm_can_regs.h:835
#define CAN_CMD_STA_CMD_CTRL_RREL_MASK
Definition: hpm_can_regs.h:120
#define CAN_TIMECFG_TIMEEN_MASK
Definition: hpm_can_regs.h:1031
#define CAN_F_PRESC_F_SEG_1_SET(x)
Definition: hpm_can_regs.h:902
#define CAN_TDC_TDCEN_SET(x)
Definition: hpm_can_regs.h:942
#define CAN_S_PRESC_S_SEG_1_SET(x)
Definition: hpm_can_regs.h:857
#define CAN_CMD_STA_CMD_CTRL_SACK_MASK
Definition: hpm_can_regs.h:81
#define CAN_EALCAP_ALC_GET(x)
Definition: hpm_can_regs.h:931
#define CAN_CMD_STA_CMD_CTRL_TPSS_MASK
Definition: hpm_can_regs.h:453
#define CAN_TIMECFG_TIMEEN_SET(x)
Definition: hpm_can_regs.h:1033
#define CAN_CMD_STA_CMD_CTRL_TSALL_MASK
Definition: hpm_can_regs.h:379
#define CAN_CMD_STA_CMD_CTRL_ROV_MASK
Definition: hpm_can_regs.h:107
#define CAN_LIMIT_AFWL_SET(x)
Definition: hpm_can_regs.h:801
#define CAN_CMD_STA_CMD_CTRL_TSSS_MASK
Definition: hpm_can_regs.h:465
#define CAN_F_PRESC_F_PRESC_SET(x)
Definition: hpm_can_regs.h:869
#define CAN_CMD_STA_CMD_CTRL_FD_ISO_MASK
Definition: hpm_can_regs.h:161
#define CAN_TIMECFG_TIMEPOS_SET(x)
Definition: hpm_can_regs.h:1021
#define CAN_CMD_STA_CMD_CTRL_STBY_MASK
Definition: hpm_can_regs.h:292
#define CAN_CMD_STA_CMD_CTRL_LBMI_MASK
Definition: hpm_can_regs.h:441
#define CAN_ERRINT_BEIE_MASK
Definition: hpm_can_regs.h:773
#define CAN_CMD_STA_CMD_CTRL_ROM_MASK
Definition: hpm_can_regs.h:94
#define CAN_CMD_STA_CMD_CTRL_TSSTAT_GET(x)
Definition: hpm_can_regs.h:245
#define CAN_CMD_STA_CMD_CTRL_BUSOFF_MASK
Definition: hpm_can_regs.h:501
#define CAN_ERRINT_EPIE_MASK
Definition: hpm_can_regs.h:732
#define CAN_F_PRESC_F_SEG_2_SET(x)
Definition: hpm_can_regs.h:891
#define CAN_CMD_STA_CMD_CTRL_TSMODE_MASK
Definition: hpm_can_regs.h:202
#define CAN_LIMIT_EWL_SET(x)
Definition: hpm_can_regs.h:812
#define CAN_CMD_STA_CMD_CTRL_TPE_MASK
Definition: hpm_can_regs.h:313
#define CAN_EALCAP_KOER_GET(x)
Definition: hpm_can_regs.h:922
#define CAN_CMD_STA_CMD_CTRL_TSONE_MASK
Definition: hpm_can_regs.h:356
#define CAN_CMD_STA_CMD_CTRL_LBME_MASK
Definition: hpm_can_regs.h:430
#define CAN_CMD_STA_CMD_CTRL_TSNEXT_MASK
Definition: hpm_can_regs.h:184
#define CAN_CMD_STA_CMD_CTRL_LOM_MASK
Definition: hpm_can_regs.h:275
#define CAN_TDC_SSPOFF_SET(x)
Definition: hpm_can_regs.h:954
#define CAN_F_PRESC_F_SJW_SET(x)
Definition: hpm_can_regs.h:880
#define CAN_CMD_STA_CMD_CTRL_RBALL_MASK
Definition: hpm_can_regs.h:132
#define CAN_CMD_STA_CMD_CTRL_TSA_MASK
Definition: hpm_can_regs.h:401
#define CAN_ERRINT_ALIE_MASK
Definition: hpm_can_regs.h:753
#define CAN_CMD_STA_CMD_CTRL_TBSEL_MASK
Definition: hpm_can_regs.h:258
#define CAN_CMD_STA_CMD_CTRL_RESET_MASK
Definition: hpm_can_regs.h:418
static void can_set_node_mode(CAN_Type *base, can_node_mode_t mode)
Set CAN mode.
Definition: hpm_can_drv.h:317
hpm_stat_t can_read_received_message(CAN_Type *base, can_receive_buf_t *message)
Read Received CAN message.
Definition: hpm_can_drv.c:577
static void can_enable_listen_only_mode(CAN_Type *base, bool enable)
Enable CAN listen-only mode.
Definition: hpm_can_drv.h:339
static void can_force_bus_off(CAN_Type *base)
Force CAN controller to Bus-off mode.
Definition: hpm_can_drv.h:302
hpm_stat_t can_send_message_blocking(CAN_Type *base, const can_transmit_buf_t *message)
Send CAN message using blocking transfer.
Definition: hpm_can_drv.c:395
static void can_disable_filter(CAN_Type *base, uint32_t index)
Disable a specified CAN filter.
Definition: hpm_can_drv.h:852
hpm_stat_t can_receive_message_blocking(CAN_Type *base, can_receive_buf_t *message)
Receive CAN message using blocking transfer.
Definition: hpm_can_drv.c:517
hpm_stat_t can_get_timestamp_from_received_message(CAN_Type *base, const can_receive_buf_t *message, can_timestamp_value_t *timestamp)
Get the timestamp from the received message.
Definition: hpm_can_drv.c:821
static void can_release_receive_buffer(CAN_Type *base)
Release CAN receive buffer.
Definition: hpm_can_drv.h:595
static bool can_is_in_bus_off_mode(CAN_Type *base)
Check whether the CAN is in BUS off mode.
Definition: hpm_can_drv.h:544
static void can_start_message_transmit(CAN_Type *base)
Start CAN message transmit.
Definition: hpm_can_drv.h:458
hpm_stat_t can_get_timestamp_for_transmitted_message(CAN_Type *base, can_timestamp_value_t *timestamp)
Get the timestamp for the transmitted message.
Definition: hpm_can_drv.c:803
enum _can_bit_timing_option can_bit_timing_option_t
CAN bit timing options.
static void can_set_warning_limits(CAN_Type *base, uint8_t almost_full_limit, uint8_t error_warning_limit)
Set CAN warning limits.
Definition: hpm_can_drv.h:776
#define CAN_RXBUF_IS_EMPTY
CAN Receive Buffer States.
Definition: hpm_can_drv.h:69
static void can_start_all_message_transmit(CAN_Type *base)
Start CAN all messages transmit.
Definition: hpm_can_drv.h:467
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.
Definition: hpm_can_drv.c:172
static void can_allow_store_all_data_in_receive_buffer(CAN_Type *base, bool allow)
Allow can store all date in receive buffer.
Definition: hpm_can_drv.h:605
hpm_stat_t can_send_message_nonblocking(CAN_Type *base, const can_transmit_buf_t *message)
Send CAN message using non-blocking transfer.
Definition: hpm_can_drv.c:467
static void can_disable_ptb_retransmission(CAN_Type *base, bool enable)
Disable the re-transmission for the primary transmission buffer.
Definition: hpm_can_drv.h:370
static void can_set_slow_speed_timing(CAN_Type *base, const can_bit_timing_param_t *param)
Configure the Slow Speed Bit timing using low-level interface.
Definition: hpm_can_drv.h:885
hpm_stat_t can_init(CAN_Type *base, can_config_t *config, uint32_t src_clk_freq)
Initialize the CAN controller.
Definition: hpm_can_drv.c:677
static void can_clear_tx_rx_flags(CAN_Type *base, uint8_t flags)
Clear CAN TX/RX flags.
Definition: hpm_can_drv.h:674
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.
Definition: hpm_can_drv.c:438
static void can_enter_standby_mode(CAN_Type *base, bool enable)
Enter CAN standby mode.
Definition: hpm_can_drv.h:355
enum _can_mode can_node_mode_t
CAN loopback types.
static uint8_t can_get_tx_rx_flags(CAN_Type *base)
Get CAN TX/RX flags.
Definition: hpm_can_drv.h:685
static uint8_t can_get_secondary_transmit_buffer_status(CAN_Type *base)
Get CAN secondary transmit buffer status.
Definition: hpm_can_drv.h:512
void can_deinit(CAN_Type *base)
De-initialize the CAN controller.
Definition: hpm_can_drv.c:839
static uint8_t can_get_transmit_error_count(CAN_Type *base)
Get CAN transmit error count.
Definition: hpm_can_drv.h:796
static void can_disable_error_irq(CAN_Type *base, uint8_t mask)
Disable CAN error interrupt.
Definition: hpm_can_drv.h:706
static void can_set_time_stamping_mode(CAN_Type *base, uint8_t position, bool enable)
Set the time-stamping mode for CAN controller.
Definition: hpm_can_drv.h:826
static uint8_t can_get_receive_buffer_status(CAN_Type *base)
Get CAN receive buffer status.
Definition: hpm_can_drv.h:619
static void can_start_high_priority_message_transmit(CAN_Type *base)
Start CAN high priority message transmit.
Definition: hpm_can_drv.h:440
static void can_enable_self_ack(CAN_Type *base, bool enable)
Enable can self ack.
Definition: hpm_can_drv.h:555
static uint8_t can_get_receive_error_count(CAN_Type *base)
Get CAN receive error count.
Definition: hpm_can_drv.h:786
static void can_enable_can_fd_iso_mode(CAN_Type *base, bool enable)
Enable CAN FD ISO mode.
Definition: hpm_can_drv.h:640
static uint8_t can_get_last_error_kind(CAN_Type *base)
Get last CAN error kind.
Definition: hpm_can_drv.h:737
static void can_set_fast_speed_timing(CAN_Type *base, const can_bit_timing_param_t *param)
Configure the Fast Speed Bit timing using low-level interface.
Definition: hpm_can_drv.h:896
static void can_enable_error_irq(CAN_Type *base, uint8_t mask)
Enable CAN error interrupt.
Definition: hpm_can_drv.h:695
static void can_enable_filter(CAN_Type *base, uint32_t index)
Enable a specified CAN filter.
Definition: hpm_can_drv.h:841
static bool can_is_stb_retransmission_disabled(CAN_Type *base)
Check whether re-transmission is disabled for STB or not.
Definition: hpm_can_drv.h:413
static void can_switch_to_next_tx_buffer(CAN_Type *base)
Switch to next CAN tx buffer.
Definition: hpm_can_drv.h:485
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.
Definition: hpm_can_drv.c:493
static uint8_t can_get_last_arbitration_lost_position(CAN_Type *base)
Get CAN last arbitrary lost position.
Definition: hpm_can_drv.h:747
static void can_disable_time_stamping(CAN_Type *base)
Disable time-stamping feature.
Definition: hpm_can_drv.h:805
static bool can_is_time_stamping_enabled(CAN_Type *base)
Determine whether time-stamping is enabled or not.
Definition: hpm_can_drv.h:815
static void can_abort_high_priority_message_transmit(CAN_Type *base)
Abort CAN high priority message transmit.
Definition: hpm_can_drv.h:449
static void can_reset(CAN_Type *base, bool enable)
Reset CAN controller.
Definition: hpm_can_drv.h:289
static void can_set_transmitter_delay_compensation(CAN_Type *base, uint8_t sample_point, bool enable)
Set CAN transmitter delay compensation.
Definition: hpm_can_drv.h:759
hpm_stat_t can_get_default_config(can_config_t *config)
Get default CAN configuration parameters.
Definition: hpm_can_drv.c:637
static void can_select_tx_buffer(CAN_Type *base, bool select_secondary_buffer)
Select CAN TX buffer.
Definition: hpm_can_drv.h:426
static uint8_t can_get_error_interrupt_flags(CAN_Type *base)
Get CAN error interrupt flags.
Definition: hpm_can_drv.h:716
static bool can_is_receive_buffer_overflow(CAN_Type *base)
Check whether CAN receive buffer is overflow.
Definition: hpm_can_drv.h:585
static void can_enable_tx_rx_irq(CAN_Type *base, uint8_t mask)
Enable CAN TX/RX interrupt.
Definition: hpm_can_drv.h:654
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.
Definition: hpm_can_drv.c:272
static void can_select_tx_buffer_priority_mode(CAN_Type *base, bool enable_priority_decision)
Select CAN tx buffer priority mode.
Definition: hpm_can_drv.h:497
#define CAN_STB_IS_FULL
Definition: hpm_can_drv.h:64
static void can_clear_error_interrupt_flags(CAN_Type *base, uint8_t flags)
Get CAN clear interrupt flags.
Definition: hpm_can_drv.h:726
static bool can_is_ptb_retransmission_disabled(CAN_Type *base)
Check whether re-transmission is disabled for PTB or not.
Definition: hpm_can_drv.h:386
hpm_stat_t can_set_filter(CAN_Type *base, const can_filter_config_t *config)
Configure the acceptable filter.
Definition: hpm_can_drv.c:303
static bool can_is_data_available_in_receive_buffer(CAN_Type *base)
Check whether there are data available in receive buffer.
Definition: hpm_can_drv.h:629
static void can_disable_tx_rx_irq(CAN_Type *base, uint8_t mask)
Disable CAN TX/RX interrupt.
Definition: hpm_can_drv.h:664
static void can_disable_stb_retransmission(CAN_Type *base, bool enable)
Disable the re-transmission for the secondary transmission buffer.
Definition: hpm_can_drv.h:397
static void can_abort_message_transmit(CAN_Type *base)
Abort CAN message transmit.
Definition: hpm_can_drv.h:476
union _can_rx_buf can_receive_buf_t
CAN receive buffer data structure.
static bool can_is_primary_transmit_buffer_full(CAN_Type *base)
Check whether the primary transmit buffer is full.
Definition: hpm_can_drv.h:522
static bool can_is_secondary_transmit_buffer_full(CAN_Type *base)
Check whether the secondary transmit buffer is full.
Definition: hpm_can_drv.h:532
union _can_tx_buf can_transmit_buf_t
CAN transmit buffer data structure.
static void can_set_receive_buffer_overflow_mode(CAN_Type *base, bool override_enable)
Set CAN receive buffer overflow mode.
Definition: hpm_can_drv.h:571
enum _can_filter_id_mode can_filter_id_mode_t
CAN acceptance filter modes.
@ status_can_crc_error
Definition: hpm_can_drv.h:37
@ status_can_form_error
Definition: hpm_can_drv.h:34
@ status_can_filter_index_invalid
Definition: hpm_can_drv.h:40
@ status_can_ack_error
Definition: hpm_can_drv.h:36
@ status_can_stuff_error
Definition: hpm_can_drv.h:35
@ status_can_tx_fifo_full
Definition: hpm_can_drv.h:39
@ status_can_invalid_bit_timing
Definition: hpm_can_drv.h:42
@ status_can_filter_num_invalid
Definition: hpm_can_drv.h:41
@ status_can_bit_error
Definition: hpm_can_drv.h:33
@ status_can_timestamping_disabled
Definition: hpm_can_drv.h:43
@ status_can_other_error
Definition: hpm_can_drv.h:38
@ can_payload_size_32
Definition: hpm_can_drv.h:148
@ can_payload_size_8
Definition: hpm_can_drv.h:143
@ can_payload_size_4
Definition: hpm_can_drv.h:139
@ can_payload_size_48
Definition: hpm_can_drv.h:149
@ can_payload_size_64
Definition: hpm_can_drv.h:150
@ can_payload_size_2
Definition: hpm_can_drv.h:137
@ can_payload_size_20
Definition: hpm_can_drv.h:146
@ can_payload_size_5
Definition: hpm_can_drv.h:140
@ can_payload_size_24
Definition: hpm_can_drv.h:147
@ can_payload_size_1
Definition: hpm_can_drv.h:136
@ can_payload_size_16
Definition: hpm_can_drv.h:145
@ can_payload_size_6
Definition: hpm_can_drv.h:141
@ can_payload_size_7
Definition: hpm_can_drv.h:142
@ can_payload_size_3
Definition: hpm_can_drv.h:138
@ can_payload_size_max
Definition: hpm_can_drv.h:151
@ can_payload_size_0
Definition: hpm_can_drv.h:135
@ can_payload_size_12
Definition: hpm_can_drv.h:144
uint32_t hpm_stat_t
Definition: hpm_common.h:135
#define MAKE_STATUS(group, code)
Definition: hpm_common.h:144
#define IS_HPM_BITMASK_SET(val, mask)
Definition: hpm_common.h:61
@ status_group_can
Definition: hpm_common.h:166
@ can_filter_id_mode_standard_frames
Definition: hpm_can_drv.h:218
@ can_mode_loopback_external
Definition: hpm_can_drv.h:118
@ can_mode_normal
Definition: hpm_can_drv.h:116
@ can_bit_timing_canfd_nominal
Definition: hpm_can_drv.h:127
@ can_mode_listen_only
Definition: hpm_can_drv.h:119
@ can_filter_id_mode_both_frames
Definition: hpm_can_drv.h:217
@ can_mode_loopback_internal
Definition: hpm_can_drv.h:117
@ can_filter_id_mode_extended_frames
Definition: hpm_can_drv.h:219
@ can_bit_timing_canfd_data
Definition: hpm_can_drv.h:128
@ can_bit_timing_can2_0
Definition: hpm_can_drv.h:126
Definition: hpm_can_regs.h:12
__RW uint8_t TIMECFG
Definition: hpm_can_regs.h:28
__RW uint32_t S_PRESC
Definition: hpm_can_regs.h:21
__RW uint32_t F_PRESC
Definition: hpm_can_regs.h:22
__R uint8_t EALCAP
Definition: hpm_can_regs.h:23
__RW uint8_t LIMIT
Definition: hpm_can_regs.h:20
__RW uint32_t CMD_STA_CMD_CTRL
Definition: hpm_can_regs.h:16
__R uint8_t TECNT
Definition: hpm_can_regs.h:26
__RW uint16_t ACF_EN
Definition: hpm_can_regs.h:29
__W uint8_t RTIF
Definition: hpm_can_regs.h:18
__R uint8_t RECNT
Definition: hpm_can_regs.h:25
__RW uint8_t RTIE
Definition: hpm_can_regs.h:17
__RW uint8_t TDC
Definition: hpm_can_regs.h:24
__RW uint8_t ERRINT
Definition: hpm_can_regs.h:19
CAN Bit timing parameters.
Definition: hpm_can_drv.h:157
uint16_t prescaler
Definition: hpm_can_drv.h:158
uint16_t num_sjw
Definition: hpm_can_drv.h:161
uint16_t num_seg2
Definition: hpm_can_drv.h:160
uint16_t num_seg1
Definition: hpm_can_drv.h:159
CAN configuration.
Definition: hpm_can_drv.h:236
bool enable_tdc
Definition: hpm_can_drv.h:262
uint8_t irq_error_enable_mask
Definition: hpm_can_drv.h:268
bool enable_canfd
Definition: hpm_can_drv.h:258
uint32_t baudrate
Definition: hpm_can_drv.h:239
can_filter_config_t * filter_list
Definition: hpm_can_drv.h:265
uint16_t can20_samplepoint_max
Definition: hpm_can_drv.h:244
uint8_t irq_txrx_enable_mask
Definition: hpm_can_drv.h:267
bool enable_can_fd_iso_mode
Definition: hpm_can_drv.h:270
can_bit_timing_param_t can_timing
Definition: hpm_can_drv.h:251
bool enable_self_ack
Definition: hpm_can_drv.h:259
uint16_t canfd_samplepoint_min
Definition: hpm_can_drv.h:246
bool disable_ptb_retransmission
Definition: hpm_can_drv.h:260
uint32_t baudrate_fd
Definition: hpm_can_drv.h:240
bool use_lowlevel_timing_setting
Definition: hpm_can_drv.h:257
can_node_mode_t mode
Definition: hpm_can_drv.h:256
uint16_t can20_samplepoint_min
Definition: hpm_can_drv.h:242
bool enable_tx_buffer_priority_mode
Definition: hpm_can_drv.h:269
can_bit_timing_param_t canfd_timing
Definition: hpm_can_drv.h:252
uint16_t canfd_samplepoint_max
Definition: hpm_can_drv.h:248
bool disable_stb_retransmission
Definition: hpm_can_drv.h:261
bool enable_time_stamping
Definition: hpm_can_drv.h:272
uint8_t time_stamping_position
Definition: hpm_can_drv.h:271
uint8_t filter_list_num
Definition: hpm_can_drv.h:264
CAN acceptance filter configuration.
Definition: hpm_can_drv.h:225
bool enable
Definition: hpm_can_drv.h:228
can_filter_id_mode_t id_mode
Definition: hpm_can_drv.h:227
uint16_t index
Definition: hpm_can_drv.h:226
uint32_t code
Definition: hpm_can_drv.h:229
uint32_t mask
Definition: hpm_can_drv.h:230
Definition: hpm_can_drv.h:108
uint32_t nano_sec
Definition: hpm_can_drv.h:109
uint32_t second
Definition: hpm_can_drv.h:110