在调试汽车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中断
此帖出自
小平头技术问答
一周热门 更多>