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;
}
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1.我用定时器设定一定的时间 主机发送一个与节点1相同标识符的远程幀 t1 耗时=?
2.然后该节点本应该回复一个数据帧 t1-t2耗时=?
3.然后再过一段时间发送一个与节点2相同标识符的远程幀 t3=?
4.本来节点二这时候也会回一个数据帧的 t4=?
把上面几个写出来 或者用逻辑分析仪抓一下,网上有很便宜的 才40元不到!
另外 你缺少节点地址 本机addr多少=? 节点1addr=?节点2addr=?
re:
1.但是现在的现象是 节点1有收到远程幀而且在不断的发数据 --现象上看 节点1总是收到你发送的数据
但是节点二收到一个远程幀后只发出一个数据帧后就不在发数据了 ,而主机收不到任何数据 --节点可能偶尔1次收到数据
总结 能不能使用USBcan工具把你收发报数据抓个包分析下??
节点地址都没有错 我是写在一个.c文件中,节点1地址: 0x00,0x20 节点2地址:0x00,0x40 主机地址 0x00,0x60
我这粘贴的只是主机的处理的主函数,发送到节点1和到节点2的耗时是一样的 ,因为我是time 刚好等于50标志位才将节点1的标志位置1 刚好等于一百才将节点二的标志位置一,定时器工作在模式一16位定时模式time==50的话 大概就是1秒左右啊
USBcan工具是什么东西?
这个问题困扰好几天了。
一周热门 更多>