初始化部分和中断处理参考安富莱例程,接收回调也仅作了数据入栈处理,程序正常跑的时候收发处理正常.
基于STM32H7的双CANFD通信案例(2022-06-30) - STM32H7 - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)
当我在程序任意处断点调试,FDCAN的接收中断就再也进不去了,但是发送是正常的,CAN总线上仍然有大量的数据收发,只是H743这边没有正确接收了.
查看FDCAN寄存器没有看出端倪,有好厚米知道这个咋解决吗?>
[C] 纯文本查看 复制代码 /* CANFD1部分 */
/* 绑定配置结构体 */
tCanfd1.CanfdConfig.Canfd = &hfdcan1; // CAN1内部通信
tCanfd1.CanfdConfig.Filter = &sFilterConfig1;
tCanfd1.CanfdConfig.Tx = &g_Can1TxHeader;
tCanfd1.CanfdConfig.Rx = &g_Can1RxHeader;
/* 设置基础过滤器 */
tCanfd1.CanfdConfig.Filter->IdType = FDCAN_EXTENDED_ID; // 设置标准ID或者扩展ID
tCanfd1.CanfdConfig.Filter->FilterIndex = 0; // 用于过滤索引,如果是标准ID,范围0到127。如果是扩展ID,范围0到64
tCanfd1.CanfdConfig.Filter->FilterType = FDCAN_FILTER_MASK; // 过滤器采样屏蔽位模式
tCanfd1.CanfdConfig.Filter->FilterConfig = FDCAN_FILTER_TO_RXFIFO0; // 如果过滤匹配,将数据保存到Rx FIFO 0
tCanfd1.CanfdConfig.Filter->FilterID1 = 0x00000000; // 屏蔽位模式下,FilterID1是消息ID
tCanfd1.CanfdConfig.Filter->FilterID2 = 0x00000000; // 屏蔽位模式下,FilterID2是消息屏蔽位
HAL_FDCAN_ConfigFilter(tCanfd1.CanfdConfig.Canfd, tCanfd1.CanfdConfig.Filter); // 配置过滤器
/* 设置基础发送头 */
tCanfd1.CanfdConfig.Tx->Identifier = 0x00000000; // 初始化发送帧ID
tCanfd1.CanfdConfig.Tx->IdType = FDCAN_EXTENDED_ID; // 配置为拓展帧
tCanfd1.CanfdConfig.Tx->TxFrameType = FDCAN_DATA_FRAME; // 配置为数据帧
tCanfd1.CanfdConfig.Tx->DataLength = FDCAN_DLC_BYTES_8; // 初始化发送数据长度
tCanfd1.CanfdConfig.Tx->ErrorStateIndicator = FDCAN_ESI_ACTIVE; // 设置错误状态指示(供接收端了解发送端状态)
tCanfd1.CanfdConfig.Tx->BitRateSwitch = FDCAN_BRS_OFF; // 不可变bit率
tCanfd1.CanfdConfig.Tx->BitRateSwitch = FDCAN_CLASSIC_CAN; // 经典can
tCanfd1.CanfdConfig.Tx->TxEventFifoControl = FDCAN_NO_TX_EVENTS; // 用于发送事件FIFO控制, 不存储
tCanfd1.CanfdConfig.Tx->MessageMarker = 0; // 用于复制到TX EVENT FIFO的消息Maker来识别消息状态,范围0到0xFF
/* 开启接收通道,以及外设功能 */
HAL_FDCAN_ConfigFifoWatermark(tCanfd1.CanfdConfig.Canfd, FDCAN_CFG_RX_FIFO0, 1); // 设置Rx FIFO0的watermark为1,有消息立即通知
HAL_FDCAN_ActivateNotification(tCanfd1.CanfdConfig.Canfd, FDCAN_IT_RX_FIFO0_WATERMARK, 0); // 激活RX FIFO0的watermark通知中断,位开启Tx Buffer中断
HAL_FDCAN_Start(tCanfd1.CanfdConfig.Canfd); // 启动FDCAN1
[C] 纯文本查看 复制代码 /* 供CNFD中断调用的综合处理 */
/**
* @brief 定义覆盖HAL库中,CAN中断处理的回调函数
* Rx FIFO 0 callback.
* @param hfdcan 触发的CAN口,对应的HAL_CAN结构体
* @param RxFifo0ITs 标识哪个fifo发出中断信号的组合量
*/
void HAL_FDCAN_RxFifo0Callback(FDCAN_HandleTypeDef *hfdcan, uint32_t RxFifo0ITs)
{
if(hfdcan == &hfdcan1)
{
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
{
/* 从RX FIFO0读取数据 */
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, tCanfd1.CanfdConfig.Rx, tCanfd1.CanfdExist.RxDataBuffer);
/* 激活Rx FIFO0 watermark notification */
HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
/* 入待处理数据栈(更换平台需更改) */
CanMailRead1(&tCanfd1);
// CanClassicWrite(&tCanfd1, tCanfd1.CanfdConfig.Rx->Identifier, tCanfd1.CanfdExist.RxDataBuffer, 8);
}
}
if(hfdcan == &hfdcan2)
{
if((RxFifo0ITs & FDCAN_IT_RX_FIFO0_WATERMARK) != RESET)
{
/* 从RX FIFO0读取数据 */
HAL_FDCAN_GetRxMessage(hfdcan, FDCAN_RX_FIFO0, tCanfd2.CanfdConfig.Rx, tCanfd2.CanfdExist.RxDataBuffer);
/* 激活Rx FIFO0 watermark notification */
HAL_FDCAN_ActivateNotification(hfdcan, FDCAN_IT_RX_FIFO0_WATERMARK, 0);
/* 入待处理数据栈(更换平台需更改) */
CanMailRead2(&tCanfd2);
// CanClassicWrite(&tCanfd1, tCanfd2.CanfdConfig.Rx->Identifier, tCanfd2.CanfdExist.RxDataBuffer, 8);
}
}
}
|