一、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文件也改一下就可以了(至于为什么之前的被屏蔽了,我也不知道,有大神的话可以评论区探讨一下)文章来源:https://www.toymoban.com/news/detail-731720.html
文章来源地址https://www.toymoban.com/news/detail-731720.html
到了这里,关于CAN2无法发送和接收数据问题重要原因的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!