0

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

我只是尝试通过 CAN 总线从套件发送一条简单的消息作为开始,只是为了测试连接并确保它在我继续应用程序的其余部分之前工作。

但我从 CANoe 上的套件中收到的只是表格错误、内容错误、CRC 错误、CAN 过载帧等错误。

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

我使用的软件只是我在与我正在使用的套件相关的文件中的 TASKING 编译器演示中找到的演示,因此我可以假设它没有错。我遵循的步骤来编译这个演示很简单

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

我做了所有我能想到的事情来让它工作,但仍然有同样的错误,所以要么是连接错误,要么是 TASKING IDE 提供的驱动程序代码包含错误,系统中没有其他内容。

我用于该项目的代码是

#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 理解为我将在其上发送消息并使用某些我不使用的功能从另一端接收它的总线知道它实际上是如何工作的,而且我的时间非常有限,不允许我学习那么多。

使用板:KIT_AURIX_TC297_TFT,CAN盒:VN6510A

4

1 回答 1

2

您需要将 CANOe 中的波特率从 500.0 更改为 1000.0 Kbps(在英飞凌 iLLD 中配置 canNodeConfig.baudrate = 1000000; // 1 MBaud)

另外,确保 CANH 和 CANL 之间有 120 欧姆的电阻。

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

于 2018-09-24T13:40:01.887 回答