Как исправить ошибки подключения CAN?
Я новичок в области автомобильной промышленности, я пытаюсь установить соединение с помощью шины CAN между коробкой CAN и платой Aurix и отслеживать это соединение с помощью программного обеспечения CANoe.
я только пытаюсь отправить простое сообщение один раз из комплекта по шине can в качестве начала, просто чтобы проверить соединение и убедиться, что оно работает, прежде чем я продолжу работу с остальной частью приложения.
но все, что я получаю из комплекта на CANoe, это ошибки, такие как ошибки формы, ошибки материала, ошибка CRC, кадр перегрузки CAN.
Я несколько раз проверил контакты банки на плате, чтобы убедиться в их правильности, также попытался изменить канал CAN, используемый на коробке CAN, даже проверил провода, и все кажется подключенным правильно.
и программное обеспечение, которое я использую, является только демонстрацией, которую я нашел в демонстрационных версиях компилятора TASKING в файлах, связанных с набором, который я использую, так что я могу предположить, что это не так. шаги, которые я выполнил, чтобы получить это демо для компиляции, просты
- используйте конструктор программных платформ в TASKING IDE, чтобы прикрепить файлы, связанные с комплектом, к проекту.
- включите в него файл драйвера CAN "IfxMultican_Can.h"
- Затем я скопировал и вставил код в документацию в этом заголовочном файле в мой проект.
я сделал все, что мог придумать, чтобы заставить это работать, но все еще те же ошибки, так что это либо неправильные соединения, каким-либо образом, либо код драйвера, поставляемый с 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
1 ответ
Вам необходимо изменить скорость передачи данных в CANOe с 500,0 до 1000,0 кбит / с (в соответствии с настройкой в infineon iLLD canNodeConfig.baudrate = 1000000; // 1 МБод)
Также убедитесь, что между CANH и CANL установлен резистор 120 Ом.
Попробуйте увидеть свой выходной сигнал от микроконтроллера (CAN TX/CAN RX) в осциллографе или логическом анализаторе, а также выходной сигнал от вашего трансивера CAN, поскольку вы используете плату TFT, у вас уже есть резистор трансивера.