打印
[STM32]

stm32单片机CAN组网,两个点时收到大量同样数据,单接正常

[复制链接]
1329|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
linda_6000|  楼主 | 2020-8-11 16:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 linda_6000 于 2020-8-11 16:35 编辑

STM32三块板组网,每板上带单片机与CAN接口,接口用TJA1051,每个板都接了120欧。
A号板为接收板,收到数据后通过串口传PC机。
                 if(G_canRec_STDID  == 0x000007f0)
                {//一号机到时,先发送机号再传数据
                                USART1->DR='N';
                                while((USART1->SR&0X40)==0);//等待发送结束
                                USART1->DR='.';
                                while((USART1->SR&0X40)==0);//等待发送结束
                                USART1->DR='1';
                                while((USART1->SR&0X40)==0);//等待发送结束
                                USART1->DR='-';
                                while((USART1->SR&0X40)==0);//等待发送结束
                    }else{
                                if(G_canRec_STDID  == 0x000007f6)
                                {//二号机的情况
        
                                        USART1->DR='N';
                                        while((USART1->SR&0X40)==0);//等待发送结束
                                        USART1->DR='.';
                                        while((USART1->SR&0X40)==0);//等待发送结束
                                        USART1->DR='2';
                                        while((USART1->SR&0X40)==0);//等待发送结束
                                        USART1->DR='-';
                                        while((USART1->SR&0X40)==0);//等待发送结束
                                }
                        }
                        for(t=0;t<8;t++)
                        {
                                if(Tx20Message[t])
                                {
                                        USART1->DR=Tx20Message[t];
                                        while((USART1->SR&0X40)==0);//等待发送结束
                                }
                        }
                        USART1->DR=0xd;
                        while((USART1->SR&0X40)==0);//等待发送结束
                        USART1->DR=0xa;
                                while((USART1->SR&0X40)==0);//等待发送结束
                                                USART_RX_STA = USART_RX_STA -0x2000;
B板 发送单片机处的设置
       CNT = ‘0’;
        if(CAN_RECFLAG & 0x8008)
        {
                        TxMessage.Data[0]=CNT++;
                        if(CNT >= 'z')//这里是为了给数据一个序号,这样接收到同一包数据时会看到
                                CNT ='0';
                        
                        TxMessage.StdId=0xfe00>>5;
                        TxMessage.IDE=CAN_ID_STD;
                        //数据帧
                        TxMessage.RTR=CAN_RTR_DATA;
                        
                        TxMessage.DLC=8;
                        G__send_pack_deal(&TxMessage.Data[1],G_data); //传感器接收的数据打包到CAN发送数组
                        //CAN 发送数据
                        CAN_Transmit(CAN1,&TxMessage);        
                        CAN_RECFLAG =0;                        
                }

C板 是另一路CAN板,除了ID号不一样外,一切都一样,它也是将接收到的传感器数据发送到CAN,因为其ID号大些,所以优先级低一点
TxMessage.StdId=0xfeC0>>5;

单独接一个板如A板只接B板,或是A只接C板,都很可靠,发现数据是从0序号开始一个个上来。但是如果将三个板的CANH接一起,CANL接一起就会出现B板的数据快速上来许多,都是0序号的,然后又都是1序号的。偶尔会
上来一个C号板的数据。说明同时接是可以接到两个板的数据的,只是B号板为什么快速的上来那么多包,是反射吗?电路应做什么调整?
三个板共用电源,用近一米五的线接的。CANH与CANL是先用近一米五的线从A接到B板再接到C板也是近一米五的长。是线太长了吗?
请高手指教!

使用特权

评论回复

相关帖子

沙发
linda_6000|  楼主 | 2020-8-11 16:36 | 只看该作者
在线等!

使用特权

评论回复
板凳
ayb_ice| | 2020-8-11 16:37 | 只看该作者
地址不能一样吧

使用特权

评论回复
地板
linda_6000|  楼主 | 2020-8-11 16:43 | 只看该作者
ayb_ice 发表于 2020-8-11 16:37
地址不能一样吧

地址是不一样的,ID号是不一样的呀

使用特权

评论回复
5
linda_6000|  楼主 | 2020-8-11 16:44 | 只看该作者
一个ID号是0xfeC0>>5; 另一个是0xfe00>>5;

使用特权

评论回复
6
linda_6000|  楼主 | 2020-8-11 16:46 | 只看该作者
有遇到这样问题的吗?

使用特权

