This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28377S:在 F28377S 中设置多个 CANBUS ID

Guru**** 2451970 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/889661/tms320f28377s-setting-more-than-one-canbus-id-in-f28377s

器件型号:TMS320F28377S

大家好、

我的系统中有多个 PCB,它们通过 CANBUS 相互连接,每个人都有不同的 ID、

因此、我的问题是、该 PCB 中的一个是主器件、从 CANBUS 读取所有数据、并且必须做出决定  

CAN 设置包括:

CANEnable (CANA_base);

*(unsigned long *) ucTXMsgData = 0;
sTXCANMessage.ui32MsgID = 0x0338;
sTXCANMessage.ui32MsgIDMask = 0;
sTXCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE;  
sTXCANMessage.ui32MsgLen = sizeof (ucTXMsgData);
sTXCANMessage.pucMsgData = ucTXMsgData;  

*(unsigned long *) ucRXMsgData358 = 0;
sRXCANMessage358.ui32MsgID = 0x0358;  
sRXCANMessage358.ui32MsgIDMask = 0x0;
sRXCANMessage358.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage358.ui32MsgLen = sizeof (ucRXMsgData358);
sRXCANMessage358.pucMsgData = ucRXMsgData358;


*(unsigned long *) ucRXMsgData328 = 0;
sRXCANMessage328.ui32MsgID = 0x0328;  
sRXCANMessage328.ui32MsgIDMask = 0;  
sRXCANMessage328.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage328.ui32MsgLen = sizeof (ucRXMsgData328);  
sRXCANMessage328.pucMsgData = ucRXMsgData328;  

*(unsigned long *) ucRXMsgData329 = 0;
sRXCANMessage329.ui32MsgID = 0x0329;  
sRXCANMessage329.ui32MsgIDMask = 0;
sRXCANMessage329.ui32Flags = MSG_OBJ_NO_FLAGS;
sRXCANMessage329.ui32MsgLen = sizeof (ucRXMsgData329);  
sRXCANMessage329.pucMsgData = ucRXMsgData329;  

在我的代码中、我每10ms 读取一次仅接收到一个数据、它将一个 ID 变为另一个 ID ...

第一个10ms

CANMessageSet (CANA_base、0x0358、&sRXCANMessage358、MSG_OBJ_TYPE_RX);
CANMessageGet (CANA_base、0x0358、&sRXCANMessage358、true);

mode =ucRXMsgData358[0];
SET_CURRENT_1 =ucRXMsgData358[1]+((ucRXMsgData358[2]&0x00FF)<8);
SET_CURRENT_2 =ucRXMsgData358[3]+(((ucRXMsgData358[4]和0x00FF)<<8);

另一个10ms

CANMessageSet (CANA_base、0x0328、&sRXCANMessage328、MSG_OBJ_TYPE_RX);
CANMessageGet (CANA_base、0x0328、&sRXCANMessage328、TRUE);

TEMP_HEAT_SINK_1 =ucRXMsgData328[0];
temp_Transformer_1 =ucRXMsgData328[1];
primary_curry_1 =ucRXMsgData328[2];

问题是、我是如何在同一周期中读取所有这些内容的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eren:

    在 CAN 协议中、具有最低节点 ID (有时称为消息 ID 或 CAN ID)的节点将继续在 CAN 总线中发送其消息、直到节点通过发送 ACK (确认)位成功接收到该消息、 然后、具有下一个可能已等待发送的最低 CAN ID 的节点将在前一个节点停止传输时立即转向发送其消息。  因此、在任何给定的点、CAN 总线中只会有一条 CAN 消息可用。  所有这些都是通过仲裁完成的、仲裁是 CAN 通信的基础。

    也就是说、一次只能读取一条 CAN 消息。  您可能需要提高波特率、这将允许您的应用程序在更短的时间内读取更多消息。

    此致、

    Joseph