S32 SDK
flexcan_driver.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013 - 2014, Freescale Semiconductor, Inc.
3  * Copyright 2016-2017 NXP
4  * All rights reserved.
5  *
6  * THIS SOFTWARE IS PROVIDED BY NXP "AS IS" AND ANY EXPRESSED OR
7  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
8  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
9  * IN NO EVENT SHALL NXP OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
10  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
11  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
12  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
13  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
14  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
15  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
16  * THE POSSIBILITY OF SUCH DAMAGE.
17  */
18 
19 #ifndef FLEXCAN_DRIVER_H
20 #define FLEXCAN_DRIVER_H
21 
22 #include "device_registers.h"
23 #include "osif.h"
24 #if FEATURE_CAN_HAS_DMA_ENABLE
25 #include "edma_driver.h"
26 #endif
27 
35 /*******************************************************************************
36  * Definitions
37  ******************************************************************************/
38 
42 typedef enum {
46 
50 typedef enum {
54 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
55  FLEXCAN_EVENT_WAKEUP_TIMEOUT,
56  FLEXCAN_EVENT_WAKEUP_MATCH
57 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
59 
60 
64 typedef enum {
69 
73 typedef enum {
77 
81 typedef struct {
82  uint32_t cs;
83  uint32_t msgId;
84  uint8_t data[64];
85  uint8_t dataLen;
87 
91 typedef struct {
93  semaphore_t mbSema;
95  bool isBlocking;
96  bool isRemote;
98 
107 typedef struct FlexCANState {
109  void (*callback)(uint8_t instance, flexcan_event_type_t eventType,
110  struct FlexCANState * state);
112 #if FEATURE_CAN_HAS_DMA_ENABLE
113  uint8_t rxFifoDMAChannel;
114 #endif
117 
121 typedef struct {
123  uint32_t data_length;
124  bool fd_enable;
125  uint8_t fd_padding;
127  bool enable_brs;
128  bool is_remote;
130 
134 typedef enum {
152 
156 typedef enum {
160 
164 typedef enum {
171 
175 typedef struct {
178  uint32_t *idFilter;
180 
184 typedef enum {
191 
195 typedef enum {
201 
205 typedef struct {
206  uint32_t propSeg;
207  uint32_t phaseSeg1;
208  uint32_t phaseSeg2;
209  uint32_t preDivider;
210  uint32_t rJumpwidth;
212 
217 typedef struct {
218  uint32_t max_num_mb;
227  bool fd_enable;
228 #if FEATURE_CAN_HAS_PE_CLKSRC_SELECT
229  flexcan_clk_source_t pe_clock;
230 #endif
236 
237 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
238 
240 typedef struct {
241  bool extendedId;
242  bool remoteFrame;
243  uint32_t id;
244 } flexcan_pn_id_filter_t;
245 
247 typedef struct {
248  uint8_t dlcLow;
249  uint8_t dlcHigh;
250  uint8_t payload1[8U];
252  uint8_t payload2[8U];
253 } flexcan_pn_payload_filter_t;
254 
256 typedef enum {
257  FLEXCAN_FILTER_ID,
258  FLEXCAN_FILTER_ID_PAYLOAD,
259  FLEXCAN_FILTER_ID_NTIMES,
260  FLEXCAN_FILTER_ID_PAYLOAD_NTIMES
261 } flexcan_pn_filter_combination_t;
262 
264 typedef enum {
265  FLEXCAN_FILTER_MATCH_EXACT,
266  FLEXCAN_FILTER_MATCH_GEQ,
267  FLEXCAN_FILTER_MATCH_LEQ,
268  FLEXCAN_FILTER_MATCH_RANGE
270 } flexcan_pn_filter_selection_t;
271 
275 typedef struct {
276  bool wakeUpTimeout;
277  bool wakeUpMatch;
278  uint16_t numMatches;
279  uint16_t matchTimeout;
280  flexcan_pn_filter_combination_t filterComb;
281  flexcan_pn_id_filter_t idFilter1;
282  flexcan_pn_id_filter_t idFilter2;
283  flexcan_pn_filter_selection_t idFilterType;
284  flexcan_pn_filter_selection_t payloadFilterType;
285  flexcan_pn_payload_filter_t payloadFilter;
286 } flexcan_pn_config_t;
287 
288 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
289 
293 typedef void (*flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType,
294  flexcan_state_t *flexcanState);
295 
296 /*******************************************************************************
297  * API
298  ******************************************************************************/
299 
300 #if defined(__cplusplus)
301 extern "C" {
302 #endif
303 
315 void FLEXCAN_DRV_SetBitrate(uint8_t instance, const flexcan_time_segment_t *bitrate);
316 
323 void FLEXCAN_DRV_SetBitrateCbt(uint8_t instance, const flexcan_time_segment_t *bitrate);
324 
331 void FLEXCAN_DRV_GetBitrate(uint8_t instance, flexcan_time_segment_t *bitrate);
332 
339 void FLEXCAN_DRV_GetBitrateFD(uint8_t instance, flexcan_time_segment_t *bitrate);
340 
354 void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type);
355 
364  uint8_t instance,
366  uint32_t mask);
367 
376  uint8_t instance,
378  uint32_t mask);
379 
388  uint8_t instance,
390  uint32_t mask);
391 
400  uint8_t instance,
402  uint32_t mask);
403 
416  uint8_t instance,
418  uint8_t mb_idx,
419  uint32_t mask);
420 
443 
456  uint8_t instance,
457  flexcan_state_t *state,
458  const flexcan_user_config_t *data);
459 
467 status_t FLEXCAN_DRV_Deinit(uint8_t instance);
468 
479 void FLEXCAN_DRV_SetTDCOffset(uint8_t instance, bool enable, uint8_t offset);
480 
489 uint8_t FLEXCAN_DRV_GetTDCValue(uint8_t instance);
490 
499 bool FLEXCAN_DRV_GetTDCFail(uint8_t instance);
500 
506 void FLEXCAN_DRV_ClearTDCFail(uint8_t instance);
507 
526  uint8_t instance,
527  uint8_t mb_idx,
528  const flexcan_data_info_t *tx_info,
529  uint32_t msg_id);
530 
549  uint8_t instance,
550  uint8_t mb_idx,
551  const flexcan_data_info_t *tx_info,
552  uint32_t msg_id,
553  const uint8_t *mb_data,
554  uint32_t timeout_ms);
555 
573  uint8_t instance,
574  uint8_t mb_idx,
575  const flexcan_data_info_t *tx_info,
576  uint32_t msg_id,
577  const uint8_t *mb_data);
578 
597  uint8_t instance,
598  uint8_t mb_idx,
599  const flexcan_data_info_t *rx_info,
600  uint32_t msg_id);
601 
611  uint8_t instance,
613  const flexcan_id_table_t *id_filter_table);
614 
631  uint8_t instance,
632  uint8_t mb_idx,
633  flexcan_msgbuff_t *data,
634  uint32_t timeout_ms);
635 
651  uint8_t instance,
652  uint8_t mb_idx,
653  flexcan_msgbuff_t *data);
654 
670  uint8_t instance,
671  flexcan_msgbuff_t *data,
672  uint32_t timeout_ms);
673 
688  uint8_t instance,
689  flexcan_msgbuff_t *data);
690 
706 status_t FLEXCAN_DRV_AbortTransfer(uint8_t instance, uint8_t mb_idx);
707 
719 status_t FLEXCAN_DRV_GetTransferStatus(uint8_t instance, uint8_t mb_idx);
720 
735 void FLEXCAN_DRV_InstallEventCallback(uint8_t instance, flexcan_callback_t callback, void *callbackParam);
736 
739 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
740 
753 void FLEXCAN_DRV_ConfigPN(uint8_t instance, bool enable, const flexcan_pn_config_t *pnConfig);
754 
762 void FLEXCAN_DRV_GetWMB(uint8_t instance, uint8_t wmbIndex, flexcan_msgbuff_t *wmb);
763 
766 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
767 
768 #if FEATURE_CAN_HAS_SELF_WAKE_UP
769 
784 status_t FLEXCAN_DRV_ConfigSelfWakeUp(uint8_t instance, bool enable, bool lowPassFilterEn);
785 
788 #endif /* FEATURE_CAN_HAS_SELF_WAKE_UP */
789 
790 #ifdef __cplusplus
791 }
792 #endif
793 
796 #endif /* FLEXCAN_DRIVER_H */
797 
798 /*******************************************************************************
799  * EOF
800  ******************************************************************************/
status_t FLEXCAN_DRV_Receive(uint8_t instance, uint8_t mb_idx, flexcan_msgbuff_t *data)
Receives a CAN frame using the specified message buffer.
void FLEXCAN_DRV_GetBitrateFD(uint8_t instance, flexcan_time_segment_t *bitrate)
Gets the FlexCAN bit rate for the data phase of FD frames (BRS enabled).
status_t FLEXCAN_DRV_Deinit(uint8_t instance)
Shuts down a FlexCAN instance.
Internal driver state information.
flexcan_msgbuff_id_type_t
FlexCAN Message Buffer ID type Implements : flexcan_msgbuff_id_type_t_Class.
flexcan_operation_modes_t flexcanMode
flexcan_fd_payload_size_t payload
status_t FLEXCAN_DRV_ConfigTxMb(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id)
FlexCAN transmit message buffer field configuration.
void FLEXCAN_DRV_GetDefaultConfig(flexcan_user_config_t *config)
Gets the default configuration structure.
flexcan_time_segment_t bitrate
void * callbackParam
flexcan_rx_mask_type_t
FlexCAN Rx mask type. Implements : flexcan_rx_mask_type_t_Class.
flexcan_rx_fifo_id_filter_num_t num_id_filters
void FLEXCAN_DRV_SetTDCOffset(uint8_t instance, bool enable, uint8_t offset)
Enables/Disables the Transceiver Delay Compensation feature and sets the Transceiver Delay Compensati...
status_t FLEXCAN_DRV_RxFifo(uint8_t instance, flexcan_msgbuff_t *data)
Receives a CAN frame using the message FIFO.
flexcan_rx_fifo_id_filter_num_t
FlexCAN Rx FIFO filters number Implements : flexcan_rx_fifo_id_filter_num_t_Class.
void FLEXCAN_DRV_ConfigRxFifo(uint8_t instance, flexcan_rx_fifo_id_element_format_t id_format, const flexcan_id_table_t *id_filter_table)
FlexCAN Rx FIFO field configuration.
status_t FLEXCAN_DRV_GetTransferStatus(uint8_t instance, uint8_t mb_idx)
Returns whether the previous FlexCAN transfer has finished.
flexcan_msgbuff_id_type_t msg_id_type
flexcan_event_type_t
The type of the event which occurred when the callback was invoked. Implements : flexcan_event_type_t...
void FLEXCAN_DRV_InstallEventCallback(uint8_t instance, flexcan_callback_t callback, void *callbackParam)
Installs a callback function for the IRQ handler.
void FLEXCAN_DRV_ClearTDCFail(uint8_t instance)
Clears the TDC Fail flag.
struct FlexCANState flexcan_state_t
Internal driver state information.
flexcan_rxfifo_transfer_type_t transferType
status_t FLEXCAN_DRV_AbortTransfer(uint8_t instance, uint8_t mb_idx)
Ends a non-blocking FlexCAN transfer early.
void FLEXCAN_DRV_SetRxMb15Mask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN Rx MB 15 mask (standard or extended).
void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type)
Sets the Rx masking type.
FlexCAN bitrate related structures Implements : flexcan_time_segment_t_Class.
status_t FLEXCAN_DRV_ConfigRxMb(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *rx_info, uint32_t msg_id)
FlexCAN receive message buffer field configuration.
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
Definition: status.h:44
void(* flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType, flexcan_state_t *flexcanState)
FlexCAN Driver callback function type Implements : flexcan_callback_t_Class.
flexcan_clk_source_t
bool FLEXCAN_DRV_GetTDCFail(uint8_t instance)
Gets the value of the TDC Fail flag.
FlexCAN message buffer structure Implements : flexcan_msgbuff_t_Class.
flexcan_rx_fifo_id_element_format_t
ID formats for Rx FIFO Implements : flexcan_rx_fifo_id_element_format_t_Class.
status_t FLEXCAN_DRV_SendBlocking(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id, const uint8_t *mb_data, uint32_t timeout_ms)
Sends a CAN frame using the specified message buffer, in a blocking manner.
flexcan_rxfifo_transfer_type_t
The type of the RxFIFO transfer (interrupts/DMA). Implements : flexcan_rxfifo_transfer_type_t_Class.
FlexCAN Rx FIFO ID filter table structure Implements : flexcan_id_table_t_Class.
status_t FLEXCAN_DRV_RxFifoBlocking(uint8_t instance, flexcan_msgbuff_t *data, uint32_t timeout_ms)
Receives a CAN frame using the message FIFO, in a blocking manner.
void(* callback)(uint8_t instance, flexcan_event_type_t eventType, struct FlexCANState *state)
flexcan_time_segment_t bitrate_cbt
flexcan_rxfifo_transfer_type_t transfer_type
flexcan_mb_state_t state
uint8_t FLEXCAN_DRV_GetTDCValue(uint8_t instance)
Gets the value of the Transceiver Delay Compensation.
void FLEXCAN_DRV_SetRxFifoGlobalMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN Rx FIFO global mask (standard or extended).
Information needed for internal handling of a given MB. Implements : flexcan_mb_handle_t_Class.
status_t FLEXCAN_DRV_ReceiveBlocking(uint8_t instance, uint8_t mb_idx, flexcan_msgbuff_t *data, uint32_t timeout_ms)
Receives a CAN frame using the specified message buffer, in a blocking manner.
void FLEXCAN_DRV_SetBitrateCbt(uint8_t instance, const flexcan_time_segment_t *bitrate)
Sets the FlexCAN bit rate for the data phase of FD frames (BRS enabled).
flexcan_msgbuff_t * mb_message
void FLEXCAN_DRV_SetRxMbGlobalMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN Rx MB global mask (standard or extended).
FlexCAN data info from user Implements : flexcan_data_info_t_Class.
status_t FLEXCAN_DRV_Init(uint8_t instance, flexcan_state_t *state, const flexcan_user_config_t *data)
Initializes the FlexCAN peripheral.
flexcan_fd_payload_size_t
FlexCAN payload sizes Implements : flexcan_fd_payload_size_t_Class.
flexcan_mb_state_t
The state of a given MB (idle/Rx busy/Tx busy). Implements : flexcan_mb_state_t_Class.
status_t FLEXCAN_DRV_Send(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id, const uint8_t *mb_data)
Sends a CAN frame using the specified message buffer.
status_t FLEXCAN_DRV_SetRxIndividualMask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint8_t mb_idx, uint32_t mask)
Sets the FlexCAN Rx individual mask (standard or extended).
volatile flexcan_mb_handle_t mbs[FEATURE_CAN_MAX_MB_NUM]
void FLEXCAN_DRV_SetBitrate(uint8_t instance, const flexcan_time_segment_t *bitrate)
Sets the FlexCAN bit rate for standard frames or the arbitration phase of FD frames.
FlexCAN configuration.
void FLEXCAN_DRV_SetRxMb14Mask(uint8_t instance, flexcan_msgbuff_id_type_t id_type, uint32_t mask)
Sets the FlexCAN Rx MB 14 mask (standard or extended).
flexcan_operation_modes_t
FlexCAN operation modes Implements : flexcan_operation_modes_t_Class.
void FLEXCAN_DRV_GetBitrate(uint8_t instance, flexcan_time_segment_t *bitrate)
Gets the FlexCAN bit rate for standard frames or the arbitration phase of FD frames.
#define FEATURE_CAN_MAX_MB_NUM