基于CAN总线的多节点数据传输有点问题 求助啊

2020-01-27 11:31发布

51+MCP2515+TJA1050
当我单节点通讯的时候是一切正常的 。当我使用两个节点时 我是这样设计的      我用定时器设定一定的时间 主机发送一个与节点1相同标识符的远程幀  然后该节点本应该回复一个数据帧  然后再过一段时间发送一个与节点2相同标识符的远程幀 ,本来节点二这时候也会回一个数据帧的   但是现在的现象是 节点1有收到远程幀而且在不断的发数据  但是节点二收到一个远程幀后只发出一个数据帧后就不在发数据了  ,而主机收不到任何数据。这是怎么回事呢?我只用发送缓冲器0且禁止了滚存   波特率也有设一样    。好痛苦啊    我主机的程序如下:
#include<reg52.h>
#include <intrins.h>
#include"main.h"

uchar TX_ID1[2] = {0x00,0x20};                           //节点1地址
uchar RX_ID[2];                                                           //接收目标节点地址缓冲器
uchar RX_Buffer1[9]="        ";                           //接收缓冲器1
uchar TX_ID2[2] = {0x00,0x40};                           //节点2地址
uchar RX_Buffer2[9]="        ";                           //接收缓冲器2

uchar inter;
uint time;
bit TX1_flag = 0 ;
bit RX_flag = 0;
bit TX2_flag = 0 ;

void Time0_Init(void)
{
                TMOD = (TMOD & 0xfc)|0x01;
                TH0 = 0x0B8;
            TL0 = 0x00;
                   ET0 = 1;
               TR0 = 1;
}

void InitUART(void)
{
    TMOD = (TMOD & 0xcf)|0x20;               //波特率9600
    SCON = 0x50;
    TH1 = 0xFD;
    TL1 = TH1;
    PCON = 0x00;
    TR1 = 1;
}

void SendOneByte(uchar c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}

void Uart_Printf(uchar *Uart_Buffer)
{
                uint i=0;
                while(Uart_Buffer[i] != '')
                {
                                SendOneByte(Uart_Buffer[i]);
                                i++;
                }
}

void init_mcu(void)
{
    IT0 = 0;             //MCU外部中断INT0设置为电平触发
    EX0 = 1;             //开MCU外部中断INT0
    EA = 1;              //开MCU总中断       
}

void inter0_can_rxd(void) interrupt 0 using 1
{
          IE0 = 0;
                RX_flag = 1;
}

void Timer0Interrupt(void) interrupt 1 using 2
{
    TH0 = 0xB8;
    TL0 = 0x00;
                time++;
                if(time == 50)
                {
                                TX1_flag = 1;
                }
                if(time == 100)
                {
                                TX2_flag = 1;
                                time = 0;
                }
}

void main()
{
                InitUART();
                Time0_Init();
                Uart_Printf("chu_si_hu_MCP2515 ");
                CAN_Init();       
                Uart_Printf("chu_si_hu_cheng_gong ");
                init_mcu();
                while(1)
                {
                                if(TX1_flag == 1)
                                {
                                                TX1_flag = 0;
                                                CAN_Send_RTR(TX_ID1);                 //发送远程幀   对节点1
                                }
                                if(TX2_flag == 1)
                                {
                                                TX2_flag = 0;
                                                CAN_Send_RTR(TX_ID2);                 //发送远程幀        对节点2
                                }
                                if(RX_flag)                                                         //主机中断接收到数据
                                {
                                                RX_flag = 0;
                                                EA = 0;
                                                inter = SPIByteRead(CANINTF);
                                                if(inter & 0x01)
                                                {
                                                                BitModiMcp2515(CANINTF,0x01,0x00);
                                                                CAN_Receive_ID(RX_ID);
                                                                if((RX_ID[1]&0xe0)== 0x20)
                                                                {
                                                                        if(!(RX_ID[1] & 0x10))
                                                                        {
                                                                                CAN_Receive_Data(RX_Buffer1);
                                                                                Uart_Printf("net1_data:");
                                                                                Uart_Printf(RX_Buffer1);
                                                                                Uart_Printf(" ");
                                                                        }
                                                                       
                                                                }
                                                                if((RX_ID[1]&0xe0) == 0x40)
                                                                {
                                                                        if(!(RX_ID[1] & 0x10))
                                                                        {
                                                                                CAN_Receive_Data(RX_Buffer2);
                                                                                Uart_Printf("net2_data:");
                                                                                Uart_Printf(RX_Buffer2);
                                                                                Uart_Printf(" ");
                                                                        }
                                                                }
                                                }
                                                EA = 1;
                                }
                }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
WERWER
1楼-- · 2020-01-27 16:19
怎么都没有人啊。
WERWER
2楼-- · 2020-01-27 21:03
liuyang8023
3楼-- · 2020-01-27 22:25
 精彩回答 2  元偷偷看……
ARMWAY
4楼-- · 2020-01-28 00:51
RE:
1.我用定时器设定一定的时间 主机发送一个与节点1相同标识符的远程幀 t1 耗时=?
2.然后该节点本应该回复一个数据帧                                 t1-t2耗时=?
3.然后再过一段时间发送一个与节点2相同标识符的远程幀 t3=?
4.本来节点二这时候也会回一个数据帧的   t4=?

把上面几个写出来 或者用逻辑分析仪抓一下,网上有很便宜的 才40元不到!
另外 你缺少节点地址 本机addr多少=? 节点1addr=?节点2addr=?



re:

1.但是现在的现象是 节点1有收到远程幀而且在不断的发数据  --现象上看 节点1总是收到你发送的数据

但是节点二收到一个远程幀后只发出一个数据帧后就不在发数据了  ,而主机收不到任何数据 --节点可能偶尔1次收到数据

总结 能不能使用USBcan工具把你收发报数据抓个包分析下??
WERWER
5楼-- · 2020-01-28 02:41
ARMWAY 发表于 2013-8-11 21:52
RE:
1.我用定时器设定一定的时间 主机发送一个与节点1相同标识符的远程幀 t1 耗时=?
2.然后该节点本应该 ...

节点地址都没有错  我是写在一个.c文件中,节点1地址:  0x00,0x20    节点2地址:0x00,0x40   主机地址  0x00,0x60   
我这粘贴的只是主机的处理的主函数,发送到节点1和到节点2的耗时是一样的 ,因为我是time 刚好等于50标志位才将节点1的标志位置1  刚好等于一百才将节点二的标志位置一,定时器工作在模式一16位定时模式time==50的话 大概就是1秒左右啊
USBcan工具是什么东西?
WERWER
6楼-- · 2020-01-28 08:07
liuyang8023 发表于 2013-8-11 20:25
can总线挺难得

这个问题困扰好几天了。

一周热门 更多>