stm32f103调试can时碰到诡异的问题,寻求帮助

2019-03-23 18:54发布

在调试汽车can的时候碰到2个奇怪的问题,

问题1,主要我的控制器接入汽车can网络,并且stm32f103设置为normal模式,那么会导致整个车载can网络瘫痪,导致任何操作功能,比如玻璃窗全部升降失效
我把stm32f103的can模式调整为CAN_Mode_Silent就可以正常通讯

问题2,接收车载can数据的时候,大部分id的数据都可以正常接收,比如id为0x381车门控制信息可以正常接收,但是id为0x391的信息却只有1%的接受率,用淘宝买的usb-can的话,可以正常捕捉到0x391的id数据,不知道是哪里有问题
首先如果硬件有问题,那么为什么其他id可以正常接收,这个391的确无法接受,  如果是软件有问题,那么软件我精简到就一个can接收中段,只要收到391就用指示灯闪烁处理,结果没有看到指示灯闪烁, 在滤波器里面吧391改成381,马上可以收到数据,          现在真的无从下手了,为什么买来的usb-can正常,而且可以正常工作在normal模式,我的却不行,买来的usb-can可以接受到391这个id的消息,我的却只能接收到1%都不到,

附上我的初始化程序,哪位有经验的帮忙出个主意,到底是哪里的问题,尝试过各种滤波方式,全通过也试过,还是无法再接收中断里面接收到391的消息,

但是我用电脑usb-can发送id为391的消息给我的控制器,却可以接收到,唯独接到车上不行,


CAN_FilterInitTypeDef  CAN_FilterInitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    /* GPIOA and GPIO_LED clock enable */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);
    /* CAN Periph clock enable */
    /* Configure CAN pin: RX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* Configure CAN pin: TX */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    /* CAN register init */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
    CAN_DeInit(CAN1);
    CAN_StructInit(&CAN_InitStructure);
    /* CAN cell init */
    CAN_InitStructure.CAN_TTCM = DISABLE; //禁止时间触发通信模式
   CAN_InitStructure.CAN_ABOM = ENABLE; //,软件对CAN_MCR寄存器的INRQ位进行置1随后清0后,一旦硬件检测
                                         //到128次11位连续的隐性位,就退出离线状态。
   CAN_InitStructure.CAN_AWUM = DISABLE; //睡眠模式通过清除CAN_MCR寄存器的SLEEP位,由软件唤醒
   CAN_InitStructure.CAN_NART = DISABLE; //DISABLE;CAN报文只被发送1次,不管发送的结果如何(成功、出错或仲裁丢失)
   CAN_InitStructure.CAN_RFLM = DISABLE; //在接收溢出时FIFO未被锁定,当接收FIFO的报文未被读出,下一个收到的报文会覆盖原有
                                         //的报文
   CAN_InitStructure.CAN_TXFP = DISABLE; //发送FIFO优先级由报文的标识符来决定
                                         //CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;
    CAN_InitStructure.CAN_Mode = CAN_Mode_Silent; // CAN_Mode_Silent; //CAN硬件工作在正常模式
   CAN_InitStructure.CAN_SJW = CAN_SJW_4tq; //重新同步跳跃宽度4个时间单位
   CAN_InitStructure.CAN_BS1 = CAN_BS1_12tq; //时间段1为12个时间单位
   CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //时间段2为5个时间单位
   CAN_InitStructure.CAN_Prescaler = 40; //(pclk1/((1+8+7)*9)) = 72Mhz/16/9 = 500Kbits设定了一个时间单位的长度9


    CAN_Init(CAN1, &CAN_InitStructure);

    /* CAN filter init 过滤器初始化*/


    CAN_FilterInitStructure.CAN_FilterNumber =0; //指定了待初始化的过滤器0
    CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; //指定了过滤器将被初始化到的模式为标识符屏蔽位模式
   CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_16bit; //给出了过滤器位宽1个32位过滤器
   CAN_FilterInitStructure.CAN_FilterIdHigh =(0x391)  << 5; //用来设定过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个)
   CAN_FilterInitStructure.CAN_FilterIdLow =(0x391)  << 5; //用来设定过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
   CAN_FilterInitStructure.CAN_FilterMaskIdHigh =(0x391)  << 5; //用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其高段位,16位位宽时为第一个
   CAN_FilterInitStructure.CAN_FilterMaskIdLow =(0x391)  << 5; //用来设定过滤器屏蔽标识符或者过滤器标识符(32位位宽时为其低段位,16位位宽时为第二个
   CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_FIFO0; //设定了指向过滤器的FIFO0
    CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //使能过滤器
   CAN_FilterInit(&CAN_FilterInitStructure);

    /* CAN FIFO0 message pending interrupt enable */
    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //使能指定的CAN中断

此帖出自小平头技术问答
0条回答

一周热门 更多>