如何解决CAN连接错误?

时间:2018-09-10 09:10:22

标签: can-bus automotive

我是汽车领域的新手,我正在尝试与CAN盒和aurix板之间的can总线建立连接,并使用CANoe软件监视此连接。

我只是试图通过can总线从套件中发送一次简单的消息,作为开始只是为了测试连接并确保它能正常工作,然后再继续进行其余的应用程序。

但是我在CANoe上从套件中收到的都是诸如表格错误,填充错误,CRC错误,CAN重载帧之类的错误。

我多次检查板上的罐子引脚以确保它们正确无误,还尝试更改CAN盒上使用的CAN通道,甚至检查了电线,并且一切似乎都已正确连接。

而我使用的软件只是我在TASKING编译器演示中的演示,该演示在与我使用的工具包相关的文件中找到,因此我可以认为这没有错。 我遵循的获取此演示文稿的步骤很简单

  1. 使用TASKING IDE中的软件平台构建器将与该套件相关的文件附加到项目中。
  2. 将CAN驱动程序文件包含在“ IfxMultican_Can.h”中
  3. 然后,我将该头文件内文档中的代码复制并粘贴到我的项目中。

我做了一切我想得到的工作,但仍然存在相同的错误,因此要么连接出错了,要么是TASKING IDE随附的驱动程序代码包含错误,而系统中没有其他内容。 / p>

我用于该项目的代码是

#include <stdio.h>
#include "SoftwarePlatform/illd_tc29xb/src/ifx/TC29xB/Multican/Can/IfxMultican_Can.h"

// CAN handle
IfxMultican_Can can;

// Nodes handles
IfxMultican_Can_Node canSrcNode;
IfxMultican_Can_Node canDstNode;

// Message Object handles
IfxMultican_Can_MsgObj canSrcMsgObj;
IfxMultican_Can_MsgObj canDstMsgObj;

const unsigned id = 0x100;

int main(){
    // create configuration
    IfxMultican_Can_Config canConfig;
    IfxMultican_Can_initModuleConfig(&canConfig, &MODULE_CAN);

    //initialize module
    //IfxMultican_Can can; // defined globally
    IfxMultican_Can_initModule(&can, &canConfig);

    // create CAN node config
    IfxMultican_Can_NodeConfig canNodeConfig;
    IfxMultican_Can_Node_initConfig(&canNodeConfig, &can);

    canNodeConfig.baudrate = 1000000; // 1 MBaud

    // Source Node
    // IfxMultican_Can_Node canSrcNode; // defined globally
    {
        canNodeConfig.nodeId = IfxMultican_NodeId_0;
        canNodeConfig.rxPin = &IfxMultican_RXD0B_P20_7_IN;
        canNodeConfig.rxPinMode = IfxPort_InputMode_pullUp;
        canNodeConfig.txPin = &IfxMultican_TXD0_P20_8_OUT;
        canNodeConfig.txPinMode = IfxPort_OutputMode_pushPull;

        // initialize the node
        IfxMultican_Can_Node_init(&canSrcNode, &canNodeConfig);
    }

    // Destination Node
    // IfxMultican_Can_Node canDstNode; // defined globally
    {
        canNodeConfig.nodeId = IfxMultican_NodeId_1;
        canNodeConfig.rxPin = &IfxMultican_RXD1B_P14_1_IN;
        canNodeConfig.rxPinMode = IfxPort_InputMode_pullUp;
        canNodeConfig.txPin = &IfxMultican_TXD1_P14_0_OUT;
        canNodeConfig.txPinMode = IfxPort_OutputMode_pushPull;

        // initialize the node
        IfxMultican_Can_Node_init(&canDstNode, &canNodeConfig);
    }

    // IfxMultican_Can_MsgObj canSrcMsgObj; // defined globally
    {
        // create message object config
        IfxMultican_Can_MsgObjConfig canMsgObjConfig;
        IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &canSrcNode);

        // assigned message object:
        canMsgObjConfig.msgObjId = 0;

        canMsgObjConfig.messageId = id; // 'id' is defined globally
        canMsgObjConfig.acceptanceMask = 0x7FFFFFFFUL;
        canMsgObjConfig.frame = IfxMultican_Frame_transmit;
        canMsgObjConfig.control.messageLen = IfxMultican_DataLengthCode_8;
        canMsgObjConfig.control.extendedFrame = FALSE;
        canMsgObjConfig.control.matchingId = TRUE;

        // initialize message object
        IfxMultican_Can_MsgObj_init(&canSrcMsgObj, &canMsgObjConfig);
    }

    // IfxMultican_Can_MsgObj canDstMsgObj; // defined globally
    {
        // create message object config
        IfxMultican_Can_MsgObjConfig canMsgObjConfig;
        IfxMultican_Can_MsgObj_initConfig(&canMsgObjConfig, &canDstNode);

        // assigned message object:
        canMsgObjConfig.msgObjId = 2;

        canMsgObjConfig.messageId = id;
        canMsgObjConfig.acceptanceMask = 0x7FFFFFFFUL;
        canMsgObjConfig.frame = IfxMultican_Frame_receive;
        canMsgObjConfig.control.messageLen = IfxMultican_DataLengthCode_8;
        canMsgObjConfig.control.extendedFrame = FALSE;
        canMsgObjConfig.control.matchingId = TRUE;


        // initialize message object
        IfxMultican_Can_MsgObj_init(&canDstMsgObj, &canMsgObjConfig);
    }

    const unsigned dataLow = 0xC0CAC01A;
    const unsigned dataHigh = 0xBA5EBA11;

    // Initialize the message structure
    IfxMultican_Message txMsg;
    IfxMultican_Message_init(&txMsg, id, dataLow, dataHigh, IfxMultican_DataLengthCode_8);

    // Transmit Data
    while( IfxMultican_Can_MsgObj_sendMessage(&canSrcMsgObj, &txMsg) == IfxMultican_Status_notSentBusy );

    return 0;
}

