打印
[其他ST产品]

CAN在常规模式下无法进入中断函数

[复制链接]
1126|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七毛钱|  楼主 | 2024-7-29 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用的单片机为STM32F103VC,CAN 在回环模式下,可以正常收发。在常规模式下,可以发送数据,但无法收到数据,中断接收无法进入。以下为部分代码:
初始化:
{
        GPIO_InitTypeDef GPIO_InitStructure;         
        CAN_InitTypeDef  CAN_InitStructure;        
         CAN_FilterInitTypeDef  CAN_FilterInitStructure;        
           NVIC_InitTypeDef  NVIC_InitStructure;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);//使能PORTA时钟                 
          RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE);//使能CAN时钟        

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;        
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽   
    GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化IO   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;        
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入   
    GPIO_Init(GPIOA, &GPIO_InitStructure);                //初始化IO

        CAN_InitStructure.CAN_Prescaler = 24;//12;
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//CAN_Mode_LoopBack;
        CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
        CAN_InitStructure.CAN_BS1 = CAN_BS1_7tq;        
        CAN_InitStructure.CAN_BS2 = CAN_BS2_4tq;  //250Kbps  
        CAN_InitStructure.CAN_TTCM = DISABLE;    //非时间触发通信模式
        CAN_InitStructure.CAN_ABOM = DISABLE;    //软件自动离线管理        
        CAN_InitStructure.CAN_AWUM = DISABLE;        //睡眠模式通过软件唤醒(清除CAN->MCR的SLEEP位)
        CAN_InitStructure.CAN_NART = ENABLE;        //禁止报文自动传送
        CAN_InitStructure.CAN_RFLM = DISABLE;  //报文不锁定,新的覆盖旧的
        CAN_InitStructure.CAN_TXFP = DISABLE; //优先级由报文标识符决定
    CAN_Init(CAN1,&CAN_InitStructure);     // 初始化CAN1

        CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000;//32 位 ID
        CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
         CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000;//32 位 MASK
        CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;        
        CAN_FilterInitStructure.CAN_FilterNumber = 0;          //过滤器0
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FilterFIFO0; //过滤器0关联到FIFO0
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit;
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0
          CAN_FilterInit(&CAN_FilterInitStructure);//滤波器初始化

        CAN_ClearITPendingBit(CAN1,CAN_IT_FF0);
        CAN_ClearITPendingBit(CAN1,CAN_IT_FOV0);
    CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);  //FIFO0消息挂号中断允许            
        NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}

中断函数
void USB_LP_CAN1_RX0_IRQHandler(void)
{
    CAN_Receive(CAN1,CAN_FIFO0,&RxMessage);
}

   一直无法进入中断函数,救助.

使用特权

评论回复
沙发
两只袜子| | 2024-7-29 21:15 | 只看该作者
检查CAN控制器的配置是否正确

使用特权

评论回复
板凳
jcky001| | 2024-7-29 21:15 | 只看该作者
中断配置是否正确

使用特权

评论回复
地板
cr315| | 2024-7-29 21:16 | 只看该作者
检查是否有消息被发送,并且发送完成后应该触发中断。

使用特权

评论回复
5
elephant00| | 2024-7-29 21:16 | 只看该作者
利用调试器或逻辑分析仪等工具来监测CAN总线和微控制器的行为。

使用特权

评论回复
6
申小林一号| | 2024-7-29 22:36 | 只看该作者
感谢分享

使用特权

评论回复
7
申小林一号| | 2024-7-29 22:36 | 只看该作者
感谢分享

使用特权

评论回复
8
喂什么玩意| | 2024-7-31 11:42 | 只看该作者
STM32F103VC,CAN 在回环模式下,可以正常收发

使用特权

评论回复
9
AdaMaYun| | 2024-7-31 14:19 | 只看该作者
CAN 在回环模式下,可以正常收发,其他模式下应该也没问题才对呀,是不是配置问题

使用特权

评论回复
10
为你转身| | 2024-8-31 13:45 | 只看该作者
确保CAN总线上的通信速度与设置的波特率一致。

使用特权

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

本版积分规则

341

主题

2328

帖子

4

粉丝