解析CAN2无法发送和接收数据的重要原因

一、CAN2无法发送数据

        在调试CAN2总线收发过程中,官方给的代码例程是是CAN1的,根据CAN1的直接转换为CAN2,是不能正常收发的。单独使用CAN2的时候,在确保硬件连接正常情况下,必须先要打开CAN1的时钟,再打开CAN2时钟,顺序不能反。

二、CAN2无法接收数据

        CAN_Filter的0-14是对应CAN1用的,15-27是对应CAN2用的。如果配置错了,CAN接收就不成功。

比如CAN2需要进行如下配置才能接收成功:

    /*HAL库*/

sFilterConfig.FilterBank = 15; /* 过滤器15 */

    /*STD库*/

CAN_FilterInitStructure.CAN_FilterNumber=15; /* 过滤器15 */

三、在使用正点原子f407ZG时,打开CAN中断,可能会报错,可以这样修改:

原来的代码

#if CAN_RX0_INT_ENABLE

    /* 使用中断接收 */
    __HAL_CAN_ENABLE_IT(&g_canx_handler, CAN_IT_RX_FIFO0_MSG_PENDING); /* FIFO0消息挂号中断允许 */
    HAL_NVIC_EnableIRQ(USB_LP_CAN2_RX0_IRQn);                          /* 使能CAN中断 */
    HAL_NVIC_SetPriority(USB_LP_CAN2_RX0_IRQn, 1, 0);                  /* 抢占优先级1,子优先级0 */
#endif
void USB_LP_CAN2_RX0_IRQHandler(void)
{
    printf("Interrupt triggering\n");
}

修改后的代码

#if CAN_RX0_INT_ENABLE

    /* 使用中断接收 */
    __HAL_CAN_ENABLE_IT(&g_canx_handler, CAN_IT_RX_FIFO0_MSG_PENDING); /* FIFO0消息挂号中断允许 */
    HAL_NVIC_EnableIRQ(CAN2_RX0_IRQn);                                 /* 使能CAN中断 */
    HAL_NVIC_SetPriority(CAN2_RX0_IRQn, 1, 0);                         /* 抢占优先级1,子优先级0 */
#endif
void CAN2_RX0_IRQHandler(void)
{
    printf("Interrupt triggering\n");
}

四、还可能会报很多未定义的

比如下图:

 只需改成下图就行,对应的.h文件也改一下就可以了(至于为什么之前的被屏蔽了,我也不知道,有大神的话可以评论区探讨一下)

物联沃分享整理
物联沃-IOTWORD物联网 » 解析CAN2无法发送和接收数据的重要原因

发表评论