Как исправить ошибки подключения can?

Я новичок в области автомобилестроения, я пытаюсь установить соединение с шиной CAN между блоком CAN и платой aurix и контролировать это соединение с помощью программного обеспечения 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

Это действительно кажется ошибкой на физическом уровне. Отсюда трудно диагностировать это, но вот несколько советов: - Проверьте свои кабели. Просто подключите два CAN-порта вашего устройства Vector и посмотрите, сможете ли вы правильно получать сообщения с одного порта на другой - проверьте подтягивающие резисторы. Кабели, идущие с векторным интерфейсом, должны быть встроены. Требуется оконечная нагрузка на 120 Ом

M. Spiller 13.09.2018 10:48

Мне пришла в голову еще одна потенциальная проблема: проверьте, установлена ​​ли скорость векторного интерфейса на 1 Мбит / с (как указано в вашем примере кода).

M. Spiller 13.09.2018 13:37

привет, спасибо за ответ, коробка для банок уже была протестирована, поэтому она гарантированно работает, а также соединительные кабели кажутся в порядке.

Mohamed Ahmed 13.09.2018 14:27

Я проверил выход платы осциллографом, ничего не дает; проблема, вероятно, либо в самом комплекте (маловероятно), либо я мог использовать неправильные контакты, так как у меня нет карты контактов комплекта, я просто использовал два контакта из контактов can0 как этот ссылка, или с может водитель; Я вижу в нем некоторые комментарии к списку дел, а некоторые функции в нем не определены, поэтому сейчас я работаю над поиском другого драйвера.

Mohamed Ahmed 13.09.2018 14:37

кстати, я попросил infinion предоставить руководство пользователя самого комплекта, поскольку руководство пользователя, которое у меня есть, касается процессора, но пока нет ответа, поэтому у меня нет карты контактов, любая информация о нем была бы очень признательна.

Mohamed Ahmed 13.09.2018 14:39

о, а также скорость передачи данных проверялась раньше, я даже снизил ее до 500000 после вардов и в коде, и в CANoe на тот случай, если относительно высокая скорость вызывает проблемы с кабелями, но это тоже не проблема.

Mohamed Ahmed 13.09.2018 14:46

Поправка: осциллограф ничего не выдает, он дает сигнал с нулевым значением, вероятно, поэтому я получаю ошибку.

Mohamed Ahmed 13.09.2018 14:55

Я бы все же рекомендовал исключить проблему с проводкой. Отключите питание и измерьте сопротивление между CAN_H и CAN_L. Это должно быть около 60 Ом. Включает питание и устанавливает напряжение между CAN_H и GND, а также между CAN_L и GND. Это должно быть около 2-3 Вольт (для неактивной сети).

M. Spiller 13.09.2018 20:55
0
8
7 246
1

Ответы 1

Вам необходимо изменить скорость передачи в CANOe с 500,0 до 1000,0 Кбит / с (как настроено в infineon iLLD canNodeConfig.baudrate = 1000000; // 1 МБод)

Также убедитесь, что между CANH и CANL установлен резистор на 120 Ом.

Постарайтесь увидеть выходной сигнал микроконтроллера (CAN TX / CAN RX) в осциллографе или логическом анализаторе, а также выходной сигнал вашего трансивера CAN, поскольку вы используете плату TFT, у вас уже есть резистор трансивера.

Другие вопросы по теме