你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

CAN无法 进入中断函数

[复制链接]
cpev 提问时间:2018-3-13 16:07 /
我用的单片机为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);
}

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

收藏 评论9 发布时间:2018-3-13 16:07

举报

9个回答
bargagebaobei 回答时间:2018-3-13 16:15:56
1.首先,楼主要知道在正常模式下,can总线需要有接收端才可以,也就是说只有你这一块板子是不可以调试正常模式的
2.过滤器设置之后,确认帧ID相符否
3.请问楼主如何确认自己已经发送数据了呢?是通过示波器看到了吗?

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

cpev 回答时间:2018-3-13 16:28:56
bargagebaobei 发表于 2018-3-13 16:15
1.首先,楼主要知道在正常模式下,can总线需要有接收端才可以,也就是说只有你这一块板子是不可以调试正常 ...

我是用板子连接USBCAN,在CANTest软件上可以看到板子发出的报文,再通过USBCAN发送报文,板子无法收到。
bargagebaobei 回答时间:2018-3-13 16:33:29
cpev 发表于 2018-3-13 16:28
我是用板子连接USBCAN,在CANTest软件上可以看到板子发出的报文,再通过USBCAN发送报文,板子无法收到。 ...

用示波器看板子接收端的波形了吗
cpev 回答时间:2018-3-13 16:34:24
bargagebaobei 发表于 2018-3-13 16:33
用示波器看板子接收端的波形了吗

看到了,接收端用波形的
回答时间:2018-3-13 16:35:21
看配置是没问题。总线是否加了120欧姆的电阻,没有就加一个试试。

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

bargagebaobei 回答时间:2018-3-13 16:35:33
cpev 发表于 2018-3-13 16:34
看到了,接收端用波形的

是在电平转换芯片到usbcan那段还是在arm的rx引脚上看见的啊
butterflyspring 回答时间:2018-3-13 16:50:41
首先确定中断是否开启,包括外设时钟,然后调试,看看中断标志位是否被置一,如果被置一了,但是没有中断响应,是否映射不对...就按这个路子走咯...

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

toofree 回答时间:2018-3-13 18:05:44
本帖最后由 toofree 于 2018-3-13 18:22 编辑

刚看了V3.1.2的固件库样例程序,验收滤波字设置是对的。
请先跑一下样例程序,我试过V3.1.2的库,V3.5的库应该也能行。
“STM32F10x_StdPeriph_Lib_V3.1.2\Project\STM32F10x_StdPeriph_Examples\CAN\Normal”
傲游截图20180313182101.png

这个样例程序,我在刚学STM32的时候测试过没有问题。虽然年代有几久,但是我打包好的程序,确定是没有问题的。
傲游截图20180313181841.png


——————————————— 以下内容请忽略 ——————————————————
看一下你的接收滤波设置的对吗?感觉不太对呀,好多年没搞过CAN了。
你把这些设成0xff,试试。目的就是不滤波,只要总线上发送给所有ID的的数据,全接收。
傲游截图20180313175926.png ———————————————  内容请忽略,第一次回贴内容  ———————————

评分

参与人数 1蝴蝶豆 +4 收起 理由
zero99 + 4

查看全部评分

leo.li 回答时间:2019-2-28 11:30:25
不是说解决了吗,什么问题呀

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版