关于can模块的发送报文问题。
时间:10-02
整理:3721RD
点击:
本人使用英飞凌的xc886单片机,此单片机内含muliCAN模块。请教下:can发送报文能连续发多个报文吗(非FIFO模式,就是一帧一帧的发)?因为我写了个例子:发送方:用报文1、2、3发送数据;接收方:用报文1、2、3接收,结果只有报文1收到数据,另两个没收到(报文ID,优先级按列表顺序,)。
发送方:
部分主程序
CAN_vLoadData(1,MO1);
CAN_vLoadData(2,MO2);
CAN_vLoadData(3,MO3);
CAN_vTransmit(1);
部分中断程序
switch(sucCanNum)
{
case 0: CAN_vTransmit(2);
sucCanNum++;
Tr_flag++;
break;
case 1:
CAN_vTransmit(3);
sucCanNum++;
Tr_flag++;
break;
case 2:
sucCanNum++;
Tr_flag++;
break;
}
接收方
部分中断程序
switch(sucCanNum)
{
case 0:
CAN_vWriteCANAddress(CAN_MODATAL1);
CAN_vReadEN();
MO1L.ubDB[3]=CAN_DATA0;
MO1L.ubDB[2]=CAN_DATA1;
MO1L.ubDB[1]=CAN_DATA2;
MO1L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO1H.ubDB[3]=CAN_DATA0;
MO1H.ubDB[2]=CAN_DATA1;
MO1H.ubDB[1]=CAN_DATA2;
MO1H.ubDB[0]=CAN_DATA3;
sucCanNum++;
CAN_vWriteCANAddress(CAN_MOCTR1);
CAN_vWriteAMData(0x000000A0); // 清零MSGVAL
break;
case 1:
CAN_vWriteCANAddress(CAN_MODATAL2);
CAN_vReadEN();
MO2L.ubDB[3]=CAN_DATA0;
MO2L.ubDB[2]=CAN_DATA1;
MO2L.ubDB[1]=CAN_DATA2;
MO2L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO2H.ubDB[3]=CAN_DATA0;
MO2H.ubDB[2]=CAN_DATA1;
MO2H.ubDB[1]=CAN_DATA2;
MO2H.ubDB[0]=CAN_DATA3;
sucCanNum++;
CAN_vWriteCANAddress(CAN_MOCTR2);
CAN_vWriteAMData(0x00000020); // 清零MSGVAL
break;
case 2:
CAN_vWriteCANAddress(CAN_MODATAL3);
CAN_vReadEN();
MO3L.ubDB[3]=CAN_DATA0;
MO3L.ubDB[2]=CAN_DATA1;
MO3L.ubDB[1]=CAN_DATA2;
MO3L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO3H.ubDB[3]=CAN_DATA0;
MO3H.ubDB[2]=CAN_DATA1;
MO3H.ubDB[1]=CAN_DATA2;
MO3H.ubDB[0]=CAN_DATA3;
sucCanNum=0;
break;
}
发送方:
部分主程序
CAN_vLoadData(1,MO1);
CAN_vLoadData(2,MO2);
CAN_vLoadData(3,MO3);
CAN_vTransmit(1);
部分中断程序
switch(sucCanNum)
{
case 0: CAN_vTransmit(2);
sucCanNum++;
Tr_flag++;
break;
case 1:
CAN_vTransmit(3);
sucCanNum++;
Tr_flag++;
break;
case 2:
sucCanNum++;
Tr_flag++;
break;
}
接收方
部分中断程序
switch(sucCanNum)
{
case 0:
CAN_vWriteCANAddress(CAN_MODATAL1);
CAN_vReadEN();
MO1L.ubDB[3]=CAN_DATA0;
MO1L.ubDB[2]=CAN_DATA1;
MO1L.ubDB[1]=CAN_DATA2;
MO1L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO1H.ubDB[3]=CAN_DATA0;
MO1H.ubDB[2]=CAN_DATA1;
MO1H.ubDB[1]=CAN_DATA2;
MO1H.ubDB[0]=CAN_DATA3;
sucCanNum++;
CAN_vWriteCANAddress(CAN_MOCTR1);
CAN_vWriteAMData(0x000000A0); // 清零MSGVAL
break;
case 1:
CAN_vWriteCANAddress(CAN_MODATAL2);
CAN_vReadEN();
MO2L.ubDB[3]=CAN_DATA0;
MO2L.ubDB[2]=CAN_DATA1;
MO2L.ubDB[1]=CAN_DATA2;
MO2L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO2H.ubDB[3]=CAN_DATA0;
MO2H.ubDB[2]=CAN_DATA1;
MO2H.ubDB[1]=CAN_DATA2;
MO2H.ubDB[0]=CAN_DATA3;
sucCanNum++;
CAN_vWriteCANAddress(CAN_MOCTR2);
CAN_vWriteAMData(0x00000020); // 清零MSGVAL
break;
case 2:
CAN_vWriteCANAddress(CAN_MODATAL3);
CAN_vReadEN();
MO3L.ubDB[3]=CAN_DATA0;
MO3L.ubDB[2]=CAN_DATA1;
MO3L.ubDB[1]=CAN_DATA2;
MO3L.ubDB[0]=CAN_DATA3;
CAN_ADCON = ADR_INC;
CAN_vReadEN();
MO3H.ubDB[3]=CAN_DATA0;
MO3H.ubDB[2]=CAN_DATA1;
MO3H.ubDB[1]=CAN_DATA2;
MO3H.ubDB[0]=CAN_DATA3;
sucCanNum=0;
break;
}
首先 CAN发送和串口发送有些地是相似的,发送都需要时间。
发送你用的是几个ID,我看不出来。但是你用了3个邮箱。也是可以的。发送不同的ID用同一个邮箱也是可以的。发送前先初始化邮箱。
对于接收,你这样写是有问题的。
应该是这样,接收一般只有一个邮箱就可以了。
中断接收,然后判断接收的ID,并提取数据区。
应该这样
中断服务irq
{
CAN_vReadEN();
MO1H.ubDB[3]=CAN_DATA0;
MO1H.ubDB[2]=CAN_DATA1;
MO1H.ubDB[1]=CAN_DATA2;
MO1H.ubDB[0]=CAN_DATA3;
然后判断接收的ID。
}
3q!其实我用的是3个报文发送,3个报文的ID是一样的。接收也是3个报文,ID也一样。其实我开始想法是:发送方用报文1.报文2,报文3发3帧数据,然后接收方对应地用报文1,报文2,报文3接收。结果按上面写后,只有接收方报文1收到了发送方报文1的数据,报文2、3没收到。不知咋回事?
你好,我也面临了相同的问题。不知道您最后解决了没有。挖出了您这么久之前的帖子,真不好意思!
