|
发表于 2023-12-8 16:34:49
|
显示全部楼层
楼主你好 才看到你给我帖子下的留言 我把CAN初始化部分代码给你:
/**
* @brief FDCAN1 Initialization Function
* @param None
* @retval None
*/
//CAN时钟40M 初始仲裁段500K 仲裁段2000K
void MX_FDCAN1_Init(void)
{
hfdcan1.Instance = FDCAN1;
hfdcan1.Init.FrameFormat = FDCAN_FRAME_FD_BRS; //配置为可变波特率 FDCAN_FRAME_FD_NO_BRS FDCAN_FRAME_FD_BRS FDCAN_FRAME_CLASSIC
hfdcan1.Init.Mode = FDCAN_MODE_NORMAL; //正常模式 FDCAN_MODE_NORMAL FDCAN_FRAME_CLASSIC 传统帧
hfdcan1.Init.AutoRetransmission = DISABLE; //使能自动重传
hfdcan1.Init.TransmitPause = DISABLE; //禁止传输暂停特性
hfdcan1.Init.ProtocolException = DISABLE; //异常处理使能
hfdcan1.Init.NominalPrescaler = 1;
hfdcan1.Init.NominalSyncJumpWidth = 15;
hfdcan1.Init.NominalTimeSeg1 = 0x1d;
hfdcan1.Init.NominalTimeSeg2 = 0x0a;
//数据段的波特率: 40M/(1+29+10)=1000K
hfdcan1.Init.DataPrescaler = 1;
hfdcan1.Init.DataSyncJumpWidth = 3;
hfdcan1.Init.DataTimeSeg1 = 0x1d;
hfdcan1.Init.DataTimeSeg2 = 0x0a;
hfdcan1.Init.MessageRAMOffset = 0; //不偏移 独享2560个字节
hfdcan1.Init.StdFiltersNbr = 0; //暂时不作任何过滤
hfdcan1.Init.ExtFiltersNbr = 0;
hfdcan1.Init.RxFifo0ElmtsNbr = 32; /* 设置Rx FIFO0的元素个数,范围0-64 */
hfdcan1.Init.RxFifo0ElmtSize = FDCAN_DATA_BYTES_64; /* 设置Rx FIFO0中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.RxFifo1ElmtsNbr = 0; /* 设置Rx FIFO1的元素个数,范围0-64 */
hfdcan1.Init.RxFifo1ElmtSize = FDCAN_DATA_BYTES_64; /* 设置Rx FIFO1中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.RxBuffersNbr = 0; /* 设置Rx Buffer个数,范围0-64 */
hfdcan1.Init.RxBufferSize = 0; /* 设置Rx Buffer中每个元素大小,支持8,12,16,20,24,32,48或者64字节 */
hfdcan1.Init.TxEventsNbr = 0; /* 设置Tx Event FIFO中元素个数,范围0-32 */
hfdcan1.Init.TxBuffersNbr = 0; /* 设置Tx Buffer中元素个数,范围0-32 */
hfdcan1.Init.TxFifoQueueElmtsNbr = 32; /* 设置用于Tx FIFO/Queue的Tx Buffers个数。范围0到32 */
hfdcan1.Init.TxFifoQueueMode = FDCAN_TX_FIFO_OPERATION; /* 设置FIFO模式或者QUEUE队列模式 */
hfdcan1.Init.TxElmtSize = FDCAN_DATA_BYTES_64; /* 设置Tx Element中的数据域大小,支持8,12,16,20,24,32,48或者64字节 */
if (HAL_FDCAN_Init(&hfdcan1) != HAL_OK)
{
Error_Handler();
}
//add timestamp config
#define TIMEstampPresec 0x01 //one can bit
#define TIMEstampOpera 0x01 //enable Tscv
HAL_FDCAN_ConfigTimestampCounter(&hfdcan1, TIMEstampPresec); //uint32_t TimestampPrescaler
HAL_FDCAN_EnableTimestampCounter(&hfdcan1, TIMEstampOpera);//uint32_t TimestampOperation
HAL_NVIC_SetPriority(FDCAN1_IT0_IRQn, 1, 0);
HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);
/*
配置过滤器, 过滤器主要用于接收,这里采样屏蔽位模式。
FilterID1 = filter
FilterID2 = mask
FilterID2的mask每个bit含义
0: 不关心,该位不用于比较;
1: 必须匹配,接收到的ID必须与滤波器对应的ID位相一致。
举例说明:
FilterID1 = 0x111
FilterID2 = 0x7FF
表示仅接收ID为0x111的FDCAN帧。
*/
sFilterConfig1.IdType = FDCAN_EXTENDED_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64 */
sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 过滤器采样屏蔽位模式 */
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x00; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x00; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
sFilterConfig1.IdType = FDCAN_STANDARD_ID; /* 设置标准ID或者扩展ID */
sFilterConfig1.FilterIndex = 0; /* 用于过滤索引,标准ID,范围0到127 */
sFilterConfig1.FilterType = FDCAN_FILTER_MASK; /* 范围过滤 -------------------------*/
sFilterConfig1.FilterConfig = FDCAN_FILTER_TO_RXFIFO0; /* 如果过滤匹配,将数据保存到Rx FIFO 0 */
sFilterConfig1.FilterID1 = 0x00; /* 屏蔽位模式下,FilterID1是消息ID */
sFilterConfig1.FilterID2 = 0x00; /* 屏蔽位模式下,FilterID2是消息屏蔽位 */
HAL_FDCAN_ConfigFilter(&hfdcan1, &sFilterConfig1); /* 配置过滤器 */
//
//HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, /* 全局过滤设置 */
// FDCAN_REJECT, /* 接收到消息ID与标准ID过滤不匹配,不接受 */
// FDCAN_REJECT, /* 接收到消息ID与扩展ID过滤不匹配,不接受 */
// FDCAN_FILTER_REMOTE, /* 过滤标准ID远程帧 */
// FDCAN_FILTER_REMOTE); /* 过滤扩展ID远程帧 */
/* 设置Rx FIFO0的wartermark为1 */
HAL_FDCAN_ConfigFifoWatermark(&hfdcan1, FDCAN_CFG_RX_FIFO0, 1);
/* 开启时间戳回卷中断*/
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TIMESTAMP_WRAPAROUND, 0);
///* 开启错误状态使能 PEDE:数据段协议错误 PEAE仲裁段协议错误*/
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_ARB_PROTOCOL_ERROR, 0);
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_DATA_PROTOCOL_ERROR, 0);
/* 激活RX FIFO0的watermark通知中断,位开启Tx Buffer中断*/
HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0);
// HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_TX_FIFO_EMPTY, 0);
/* 启动FDCAN */
HAL_FDCAN_Start(&hfdcan1);
}
void HAL_FDCAN_TimestampWraparoundCallback(FDCAN_HandleTypeDef *hfdcan)
{
} |
|