评论回复
7
ayb_ice| | 2020-8-11 16:58 | 只看该作者
linda_6000 发表于 2020-8-11 16:44
一个ID号是0xfeC0>>5; 另一个是0xfe00>>5;

首先要正确设置自己的ID才有用

使用特权

评论回复
8
linda_6000|  楼主 | 2020-8-12 13:55 | 只看该作者
ayb_ice 发表于 2020-8-11 16:58
首先要正确设置自己的ID才有用

是因为我没有设置过滤器吗?什么叫正确设置自己的ID?

使用特权

评论回复
9
ayb_ice| | 2020-8-12 14:21 | 只看该作者
linda_6000 发表于 2020-8-12 13:55
是因为我没有设置过滤器吗?什么叫正确设置自己的ID?

就是那个东西

使用特权

评论回复
10
linda_6000|  楼主 | 2020-8-13 12:00 | 只看该作者
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
u16 std_id1 =0x7f0;
u32 std_id2 =0x7f6;
CAN_FilterInit(&CAN_FilterInitStructure); //初始化CAN_FilterInitStructrue结构体变量  
CAN_FilterInitStructure.CAN_FilterNumber=0;     //设置过滤器组0,范围为0~13  
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdList;    //设置过滤器组0为标识符列表模式  
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;   //设置过滤器组0位宽为32位  
  
//设置屏蔽寄存器,这里当标识符寄存器用  
CAN_FilterInitStructure.CAN_FilterIdHigh=(std_id1<<5) ;  //设置标识符寄存器高字节  
CAN_FilterInitStructure.CAN_FilterIdLow=(std_id2<<5) ;  //设置标识符寄存器高字节  
  
//设置标识符寄存器  
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(0x7f1<<5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow=(0x7f2<<5);
  
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=CAN_FIFO0;  //此过滤器组关联到接收FIFO0  
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; //激活此过滤器组  
CAN_FilterInit(&CAN_FilterInitStructure); //设置过滤器  
这样设置了,但还是收到许多一样的数据

使用特权

评论回复
11
ayb_ice| | 2020-8-13 13:03 | 只看该作者
linda_6000 发表于 2020-8-13 12:00
CAN_FilterInitTypeDef  CAN_FilterInitStructure;
u16 std_id1 =0x7f0;
u32 std_id2 =0x7f6;

//设置标识符寄存器  
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=(0x7f1<<5);
CAN_FilterInitStructure.CAN_FilterMaskIdLow=(0x7f2<<5);

你这寄存器都用错了,

使用特权

评论回复
12
linda_6000|  楼主 | 2020-8-13 13:05 | 只看该作者

我进行了滤波器的设置,是列表模式的,还是出现许多的低ID的同样的数据,不知道为什么,单独接都是一个一个上来的。

使用特权

评论回复
13
ayb_ice| | 2020-8-13 13:25 | 只看该作者
linda_6000 发表于 2020-8-13 13:05
我进行了滤波器的设置,是列表模式的,还是出现许多的低ID的同样的数据,不知道为什么,单独接都是一个一 ...

有扩展模式,和标准模式,你的设置显然不正确
高低组成一个扩展模式,如果只用标准模式,高的必须为0

使用特权

评论回复
14
linda_6000|  楼主 | 2020-8-13 13:50 | 只看该作者
ayb_ice 发表于 2020-8-13 13:25
有扩展模式,和标准模式,你的设置显然不正确
高低组成一个扩展模式,如果只用标准模式,高的必须为0 ...

我中断程序中没有清除标志,是这个原因吧,但是我清楚了下面的标志后还是不行,是不是应清除更多的标志呢?
进入中断后
CAN_ClearITPendingBit(CAN1,CAN_IT_FMP0);
接数据
CAN_FIFORelease(CAN1,CAN_FIFO0);//释放FIFO0

使用特权

评论回复
15
ayb_ice| | 2020-8-13 14:03 | 只看该作者
linda_6000 发表于 2020-8-13 13:50
我中断程序中没有清除标志,是这个原因吧,但是我清楚了下面的标志后还是不行,是不是应清除更多的标志呢 ...

建议你先搞懂滤波器的作用,怎么设置吧

这东西就是地址,通过设置可以接收所有消息,也可以接收一部分消息

使用特权

评论回复
16
泰山特曲123| | 2020-8-13 18:17 | 只看该作者
你程序里设想的发送周期是多少?不会是一直发吧?另外,CAN总线只需要两短接终端电阻,不需要三端都接

使用特权

评论回复
17
一路向北lm| | 2020-8-17 10:33 | 只看该作者
加、rtos 线层管理

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

96

帖子

1

粉丝