From 05afaa9fc545bfa298cd2f20a758f4fa7f83dd19 Mon Sep 17 00:00:00 2001 From: xiao xie <335266746@qq.com> Date: Wed, 7 Sep 2022 09:20:04 +0800 Subject: [PATCH] [imxrt1170]Fix flexcan driver (#6378) fix flexcan driver for imxrt1170 --- .../MIMXRT1176/drivers/fsl_flexcan.c | 5 ++-- bsp/imxrt/libraries/drivers/drv_can.c | 25 ++++++++++++++++++- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_flexcan.c b/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_flexcan.c index 1f495af526..2d2ce4f78a 100644 --- a/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_flexcan.c +++ b/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_flexcan.c @@ -3475,12 +3475,11 @@ void FLEXCAN_TransferCreateHandle(CAN_Type *base, /* Get instance from peripheral base address. */ instance = (uint8_t)FLEXCAN_GetInstance(base); - /* Save the context in global variables to support the double weak mechanism. */ - s_flexcanHandle[instance] = handle; - /* Register Callback function. */ handle->callback = callback; handle->userData = userData; + /* Save the context in global variables to support the double weak mechanism. */ + s_flexcanHandle[instance] = handle; s_flexcanIsr = FLEXCAN_TransferHandleIRQ; diff --git a/bsp/imxrt/libraries/drivers/drv_can.c b/bsp/imxrt/libraries/drivers/drv_can.c index 4b6a26f951..d360c5f432 100644 --- a/bsp/imxrt/libraries/drivers/drv_can.c +++ b/bsp/imxrt/libraries/drivers/drv_can.c @@ -29,6 +29,10 @@ static flexcan_frame_t frame[RX_MB_COUNT]; /* one frame buffer per RX MB */ static rt_uint32_t filter_mask = 0; +#ifdef SOC_IMXRT1170_SERIES +#define USE_IMPROVED_TIMING_CONFIG (1U) +#endif + enum { #ifdef BSP_USING_CAN1 @@ -102,13 +106,16 @@ uint32_t GetCanSrcFreq(CAN_Type *can_base) return freq; } +#ifdef SOC_IMXRT1170_SERIES +static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint64_t result, void *userData) +#else static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData) +#endif { struct imxrt_can *can; flexcan_mb_transfer_t rxXfer; can = (struct imxrt_can *)userData; - switch (status) { case kStatus_FLEXCAN_RxIdle: @@ -171,6 +178,22 @@ static rt_err_t can_cfg(struct rt_can_device *can_dev, struct can_configure *cfg case RT_CAN_MODE_LOOPBACKANLISTEN: break; } + +#ifdef SOC_IMXRT1170_SERIES + flexcan_timing_config_t timing_config; + memset(&timing_config, 0, sizeof(flexcan_timing_config_t)); + + if(FLEXCAN_CalculateImprovedTimingValues(can->base, config.baudRate, GetCanSrcFreq(can->base), &timing_config)) + { + /* Update the improved timing configuration*/ + memcpy(&(config.timingConfig), &timing_config, sizeof(flexcan_timing_config_t)); + } + else + { + LOG_E("No found Improved Timing Configuration. Just used default configuration\n"); + } +#endif + FLEXCAN_Init(can->base, &config, GetCanSrcFreq(can->base)); FLEXCAN_TransferCreateHandle(can->base, &can->handle, flexcan_callback, can); /* init RX_MB_COUNT RX MB to default status */ -- GitLab