4
0
mirror of https://github.com/RT-Thread/rt-thread.git synced 2025-02-21 01:07:18 +08:00

375 lines
18 KiB
C

/*
* Copyright (c) 2006-2022, RT-Thread Development Team
* Copyright (c) 2022-2024, Xiaohua Semiconductor Co., Ltd.
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-02-20 CDT first version
*/
#ifndef __CAN_CONFIG_H__
#define __CAN_CONFIG_H__
#include <rtthread.h>
#include "irq_config.h"
#ifdef __cplusplus
extern "C" {
#endif
/***********************************************************************************************/
/***********************************************************************************************/
// The arguments of RT command RT_CAN_CMD_SET_CANFD
#define MCAN_FD_CLASSICAL 0 /* CAN classical */
#define MCAN_FD_ISO_FD_NO_BRS 1 /* ISO CAN FD without BRS */
#define MCAN_FD_ISO_FD_BRS 2 /* ISO CAN FD with BRS */
#define MCAN_FD_NON_ISO_FD_NO_BRS 3 /* non-ISO CAN FD without BRS */
#define MCAN_FD_NON_ISO_FD_BRS 4 /* non-ISO CAN FD with BRS */
#define MCAN_FD_ARG_MIN MCAN_FD_ISO_FD_NO_BRS
#define MCAN_FD_ARG_MAX MCAN_FD_NON_ISO_FD_BRS
/* The default configuration for MCANs. Users can modify the configurations based on the application.
For the message RAM:
1. MCAN1 and MCAN2 share 2048 bytes message RAM
2. User can modify the definitions of filter number, Rx FIFO number, Tx FIFO number.
3. MCAN has two configurable Receive FIFOs, Rx FIFO0 and Rx FIFO1. There use Rx FIFO0 only by default.
If only one FIFO is needed, use Rx FIFO0. If Rx FIFO1 is needed, define it's macro between 1 and 64,
and pay attention the total size of meesage RAM that to be allocated.
*/
#ifdef RT_CAN_USING_CANFD
#define MCAN_FD_SEL MCAN_FD_ISO_FD_BRS
#define MCAN_TOTAL_FILTER_NUM (26U)
#define MCAN_STD_FILTER_NUM (13U) /* Each standard filter element size is 4 bytes */
#define MCAN_EXT_FILTER_NUM (13U) /* Each extended filter element size is 8 bytes */
#define MCAN_TX_FIFO_NUM (6U)
#define MCAN_RX_FIFO_NUM (6U)
#define MCAN_DATA_FIELD_SIZE (MCAN_DATA_SIZE_64BYTE) /* Each FIFO element size is 64+8 bytes */
#else
#define MCAN_FD_SEL MCAN_FD_CLASSICAL
#define MCAN_TOTAL_FILTER_NUM (32U)
#define MCAN_STD_FILTER_NUM (16U) /* Each standard filter element size is 4 bytes */
#define MCAN_EXT_FILTER_NUM (16U) /* Each extended filter element size is 8 bytes */
#define MCAN_TX_FIFO_NUM (26U)
#define MCAN_RX_FIFO_NUM (26U)
#define MCAN_DATA_FIELD_SIZE (MCAN_DATA_SIZE_8BYTE) /* Each FIFO element size is 8+8 bytes */
#endif
#ifdef BSP_USING_MCAN1
#define MCAN1_NAME ("can1")
#define MCAN1_WORK_MODE (RT_CAN_MODE_NORMAL)
#define MCAN1_TX_PRIV_MODE RT_CAN_MODE_NOPRIV /* RT_CAN_MODE_NOPRIV: Tx FIFO mode; RT_CAN_MODE_PRIV: Tx priority mode */
#define MCAN1_FD_SEL MCAN_FD_SEL
#define MCAN1_STD_FILTER_NUM MCAN_STD_FILTER_NUM
#define MCAN1_EXT_FILTER_NUM MCAN_EXT_FILTER_NUM
#define MCAN1_RX_FIFO0_NUM MCAN_RX_FIFO_NUM
#define MCAN1_RX_FIFO0_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE
#define MCAN1_TX_FIFO_NUM MCAN_TX_FIFO_NUM
#define MCAN1_TX_FIFO_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE
#define MCAN1_TX_NOTIFICATION_BUF ((1UL << MCAN1_TX_FIFO_NUM) - 1U)
#endif /* BSP_USING_MCAN1 */
#ifdef BSP_USING_MCAN2
#define MCAN2_NAME ("can2")
#define MCAN2_WORK_MODE (RT_CAN_MODE_NORMAL)
#define MCAN2_TX_PRIV_MODE RT_CAN_MODE_NOPRIV /* RT_CAN_MODE_NOPRIV: Tx FIFO mode; RT_CAN_MODE_PRIV: Tx priority mode */
#define MCAN2_FD_SEL MCAN_FD_SEL
#define MCAN2_STD_FILTER_NUM MCAN_STD_FILTER_NUM
#define MCAN2_EXT_FILTER_NUM MCAN_EXT_FILTER_NUM
#define MCAN2_RX_FIFO0_NUM MCAN_RX_FIFO_NUM
#define MCAN2_RX_FIFO0_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE
#define MCAN2_TX_FIFO_NUM MCAN_TX_FIFO_NUM
#define MCAN2_TX_FIFO_DATA_FIELD_SIZE MCAN_DATA_FIELD_SIZE
#define MCAN2_TX_NOTIFICATION_BUF ((1UL << MCAN2_TX_FIFO_NUM) - 1U)
#endif /* BSP_USING_MCAN2 */
/***********************************************************************************************/
/***********************************************************************************************/
/*
Bit rate configuration examples for CAN FD.
Nominal bit rate for CAN FD arbitration phase and data bit rate for CAN FD data phase.
BitRate(bps) = MCANClock(Hz) / (Prescaler * (TimeSeg1 + TimeSeg2))
SamplePoint(%) = TimeSeg1 / (TimeSeg1 + TimeSeg2)
eg.
BitRate(bps) = 40000000(Hz) / (2 * (16 + 4)) = 1000000 = 1M(bps)
SamplePoint(%) = 16 / (16 + 4) = 80%
The following bit rate configurations are based on the max MCAN Clock(40MHz).
NOTE:
1. It is better to limit u32NominalPrescaler and u32DataPrescaler between 1 and 2.
1. The unit of u32SspOffset is MCANClock.
2. For the corresponding function of u32TdcFilter, please refer to the reference manual for details(TDCR.TDCF).
The u32TdcFilter can be get from PSR.TDCV.
*/
#define MCAN_FD_CFG_500K_1M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 32, \
.u32DataTimeSeg2 = 8, \
.u32DataSyncJumpWidth = 8, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 32, \
.u32TdcFilter = 32 + 1, \
}
#define MCAN_FD_CFG_500K_2M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 16, \
.u32DataTimeSeg2 = 4, \
.u32DataSyncJumpWidth = 4, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 16, \
.u32TdcFilter = 16 + 1, \
}
#define MCAN_FD_CFG_500K_4M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 8, \
.u32DataTimeSeg2 = 2, \
.u32DataSyncJumpWidth = 2, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 8, \
.u32TdcFilter = 8 + 1, \
}
#define MCAN_FD_CFG_500K_5M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 6, \
.u32DataTimeSeg2 = 2, \
.u32DataSyncJumpWidth = 2, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 6, \
.u32TdcFilter = 6 + 1, \
}
#define MCAN_FD_CFG_500K_8M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 4, \
.u32DataTimeSeg2 = 1, \
.u32DataSyncJumpWidth = 1, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 4, \
.u32TdcFilter = 4 + 1, \
}
#define MCAN_FD_CFG_1M_1M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 32, \
.u32DataTimeSeg2 = 8, \
.u32DataSyncJumpWidth = 8, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 2*32, \
.u32TdcFilter = 2*32 + 1, \
}
#define MCAN_FD_CFG_1M_2M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 16, \
.u32DataTimeSeg2 = 4, \
.u32DataSyncJumpWidth = 4, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 16, \
.u32TdcFilter = 16 + 1, \
}
#define MCAN_FD_CFG_1M_4M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 8, \
.u32DataTimeSeg2 = 2, \
.u32DataSyncJumpWidth = 2, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 8, \
.u32TdcFilter = 8 + 1, \
}
#define MCAN_FD_CFG_1M_5M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 6, \
.u32DataTimeSeg2 = 2, \
.u32DataSyncJumpWidth = 2, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 6, \
.u32TdcFilter = 6 + 1, \
}
#define MCAN_FD_CFG_1M_8M \
{ \
.u32NominalPrescaler = 1, \
.u32NominalTimeSeg1 = 64, \
.u32NominalTimeSeg2 = 16, \
.u32NominalSyncJumpWidth = 16, \
.u32DataPrescaler = 1, \
.u32DataTimeSeg1 = 4, \
.u32DataTimeSeg2 = 1, \
.u32DataSyncJumpWidth = 1, \
.u32TDC = MCAN_FD_TDC_ENABLE, \
.u32SspOffset = 4, \
.u32TdcFilter = 4 + 1, \
}
/*
Bit rate configuration examples for classical CAN.
BitRate(bps) = MCANClock(Hz) / (u32NominalPrescaler * (u32NominalTimeSeg1 + u32NominalTimeSeg2))
SamplePoint(%) = u32NominalTimeSeg1 / (u32NominalTimeSeg1 + u32NominalTimeSeg2)
eg.
BitRate(bps) = 40000000(Hz) / (2 * (16 + 4)) = 1000000 = 1M(bps)
SamplePoint(%) = 16 / (16 + 4) = 80%
The following bit rate configurations are based on the max MCAN Clock(40MHz).
*/
#define MCAN_CC_CFG_1M \
{ \
.u32NominalPrescaler = 2, \
.u32NominalTimeSeg1 = 16, \
.u32NominalTimeSeg2 = 4, \
.u32NominalSyncJumpWidth = 4, \
}
#define MCAN_CC_CFG_800K \
{ \
.u32NominalPrescaler = 2, \
.u32NominalTimeSeg1 = 20, \
.u32NominalTimeSeg2 = 5, \
.u32NominalSyncJumpWidth = 5, \
}
#define MCAN_CC_CFG_500K \
{ \
.u32NominalPrescaler = 4, \
.u32NominalTimeSeg1 = 16, \
.u32NominalTimeSeg2 = 4, \
.u32NominalSyncJumpWidth = 4, \
}
#define MCAN_CC_CFG_250K \
{ \
.u32NominalPrescaler = 4, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#define MCAN_CC_CFG_125K \
{ \
.u32NominalPrescaler = 8, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#define MCAN_CC_CFG_100K \
{ \
.u32NominalPrescaler = 10, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#define MCAN_CC_CFG_50K \
{ \
.u32NominalPrescaler = 20, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#define MCAN_CC_CFG_20K \
{ \
.u32NominalPrescaler = 50, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#define MCAN_CC_CFG_10K \
{ \
.u32NominalPrescaler = 100, \
.u32NominalTimeSeg1 = 32, \
.u32NominalTimeSeg2 = 8, \
.u32NominalSyncJumpWidth = 8, \
}
#ifdef RT_CAN_USING_CANFD
#define MCAN1_BAUD_RATE_CFG MCAN_FD_CFG_1M_4M
#define MCAN1_NOMINAL_BAUD_RATE MCANFD_NOMINAL_BAUD_1M
#define MCAN1_DATA_BAUD_RATE MCANFD_DATA_BAUD_4M
#define MCAN2_BAUD_RATE_CFG MCAN_FD_CFG_1M_4M
#define MCAN2_NOMINAL_BAUD_RATE MCANFD_NOMINAL_BAUD_1M
#define MCAN2_DATA_BAUD_RATE MCANFD_DATA_BAUD_4M
#else
#define MCAN1_BAUD_RATE_CFG MCAN_CC_CFG_1M
#define MCAN1_NOMINAL_BAUD_RATE CAN1MBaud
#define MCAN1_DATA_BAUD_RATE 0
#define MCAN2_BAUD_RATE_CFG MCAN_CC_CFG_1M
#define MCAN2_NOMINAL_BAUD_RATE CAN1MBaud
#define MCAN2_DATA_BAUD_RATE 0
#endif /* #ifdef RT_CAN_USING_CANFD */
/***********************************************************************************************/
/***********************************************************************************************/
#ifdef __cplusplus
}
#endif
#endif /* __CAN_CONFIG_H__ */