搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2013-8-10 20:47: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] != '\0')
                {
                                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\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[1]&0xe0)== 0x20)
                                                                {
                                                                        if(!(RX_ID[1] & 0x10))
                                                                        {
                                                                                CAN_Receive_Data(RX_Buffer1);
                                                                                Uart_Printf("net1_data:");
                                                                                Uart_Printf(RX_Buffer1);
                                                                                Uart_Printf("\n");
                                                                        }
                                                                       
                                                                }
                                                                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("\n");
                                                                        }
                                                                }
                                                }
                                                EA = 1;
                                }
                }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-8-11 14:01:00 | 显示全部楼层
怎么都没有人啊。

出0入0汤圆

 楼主| 发表于 2013-8-11 18:38:50 | 显示全部楼层

出0入0汤圆

发表于 2013-8-11 20:25:49 | 显示全部楼层
can总线挺难得

出0入0汤圆

发表于 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工具把你收发报数据抓个包分析下??

出0入0汤圆

 楼主| 发表于 2013-8-11 23:53:43 | 显示全部楼层
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工具是什么东西?

出0入0汤圆

 楼主| 发表于 2013-8-11 23:57:40 | 显示全部楼层
liuyang8023 发表于 2013-8-11 20:25
can总线挺难得

这个问题困扰好几天了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 16:28

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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