WERWER 发表于 2013-8-10 20:47:31

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

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

uchar TX_ID1 = {0x00,0x20};                           //节点1地址
uchar RX_ID;                                                           //接收目标节点地址缓冲器
uchar RX_Buffer1="      ";                           //接收缓冲器1
uchar TX_ID2 = {0x00,0x40};                           //节点2地址
uchar RX_Buffer2="      ";                           //接收缓冲器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 != '\0')
                {
                                SendOneByte(Uart_Buffer);
                                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\n");
                CAN_Init();       
                Uart_Printf("chu_si_hu_cheng_gong\n");
                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&0xe0)== 0x20)
                                                                {
                                                                        if(!(RX_ID & 0x10))
                                                                        {
                                                                                CAN_Receive_Data(RX_Buffer1);
                                                                                Uart_Printf("net1_data:");
                                                                                Uart_Printf(RX_Buffer1);
                                                                                Uart_Printf("\n");
                                                                        }
                                                                       
                                                                }
                                                                if((RX_ID&0xe0) == 0x40)
                                                                {
                                                                        if(!(RX_ID & 0x10))
                                                                        {
                                                                                CAN_Receive_Data(RX_Buffer2);
                                                                                Uart_Printf("net2_data:");
                                                                                Uart_Printf(RX_Buffer2);
                                                                                Uart_Printf("\n");
                                                                        }
                                                                }
                                                }
                                                EA = 1;
                                }
                }
}

WERWER 发表于 2013-8-11 14:01:00

怎么都没有人啊。

WERWER 发表于 2013-8-11 18:38:50

{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}{:cry:}

liuyang8023 发表于 2013-8-11 20:25:49

can总线挺难得

ARMWAY 发表于 2013-8-11 21:52:00

RE:
1.我用定时器设定一定的时间 主机发送一个与节点1相同标识符的远程幀 t1 耗时=?
2.然后该节点本应该回复一个数据帧                                 t1-t2耗时=?
3.然后再过一段时间发送一个与节点2相同标识符的远程幀 t3=?
4.本来节点二这时候也会回一个数据帧的   t4=?

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



re:

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

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

总结 能不能使用USBcan工具把你收发报数据抓个包分析下??

WERWER 发表于 2013-8-11 23:53:43

ARMWAY 发表于 2013-8-11 21:52 static/image/common/back.gif
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 发表于 2013-8-11 23:57:40

liuyang8023 发表于 2013-8-11 20:25 static/image/common/back.gif
can总线挺难得

这个问题困扰好几天了。
页: [1]
查看完整版本: 基于CAN总线的多节点数据传输有点问题 求助啊