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

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

[复制链接]
weihl 提问时间:2016-3-29 12:08 /
STM32F042K6的CAN接收中断进不去,求教

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

01.jpg

02.jpg

03.jpg

05.jpg

04.jpg

下面是配置代码:

/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN通讯初始化
****名称: can_init();//
****作者:
*******************************************************************************/
void can_init(void)        //
{        
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        CAN_InitTypeDef  CAN_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分析仪发数据过来, 我的代码却进不了接收中断, 确定是有数据过来的!
麻烦大家帮忙看看哪里搞错了, 非常感谢!!!


收藏 评论21 发布时间:2016-3-29 12:08

举报

21个回答
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历程可以参考;

498187875 回答时间:2016-3-29 21:39:23
我今天也是一直在调F042的can,一直进不了中断,试了一楼的代码,还是不行,后面在端口复用前面加上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP;//PA11 and PA12 remap on QFN28 and TSSOP20 packages
这两行代码才行。还有波特率也搞错了,移植F1的代码,时钟用了36M的,改成用48M算,接收没问题了
weihl 回答时间:2016-3-30 09:15:03
隔壁家老王 发表于 2016-3-29 21:39
我今天也是一直在调F042的can,一直进不了中断,试了一楼的代码,还是不行,后面在端口复用前面加上
RCC_AP ...

朋友, 你用的片子应该是20Pin的吧, 按照参考手册上说的, 只有20pin的才需要加你说的这两句,我这个用的是32pin的...
任风吹吹 回答时间:2016-3-29 14:15:57
CAN的GPIO设置为上拉试下
潇湘剑雨 回答时间:2016-3-29 14:59:33
我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了
weihl 回答时间:2016-3-29 15:12:43
潇湘剑雨 发表于 2016-3-29 14:59
我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了 ...

我认为问题应该还是出在这两个脚的配置上面
weihl 回答时间:2016-3-29 15:13:13
任风吹吹 发表于 2016-3-29 14:15
CAN的GPIO设置为上拉试下

上拉我试过了, 不行......
潇湘剑雨 回答时间:2016-3-29 18:25:53
Loop没有问题的
潇湘剑雨 回答时间:2016-3-29 18:38:18
我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找找其它的原因看,我的可以发可以收了
weihl 回答时间:2016-3-29 19:23:19
潇湘剑雨 发表于 2016-3-29 18:38
我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找 ...

好吧,你用的是什么芯片,型号多少
weihl 回答时间:2016-3-29 19:26:38
xmshao 发表于 2016-3-29 16:55
你先用 LOOP模式测试下,看软件配置有无问题;

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

谢谢提示
潇湘剑雨 回答时间:2016-3-29 21:30:08
搞定了没,我找到你的原因了,滤波器设置的原因,只能接收到ID为0的消息
潇湘剑雨 回答时间:2016-3-29 21:31:09
芯片和你的一样,我刚发现,我用另外一个ID死活收不到数据,
潇湘剑雨 回答时间:2016-3-29 21:35:57
星空22 发表于 2016-3-29 19:23
好吧,你用的是什么芯片,型号多少

好像不对,还要研究下,我用USB CAN调试工具可以,但用I.MX6发出来的确收不到,发送的I.MX6能收到,哎
12下一页

所属标签

相似问题

官网相关资源

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