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 {
44 #if FEATURE_CAN_HAS_DMA_ENABLE
46 #endif
48 
52 typedef enum {
58 #if FEATURE_CAN_HAS_WAKE_UP_IRQ
62 #endif /* FEATURE_CAN_HAS_WAKE_UP_IRQ */
65 
69 typedef enum {
74 
78 typedef enum {
82 
83 #if FEATURE_CAN_HAS_PE_CLKSRC_SELECT
84 
87 typedef enum {
91 #endif
92 
96 typedef struct {
97  uint32_t cs;
98  uint32_t msgId;
99  uint8_t data[64];
100  uint8_t dataLen;
102 
106 typedef struct {
108  semaphore_t mbSema;
110  bool isBlocking;
111  bool isRemote;
113 
122 typedef struct FlexCANState {
125  void (*callback)(uint8_t instance,
126  flexcan_event_type_t eventType,
127  uint32_t buffIdx,
128  struct FlexCANState *driverState);
132  void (*error_callback)(uint8_t instance,
133  flexcan_event_type_t eventType,
134  struct FlexCANState *driverState);
139 #if FEATURE_CAN_HAS_DMA_ENABLE
142 #endif
145 
149 typedef struct {
151  uint32_t data_length;
152 #if FEATURE_CAN_HAS_FD
153  bool fd_enable;
154  uint8_t fd_padding;
156  bool enable_brs;
157 #endif
158  bool is_remote;
160 
164 typedef enum {
182 
186 typedef enum {
190 
194 typedef enum {
201 
205 typedef struct {
208  uint32_t id;
210 
214 typedef enum {
221 
222 #if FEATURE_CAN_HAS_FD
223 
226 typedef enum {
232 #endif
233 
237 typedef struct {
238  uint32_t propSeg;
239  uint32_t phaseSeg1;
240  uint32_t phaseSeg2;
241  uint32_t preDivider;
242  uint32_t rJumpwidth;
244 
249 typedef struct {
250  uint32_t max_num_mb;
258 #if FEATURE_CAN_HAS_FD
260  bool fd_enable;
261 #endif
262 #if FEATURE_CAN_HAS_PE_CLKSRC_SELECT
264 #endif
266 #if FEATURE_CAN_HAS_FD
268 #endif
270 #if FEATURE_CAN_HAS_DMA_ENABLE
272 #endif
274 
275 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
276 
278 typedef struct {
279  bool extendedId;
280  bool remoteFrame;
281  uint32_t id;
283 
285 typedef struct {
286  uint8_t dlcLow;
287  uint8_t dlcHigh;
288  uint8_t payload1[8U];
290  uint8_t payload2[8U];
292 
294 typedef enum {
300 
302 typedef enum {
309 
313 typedef struct {
315  bool wakeUpMatch;
316  uint16_t numMatches;
317  uint16_t matchTimeout;
325 
326 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
327 
331 typedef void (*flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType,
332  uint32_t buffIdx, flexcan_state_t *flexcanState);
333 
337 typedef void (*flexcan_error_callback_t)(uint8_t instance, flexcan_event_type_t eventType,
338  flexcan_state_t *flexcanState);
339 
340 /*******************************************************************************
341  * API
342  ******************************************************************************/
343 
344 #if defined(__cplusplus)
345 extern "C" {
346 #endif
347 
359 void FLEXCAN_DRV_SetBitrate(uint8_t instance, const flexcan_time_segment_t *bitrate);
360 
361 #if FEATURE_CAN_HAS_FD
362 
368 void FLEXCAN_DRV_SetBitrateCbt(uint8_t instance, const flexcan_time_segment_t *bitrate);
369 #endif
370 
377 void FLEXCAN_DRV_GetBitrate(uint8_t instance, flexcan_time_segment_t *bitrate);
378 
379 #if FEATURE_CAN_HAS_FD
380 
386 void FLEXCAN_DRV_GetBitrateFD(uint8_t instance, flexcan_time_segment_t *bitrate);
387 #endif
388 
402 void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type);
403 
412  uint8_t instance,
414  uint32_t mask);
415 
424  uint8_t instance,
426  uint32_t mask);
427 
436  uint8_t instance,
438  uint32_t mask);
439 
448  uint8_t instance,
450  uint32_t mask);
451 
464  uint8_t instance,
466  uint8_t mb_idx,
467  uint32_t mask);
468 
491 
504  uint8_t instance,
505  flexcan_state_t *state,
506  const flexcan_user_config_t *data);
507 
515 status_t FLEXCAN_DRV_Deinit(uint8_t instance);
516 
517 #if FEATURE_CAN_HAS_FD
518 
528 void FLEXCAN_DRV_SetTDCOffset(uint8_t instance, bool enable, uint8_t offset);
529 
538 uint8_t FLEXCAN_DRV_GetTDCValue(uint8_t instance);
539 
548 bool FLEXCAN_DRV_GetTDCFail(uint8_t instance);
549 
555 void FLEXCAN_DRV_ClearTDCFail(uint8_t instance);
556 #endif
557 
576  uint8_t instance,
577  uint8_t mb_idx,
578  const flexcan_data_info_t *tx_info,
579  uint32_t msg_id);
580 
594  uint8_t instance,
595  uint8_t mb_idx,
596  const flexcan_data_info_t *tx_info,
597  uint32_t msg_id,
598  const uint8_t *mb_data);
599 
618  uint8_t instance,
619  uint8_t mb_idx,
620  const flexcan_data_info_t *tx_info,
621  uint32_t msg_id,
622  const uint8_t *mb_data,
623  uint32_t timeout_ms);
624 
642  uint8_t instance,
643  uint8_t mb_idx,
644  const flexcan_data_info_t *tx_info,
645  uint32_t msg_id,
646  const uint8_t *mb_data);
647 
666  uint8_t instance,
667  uint8_t mb_idx,
668  const flexcan_data_info_t *rx_info,
669  uint32_t msg_id);
670 
702  uint8_t instance,
704  const flexcan_id_table_t *id_filter_table);
705 
722  uint8_t instance,
723  uint8_t mb_idx,
724  flexcan_msgbuff_t *data,
725  uint32_t timeout_ms);
726 
742  uint8_t instance,
743  uint8_t mb_idx,
744  flexcan_msgbuff_t *data);
745 
761  uint8_t instance,
762  flexcan_msgbuff_t *data,
763  uint32_t timeout_ms);
764 
779  uint8_t instance,
780  flexcan_msgbuff_t *data);
781 
797 status_t FLEXCAN_DRV_AbortTransfer(uint8_t instance, uint8_t mb_idx);
798 
810 status_t FLEXCAN_DRV_GetTransferStatus(uint8_t instance, uint8_t mb_idx);
811 
821 uint32_t FLEXCAN_DRV_GetErrorStatus(uint8_t instance);
822 
837 void FLEXCAN_DRV_InstallEventCallback(uint8_t instance,
838  flexcan_callback_t callback,
839  void *callbackParam);
840 
849 void FLEXCAN_DRV_InstallErrorCallback(uint8_t instance,
850  flexcan_error_callback_t callback,
851  void *callbackParam);
852 
855 #if FEATURE_CAN_HAS_PRETENDED_NETWORKING
856 
869 void FLEXCAN_DRV_ConfigPN(uint8_t instance, bool enable, const flexcan_pn_config_t *pnConfig);
870 
878 void FLEXCAN_DRV_GetWMB(uint8_t instance, uint8_t wmbIndex, flexcan_msgbuff_t *wmb);
879 
882 #endif /* FEATURE_CAN_HAS_PRETENDED_NETWORKING */
883 
884 #if FEATURE_CAN_HAS_SELF_WAKE_UP
885 
900 status_t FLEXCAN_DRV_ConfigSelfWakeUp(uint8_t instance, bool enable, bool lowPassFilterEn);
901 
904 #endif /* FEATURE_CAN_HAS_SELF_WAKE_UP */
905 
906 #ifdef __cplusplus
907 }
908 #endif
909 
912 #endif /* FLEXCAN_DRIVER_H */
913 
914 /*******************************************************************************
915  * EOF
916  ******************************************************************************/
flexcan_pn_filter_selection_t
Pretended Networking matching schemes.
Pretended Networking ID filter.
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.
void FLEXCAN_DRV_GetWMB(uint8_t instance, uint8_t wmbIndex, flexcan_msgbuff_t *wmb)
Extracts one of the frames which triggered the wake up event.
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
flexcan_clk_source_t
FlexCAN PE clock sources Implements : flexcan_clk_source_t_Class.
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_pn_filter_combination_t filterComb
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.
flexcan_pn_filter_combination_t
Pretended Networking filtering combinations.
flexcan_pn_id_filter_t idFilter2
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
flexcan_pn_payload_filter_t payloadFilter
#define FEATURE_CAN_MAX_MB_NUM
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).
uint8_t rxFifoDMAChannel
void FLEXCAN_DRV_SetRxMaskType(uint8_t instance, flexcan_rx_mask_type_t type)
Sets the Rx masking type.
volatile flexcan_mb_state_t state
FlexCAN bitrate related structures Implements : flexcan_time_segment_t_Class.
void * errorCallbackParam
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 FLEXCAN_DRV_ConfigRemoteResponseMb(uint8_t instance, uint8_t mb_idx, const flexcan_data_info_t *tx_info, uint32_t msg_id, const uint8_t *mb_data)
Configures a transmit message buffer for remote frame response.
status_t
Status return codes. Common error codes will be a unified enumeration (C enum) that will contain all ...
Definition: status.h:44
void(* callback)(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, struct FlexCANState *driverState)
void FLEXCAN_DRV_InstallErrorCallback(uint8_t instance, flexcan_error_callback_t callback, void *callbackParam)
Installs an error callback function for the IRQ handler and enables error interrupts.
flexcan_mb_handle_t mbs[(32U)]
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.
void(* error_callback)(uint8_t instance, flexcan_event_type_t eventType, struct FlexCANState *driverState)
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.
flexcan_time_segment_t bitrate_cbt
flexcan_rxfifo_transfer_type_t transfer_type
Pretended Networking configuration structure Implements : flexcan_pn_config_t_Class.
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
uint32_t FLEXCAN_DRV_GetErrorStatus(uint8_t instance)
Returns reported error conditions.
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.
void(* flexcan_error_callback_t)(uint8_t instance, flexcan_event_type_t eventType, flexcan_state_t *flexcanState)
FlexCAN Driver error callback function type Implements : flexcan_error_callback_t_Class.
Pretended Networking payload filter.
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).
void(* flexcan_callback_t)(uint8_t instance, flexcan_event_type_t eventType, uint32_t buffIdx, flexcan_state_t *flexcanState)
FlexCAN Driver callback function type Implements : flexcan_callback_t_Class.
flexcan_pn_filter_selection_t idFilterType
flexcan_pn_id_filter_t idFilter1
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_clk_source_t pe_clock
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_pn_filter_selection_t payloadFilterType
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.
void FLEXCAN_DRV_ConfigPN(uint8_t instance, bool enable, const flexcan_pn_config_t *pnConfig)
Configures Pretended Networking settings.