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

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个回答
琦子 回答时间: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发送报文,板子无法收到。
琦子 回答时间: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

查看全部评分

琦子 回答时间: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

查看全部评分

七哥 回答时间: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

查看全部评分

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

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版