OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5574|回复: 11

STM32F103 CAN能接收分析仪发来的各种ID数据帧,但是与车载OBD连接后只能接收部分ID数据帧。出现这个问题是什么原因呢

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2017-8-4
在线时间
3 小时
发表于 2017-8-4 09:55:38 | 显示全部楼层 |阅读模式
1金钱
现象描述: 现象一、基于STM32F103C8T6单机CAN接收板,当CAN接收板与CAN分析仪连接通讯时,分析仪一帧一帧的发送数据给CAN接收板,CAN接收板能正确接收并解析出ID及数据;
       现象二、当CAN接收板与汽车上的OBD连接时,接收板只能接收少数几个(4个)ID数据帧。
产生现象二是由什么原因造成的呢。已经试过利用滤波器滤出自己需要的10个ID数据帧,但是CAN接收板还是只能接收到汽车OBD上固定的ID数据帧,请教各位大侠遇到过这种情况没呢?或者看看错误出现在什么地方呢?谢谢各位了。
CAN收发器电路图:




[img]file:///C:\Users\Administrator\Documents\Tencent Files\780501415\Image\C2C\_DB`P[FAZ_R`I[$[url=mailto@ZTZ932.png]D@ZTZ932.png[/url][/img]

CAN配置代码如下:
u32        std_id1=0X728,std_id2=0X621,std_id3=0X392,std_id4=0X390,std_id5=0X470,std_id6=0X50,std_id7=0X280,std_id8=0X320,std_id9=0X729,std_id10=0X570;//滤波ID
void        Configure_CAN_OBD(void)
{
  CAN_InitTypeDef        CAN_InitStructure;
  CAN_FilterInitTypeDef  CAN_FilterInitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,  ENABLE);       
         /* CAN register init */
  CAN_DeInit(CAN1);
  CAN_StructInit(&CAN_InitStructure);


  /* CAN cell init */
  CAN_InitStructure.CAN_TTCM=DISABLE;
  CAN_InitStructure.CAN_ABOM=ENABLE;
  CAN_InitStructure.CAN_AWUM=ENABLE;
  CAN_InitStructure.CAN_NART=DISABLE;
  CAN_InitStructure.CAN_RFLM=DISABLE;
  CAN_InitStructure.CAN_TXFP=DISABLE;
  CAN_InitStructure.CAN_Mode=CAN_Mode_Silent;//CAN_Mode_Normal;//;CAN_Mode_LoopBack//
  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
  CAN_InitStructure.CAN_BS1=CAN_BS1_3tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;
  CAN_InitStructure.CAN_Prescaler=12;
  CAN_Init(CAN1,&CAN_InitStructure);
       
       
  CAN_FilterInitStructure.CAN_FilterNumber=1;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=std_id1<<5;
  CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id2<<5;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
       
  CAN_FilterInitStructure.CAN_FilterNumber=2;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=std_id3<<5;
  CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id4<<5;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;       
  CAN_FilterInit(&CAN_FilterInitStructure);
       
  CAN_FilterInitStructure.CAN_FilterNumber=3;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=std_id5<<5;
  CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id6<<5;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);


  CAN_FilterInitStructure.CAN_FilterNumber=4;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=std_id7<<5;
  CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id8<<5;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);


  CAN_FilterInitStructure.CAN_FilterNumber=5;
  CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;
  CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
  CAN_FilterInitStructure.CAN_FilterIdHigh=std_id9<<5;
  CAN_FilterInitStructure.CAN_FilterIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterMaskIdHigh=std_id10<<5;
  CAN_FilterInitStructure.CAN_FilterMaskIdLow=0|CAN_ID_STD;
  CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;
  CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
  CAN_FilterInit(&CAN_FilterInitStructure);
       
  /* CAN FIFO0 message pending interrupt enable */
  CAN_ITConfig(CAN1,CAN_IT_FMP0, ENABLE);       
}




//CAN接收中断服务函数
u32        x0,x1,x2,x3,x4,x5,x6,x7;
u32        y1;
void USB_LP_CAN1_RX0_IRQHandler(void)
{
        CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
  CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //′óCAN2&#191;ú&#187;o3&#229;&#198;÷FIFO 0&#189;óê&#213;±¨&#206;&#196;μ&#189;RxMessage
        x0=RxMessage.Data[0];
        x1=RxMessage.Data[1];
        x2=RxMessage.Data[2];
        x3=RxMessage.Data[3];
        x4=RxMessage.Data[4];
        x5=RxMessage.Data[5];
        x6=RxMessage.Data[6];
        x7=RxMessage.Data[7];
        y1=RxMessage.StdId;
        CAN_FIFORelease(CAN1,CAN_FIFO0);                                         //&#199;&#229;&#214;D&#182;&#207;&#189;óê&#213;±ê&#214;&#190;       
}

最佳答案

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-8-6
在线时间
2 小时
发表于 2017-8-4 09:55:39 | 显示全部楼层
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
6
金钱
6
注册时间
2017-8-4
在线时间
3 小时
 楼主| 发表于 2017-8-4 10:00:16 | 显示全部楼层
有没有遇到过这个问题的大神啊?求指教。CAN收发器用的MC33901NEF。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-8-7 02:30:44 | 显示全部楼层
帮顶
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-8-6
在线时间
2 小时
发表于 2017-8-7 09:00:26 | 显示全部楼层

原子哥有没有遇到这种情况呢?从你的角度上面考虑,是硬件方面的还是软件上面的问题呢?
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2017-8-6
在线时间
2 小时
发表于 2017-8-7 09:04:57 | 显示全部楼层
CAN分析仪与汽车OBD最明显的区别是:CAN分析仪发送一条我收一条,而汽车OBD是一直连续发送。唯有这一点是最明显的区别呢。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2017-8-15
在线时间
0 小时
发表于 2017-8-15 10:57:54 | 显示全部楼层
中断接收的代码有问题,CAN_Receive调用后,接收FIFO当前的邮箱自动清除,你再调用CAN_FIFORelease会把FIFO里已接收还没处理的CAN消息清除,不建议这么用
回复

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2017-8-29 14:45:55 | 显示全部楼层
怎么解决的?我也遇到这个问题了,用CAN分析仪没问题,但是接到汽车的OBD接口上只能读取几个ID,另外的ID读取的很慢,不够实时,但是拿CAN分析仪看,原车在实时发,请问你的是什么问题?怎么解决的?
回复

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2017-8-29 14:46:00 | 显示全部楼层

怎么解决的?我也遇到这个问题了,用CAN分析仪没问题,但是接到汽车的OBD接口上只能读取几个ID,另外的ID读取的很慢,不够实时,但是拿CAN分析仪看,原车在实时发,请问你的是什么问题?怎么解决的?
合肥-文盲
回复

使用道具 举报

86

主题

984

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1850
金钱
1850
注册时间
2013-4-15
在线时间
163 小时
发表于 2017-8-29 15:05:10 | 显示全部楼层
我做的CAN缓冲区大小是50条CAN消息,是不是太小了?加到到150还是不行
回复

使用道具 举报

0

主题

62

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2017-10-6
在线时间
40 小时
发表于 2017-11-3 16:57:24 | 显示全部楼层
学习中,帮忙顶一下
小马过河,方知深浅。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2019-5-23
在线时间
11 小时
发表于 2019-5-23 17:18:20 | 显示全部楼层
帮顶!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-26 01:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表