我在Canoe中遇到的一些错误示例

   Time            Chn     ID   Name   Event Type   Dir     DLC   Data                                                 
   [-] 18.909137   CAN 1               CAN Error    RxErr         ECC: 100000011xxxxx, Form Error, Bit Position = 12   
   |  ECC          100000011xxxxx            
   |  Code         Form Error                
   |  Position     12                        
   |  ID           0010010011001b (499)      
   |  DLC          9                         
   |  Data 00-07   00 00 00 00 00 00 00 00   

另一个例子

   Time            Chn     ID   Name   Event Type   Dir     DLC   Data                                                
   [-] 18.907080   CAN 1               CAN Error    RxErr         ECC: 100001001xxxxx, CRC Error, Bit Position = 36   
   |  ECC          100001001xxxxx            
   |  Code         CRC Error                 
   |  Position     36                        
   |  ID           0010010011001b (499)      
   |  DLC          9                         
   |  Data 00-07   00 00 00 00 00 00 00 00   

我还必须指出,尽管我只发送了一次消息,但我一直收到这些错误的不间断序列,直到我停止仿真为止。

有什么方法可以用来更好地理解如何解决这些错误? 有关套件引脚编号或正确连接的任何信息都将非常有帮助。 我还必须指出,我只是从其工作原理上抽象地使用了can的驱动程序,我只将CAN理解为总线,我会在该总线上抛出一条消息,并使用一些我不知道的功能从另一端接收它知道它是如何工作的,我的时间很有限,而且我不能学到很多。

使用的板子:KIT_AURIX_TC297_TFT ,CAN盒:VN6510A

1 个答案:

答案 0 :(得分:2)

您需要将CANOe中的波特率从500.0 Kbps更改为1000.0 Kbps(根据infineon iLLD canNodeConfig.baudrate = 1000000; // 1 MBaud)

还要确保CANH和CANL之间有120欧姆电阻。

尝试查看示波器或逻辑分析仪中微控制器(CAN TX / CAN RX)的输出,以及CAN收发器的输出,因为您正在使用TFT板,因此您已经有了收发器电阻。