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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版