哪位大神帮忙看一下STM32F1 can通讯会死机的问题

2019-12-16 22:36发布

单片机为STM32F103,CAN通讯波特率设置为250Kbps,使用库函数做的。

正常小数据通讯的时候没有问题,但是大量帧数据连续下发的时候,CAN有时候就收不到数据,这是怎么回事呢?哪位大婶帮帮忙。

以下是初始化程序
void CAN_Config(void)//初始化配置
{
        GPIO_InitTypeDef GPIO_InitStructure;
        CAN_InitTypeDef CAN_InitStructure;
        CAN_FilterInitTypeDef CAN_FilterInitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOD,ENABLE);
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1 ,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD,&GPIO_InitStructure);
       
        GPIO_PinRemapConfig(GPIO_Remap2_CAN1,ENABLE);

        CAN_DeInit(CAN1);
        CAN_StructInit(&CAN_InitStructure);
        CAN_InitStructure.CAN_TTCM = DISABLE;
        CAN_InitStructure.CAN_ABOM = DISABLE;
        CAN_InitStructure.CAN_AWUM = DISABLE;
        CAN_InitStructure.CAN_NART = DISABLE;
        CAN_InitStructure.CAN_RFLM = DISABLE;
        CAN_InitStructure.CAN_TXFP = DISABLE;
        CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
        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 = 9;
        CAN_Init(CAN1,&CAN_InitStructure);
       
        CAN_FilterInitStructure.CAN_FilterNumber = 0;
        CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask;
        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 = CAN_Filter_FIFO0;
        CAN_FilterInitStructure.CAN_FilterActivation = ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);
        CAN_ITConfig(CAN1,CAN_IT_FMP0,ENABLE);
}
以下是CAN中断程序:
void CAN1_RX0_IRQHandler(void)
{
        u8 i;
        CAN_Receive(CAN1,CAN_FIFO0,&CAN_Rr_Message);
        ID_Source = (CAN_Rr_Message.ExtId)>>21;
        ID_aim                = (CAN_Rr_Message.ExtId)>>13;
        ID_cnt                 =        (CAN_Rr_Message.ExtId)>>5;
        if((ID_Source ==  0x01 || ID_Source ==  0x00)        && ID_aim == 0xff)
        {
                for(i=0;i<CAN_Rr_Message.DLC;i++)
                {
                        USART1Buffer[i+8*ID_cnt]=CAN_Rr_Message.Data[i];
                }
                if(USART1Count > 2000)USART1Count = 0;       
                if((8*ID_cnt+CAN_Rr_Message.DLC)>USART1Count)USART1Count=8*ID_cnt + CAN_Rr_Message.DLC;
                if((CAN_Rr_Message.ExtId & 0x10)==0)
                {
                        CAN_Data_Handler();//此处为协议处理
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
zhenglingo
1楼-- · 2019-12-17 20:15
CAN_InitStructure.CAN_ABOM = DISABLE;  这个ENABLE试试,现场有干扰达到一定的错误后总线会自动关闭,这个打开总线在进入错误后会自动恢复通信。
snailmoving
2楼-- · 2019-12-17 21:32
zhenglingo 发表于 2015-10-19 17:29
CAN_InitStructure.CAN_ABOM = DISABLE;  这个ENABLE试试,现场有干扰达到一定的错误后总线会自动关闭,这个 ...

好,我试试
NanceMichael
3楼-- · 2019-12-18 00:34
楼主的问题解决了吗?我很想知道结果和过程。
snailmoving
4楼-- · 2019-12-18 04:45
NanceMichael 发表于 2015-10-20 14:51
楼主的问题解决了吗?我很想知道结果和过程。

还没呢,等售后过去再去试,如果解决了,发上来告诉你。
苹果520
5楼-- · 2019-12-18 04:49
 精彩回答 2  元偷偷看……
snailmoving
6楼-- · 2019-12-18 08:00
苹果520 发表于 2016-5-28 14:25
楼主,问题解决了没?????????????????
等着你分享呢
我也遇到类似的问题添加看门狗还是 ...

我的问题,很奇怪,我初始化了CAN接收中断,没有配置NVIC,但我也没有使用CAN中断。结果就死机,然后我把NVIC配置了就可以了。

一周热门 更多>