打印
[STM32F4]

stm32f413can接收中断不响应

[复制链接]
1485|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tongwei|  楼主 | 2021-3-19 15:36 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tongwei 于 2021-3-23 13:00 编辑

调试现象:can1,can2,can3发送数据均正常,接收采用中断接收方式,can1,can3能响应中断,can2无法进入接收中断,曾怀疑can2配置的CAN_FilterNumber参数设置的不对,但是试验了0~27,都不行,各位大佬有啥好的办法,还望指教。的配置代码如下:
void CAN1_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  CAN_InitTypeDef CAN_InitStructure;
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);

  GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_CAN1);
  GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_CAN1);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  CAN_StructInit(&CAN_InitStructure);
  CAN_DeInit(CAN1);
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = ENABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 10;
  CAN_Init(CAN1, &CAN_InitStructure);

  CAN_FilterInitStructure.CAN_FilterNumber=0;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(CAN1,&CAN_FilterInitStructure);

  CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

void CAN2_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  CAN_InitTypeDef CAN_InitStructure;
  CAN_FilterInitTypeDef CAN_FilterInitStructure;
  NVIC_InitTypeDef  NVIC_InitStructure;

  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG,ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
  GPIO_PinAFConfig(GPIOG,GPIO_PinSource11,GPIO_AF_CAN2);
  GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_CAN2);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11| GPIO_Pin_12;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(GPIOG, &GPIO_InitStructure);

  CAN_StructInit(&CAN_InitStructure);
  CAN_DeInit(CAN2);
  CAN_InitStructure.CAN_TTCM = DISABLE;
  CAN_InitStructure.CAN_ABOM = DISABLE;
  CAN_InitStructure.CAN_AWUM = DISABLE;
  CAN_InitStructure.CAN_NART = ENABLE;
  CAN_InitStructure.CAN_RFLM = DISABLE;
  CAN_InitStructure.CAN_TXFP = DISABLE;
  CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
  CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1 = CAN_BS1_4tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
  CAN_InitStructure.CAN_Prescaler = 10;
  CAN_Init(CAN2, &CAN_InitStructure);

  CAN_FilterInitStructure.CAN_FilterNumber=14;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_Filter_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(CAN2,&CAN_FilterInitStructure);

  CAN_ITConfig(CAN2,CAN_IT_FMP0,ENABLE);

  NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}



使用特权

评论回复
沙发
香水城| | 2021-3-24 17:58 | 只看该作者
说实话 从配置上没看出问题所在。

你将CAN1/CAN2的FIFO分别指定不同的试试。

另外 CAN1/CAN2共用26个Filter.

代码是基于别的移植过来的吗? 尽量用最新版cube库来做。

使用特权

评论回复
板凳
香水城| | 2021-4-2 12:04 | 只看该作者
本帖最后由 香水城 于 2021-4-11 20:59 编辑

另外你注意下滤波器配置那个地方,

CAN1 CAN2公用filter,由CAN1掌管。即配置CAN2滤波器时还是用CAN1.




使用特权

评论回复
地板
tongwei|  楼主 | 2021-4-7 15:08 | 只看该作者
香水城 发表于 2021-4-2 12:04
另外你注意下滤波器配置那个地方,

CAN1 CAN2公用filter,由CAN1掌管。即配置CAN2滤波器时还是用CAN1. ...

多谢香版主

使用特权

评论回复
5
tongwei|  楼主 | 2021-4-7 15:17 | 只看该作者
香水城 发表于 2021-3-24 17:58
说实话 从配置上没看出问题所在。

你将CAN1/CAN2的FIFO分别指定不同的试试。

代码是由407直接移植过来的,以后会更多的尝试用Cube来做

使用特权

评论回复
6
tongwei|  楼主 | 2021-4-7 15:21 | 只看该作者
香水城 发表于 2021-4-2 12:04
另外你注意下滤波器配置那个地方,

CAN1 CAN2公用filter,由CAN1掌管。即配置CAN2滤波器时还是用CAN1. ...

最终问题还是出在can接收滤波器上了,感觉是库的bug,只是感觉

使用特权

评论回复
7
gwsan| | 2021-4-8 14:02 | 只看该作者
配置没有问题

使用特权

评论回复
8
coshi| | 2021-4-8 14:04 | 只看该作者
为什么最新版cube不可以做啊

使用特权

评论回复
9
aoyi| | 2021-4-8 14:05 | 只看该作者
这个can真的很不容易调试

使用特权

评论回复
10
drer| | 2021-4-8 14:07 | 只看该作者
这边已经有数据发送出来了吗

使用特权

评论回复
11
kxsi| | 2021-4-8 14:07 | 只看该作者
这三个can是不一样的吗

使用特权

评论回复
评论
香水城 2021-4-11 20:56 回复TA
CAN1 CAN2是共享1个滤波控制器,由CAN1掌管。 
12
jsj0716| | 2022-4-6 10:37 | 只看该作者
大佬把搞定的代码贴一下,我也遇到了这个问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

81

帖子

3

粉丝