STM32F042K6的CAN接收中断进不去,求教
STM32F042K6的CAN接收中断进不去,求教最近刚接触与CAN通讯相关的项目, 对着方面不是太了解, 在调STM32F042K6的CAN通讯驱动时, 死活进不了接收中断(发送中断是可以的), 希望大家不吝敕教,谢谢!!!
下面是配置代码:
/*******************************************************************************
****输入: 无
****输出: 无
****端口: CAN_RX~~PA11; CAN_TX~~PA12;
****说明: CAN通讯初始化
****名称: can_init();//
****作者:
*******************************************************************************/
void can_init(void) //
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
CAN_InitTypeDefCAN_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分析仪发数据过来, 我的代码却进不了接收中断, 确定是有数据过来的!
麻烦大家帮忙看看哪里搞错了, 非常感谢!!!
CAN的GPIO设置为上拉试下 我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了 潇湘剑雨 发表于 2016-3-29 14:59
我也用的这个芯片,比你的更惨点,我连发送数据都发不了,407用同样的代码就行,F042就不行了 ...
我认为问题应该还是出在这两个脚的配置上面 任风吹吹 发表于 2016-3-29 14:15
CAN的GPIO设置为上拉试下
上拉我试过了, 不行...... 你先用 LOOP模式测试下,看软件配置有无问题;
NORMAL模式的话,两边要接好线路,匹配电阻也用上;
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList;===》改成
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; 验证下
不然你那边发过来的ID要跟这边FILTER设置的一模一样,否则收不到收据;
官方有CAN历程可以参考;
Loop没有问题的 我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找找其它的原因看,我的可以发可以收了 潇湘剑雨 发表于 2016-3-29 18:38
我试了下你的代码,可以进接收中断的啊,发送也成功了,谢谢你的代码了,不然我还真不知道怎么折腾 ,你找 ...
好吧,你用的是什么芯片,型号多少 xmshao 发表于 2016-3-29 16:55
你先用 LOOP模式测试下,看软件配置有无问题;
NORMAL模式的话,两边要接好线路,匹配电阻也用上;
谢谢提示:)