未验证 提交 05afaa9f 编写于 作者: o777788's avatar o777788 提交者: GitHub

[imxrt1170]Fix flexcan driver (#6378)

 fix flexcan driver for imxrt1170
上级 5967ce44
...@@ -3475,12 +3475,11 @@ void FLEXCAN_TransferCreateHandle(CAN_Type *base, ...@@ -3475,12 +3475,11 @@ void FLEXCAN_TransferCreateHandle(CAN_Type *base,
/* Get instance from peripheral base address. */ /* Get instance from peripheral base address. */
instance = (uint8_t)FLEXCAN_GetInstance(base); 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. */ /* Register Callback function. */
handle->callback = callback; handle->callback = callback;
handle->userData = userData; handle->userData = userData;
/* Save the context in global variables to support the double weak mechanism. */
s_flexcanHandle[instance] = handle;
s_flexcanIsr = FLEXCAN_TransferHandleIRQ; s_flexcanIsr = FLEXCAN_TransferHandleIRQ;
......
...@@ -29,6 +29,10 @@ ...@@ -29,6 +29,10 @@
static flexcan_frame_t frame[RX_MB_COUNT]; /* one frame buffer per RX MB */ static flexcan_frame_t frame[RX_MB_COUNT]; /* one frame buffer per RX MB */
static rt_uint32_t filter_mask = 0; static rt_uint32_t filter_mask = 0;
#ifdef SOC_IMXRT1170_SERIES
#define USE_IMPROVED_TIMING_CONFIG (1U)
#endif
enum enum
{ {
#ifdef BSP_USING_CAN1 #ifdef BSP_USING_CAN1
...@@ -102,13 +106,16 @@ uint32_t GetCanSrcFreq(CAN_Type *can_base) ...@@ -102,13 +106,16 @@ uint32_t GetCanSrcFreq(CAN_Type *can_base)
return freq; 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) static void flexcan_callback(CAN_Type *base, flexcan_handle_t *handle, status_t status, uint32_t result, void *userData)
#endif
{ {
struct imxrt_can *can; struct imxrt_can *can;
flexcan_mb_transfer_t rxXfer; flexcan_mb_transfer_t rxXfer;
can = (struct imxrt_can *)userData; can = (struct imxrt_can *)userData;
switch (status) switch (status)
{ {
case kStatus_FLEXCAN_RxIdle: case kStatus_FLEXCAN_RxIdle:
...@@ -171,6 +178,22 @@ static rt_err_t can_cfg(struct rt_can_device *can_dev, struct can_configure *cfg ...@@ -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: case RT_CAN_MODE_LOOPBACKANLISTEN:
break; 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_Init(can->base, &config, GetCanSrcFreq(can->base));
FLEXCAN_TransferCreateHandle(can->base, &can->handle, flexcan_callback, can); FLEXCAN_TransferCreateHandle(can->base, &can->handle, flexcan_callback, can);
/* init RX_MB_COUNT RX MB to default status */ /* init RX_MB_COUNT RX MB to default status */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册