微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于can模块的发送报文问题。

关于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发送和串口发送有些地是相似的,发送都需要时间。
发送你用的是几个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没收到。不知咋回事?

你好,我也面临了相同的问题。不知道您最后解决了没有。挖出了您这么久之前的帖子,真不好意思!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top