星空22 发表于 2016-3-29 12:08:20

STM32F042K6的CAN接收中断进不去,求教

STM32F042K6的CAN接收中断进不去,求教
最近刚接触与CAN通讯相关的项目, 对着方面不是太了解, 在调STM32F042K6的CAN通讯驱动时, 死活进不了接收中断(发送中断是可以的), 希望大家不吝敕教,谢谢!!!





下面是配置代码:
/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN通讯初始化
****名称: can_init();//
****作者:
*******************************************************************************/
void can_init(void)      //
{      
      GPIO_InitTypeDef GPIO_InitStructure;
      NVIC_InitTypeDef NVIC_InitStructure;
      CAN_InitTypeDefCAN_InitStructure;
      CAN_FilterInitTypeDef CAN_FilterInitStructure;
      
      //CAN中断使能和优先级设置
      NVIC_InitStructure.NVIC_IRQChannel = CEC_CAN_IRQn;         
      NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
      
      //CAN时钟配置
      RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);                                                                                                            
      RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE);
      
      //CAN端口复用
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource11,GPIO_AF_4);
      GPIO_PinAFConfig(GPIOA,GPIO_PinSource12,GPIO_AF_4);
      
      //CAN_RX端口配置
      GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_11;
      GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      //CAN_TX端口配置
      GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_12;
      GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_OType= GPIO_OType_PP;
      GPIO_InitStructure.GPIO_Speed= GPIO_Speed_10MHz;
      GPIO_InitStructure.GPIO_PuPd   = GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      
      //CAN_STB端口初始化
      GPIO_InitStructure.GPIO_Pin    = GPIO_Pin_10;
      GPIO_InitStructure.GPIO_Mode   = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd= GPIO_PuPd_NOPULL;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
      CAN_STB_OL();      //      
      
      //CAN单元设置
      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_Mode_Normal;
      //CAN波特率设置,500KHz@48MHz
      CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
      CAN_InitStructure.CAN_BS1 = CAN_BS1_8tq;
      CAN_InitStructure.CAN_BS2 = CAN_BS2_7tq;
      CAN_InitStructure.CAN_Prescaler = 6;
      CAN_Init(CAN, &CAN_InitStructure);
      
      //CAN过滤器FIFO0配置
      CAN_FilterInitStructure.CAN_FilterNumber = 0;
      CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;
      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 = 0;
      CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
      CAN_FilterInit(&CAN_FilterInitStructure);

      //使能CAN中断
      CAN_ClearITPendingBit(CAN, CAN_IT_FF0);
      CAN_ITConfig(CAN, CAN_IT_TME, ENABLE);
      CAN_ITConfig(CAN, CAN_IT_FMP0, ENABLE);
      CAN_ITConfig(CAN, CAN_IT_FF0, ENABLE);
}

/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN中断服务函数
****名称: CEC_CAN_IRQHandler();//
****作者:
*******************************************************************************/

void CEC_CAN_IRQHandler(void)
{      
      u8 i = 0;
**      if (CAN_GetITStatus(CAN, CAN_IT_TME) != 0)
      {
                CAN_ClearITPendingBit(CAN, CAN_IT_TME);
                i++;
      }
      
      if (CAN_GetITStatus(CAN, CAN_IT_FMP0) != 0)
      {
***                CAN_ClearITPendingBit(CAN, CAN_IT_FMP0);
                i++;
      }
      
      if (CAN_GetITStatus(CAN, CAN_IT_FF0) != 0)
      {
                CAN_ClearITPendingBit(CAN, CAN_IT_FF0);
                i++;
      }
      
      if (CAN_GetITStatus(CAN, CAN_IT_FOV0) != 0)
      {
                CAN_ClearITPendingBit(CAN, CAN_IT_FOV0);
                i++;
      }
}


以上代码调试时,星号处是打的断点, 用CAN分析仪发数据过来, 我的代码却进不了接收中断, 确定是有数据过来的!
麻烦大家帮忙看看哪里搞错了, 非常感谢!!!


任风吹吹 发表于 2016-3-29 14:15:57

CAN的GPIO设置为上拉试下

潇湘剑雨 发表于 2016-3-29 14:59:33

我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了

星空22 发表于 2016-3-29 15:12:43

潇湘剑雨 发表于 2016-3-29 14:59
我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了 ...

我认为问题应该还是出在这两个脚的配置上面

星空22 发表于 2016-3-29 15:13:13

任风吹吹 发表于 2016-3-29 14:15
CAN的GPIO设置为上拉试下

上拉我试过了, 不行......

xmshao 发表于 2016-3-29 16:55:07

你先用 LOOP模式测试下,看软件配置有无问题;

NORMAL模式的话,两边要接好线路,匹配电阻也用上;

CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;===》改成
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; 验证下
不然你那边发过来的ID要跟这边FILTER设置的一模一样,否则收不到收据;

官方有CAN历程可以参考;

潇湘剑雨 发表于 2016-3-29 18:25:53

Loop没有问题的

潇湘剑雨 发表于 2016-3-29 18:38:18

我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找找其它的原因看,我的可以发可以收了

星空22 发表于 2016-3-29 19:23:19

潇湘剑雨 发表于 2016-3-29 18:38
我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找 ...

好吧,你用的是什么芯片,型号多少

星空22 发表于 2016-3-29 19:26:38

xmshao 发表于 2016-3-29 16:55
你先用 LOOP模式测试下,看软件配置有无问题;

NORMAL模式的话,两边要接好线路,匹配电阻也用上;


谢谢提示:)
页: [1] 2 3
查看完整版本: STM32F042K6的CAN接收中断进不去,求教