主题中讨论的其他器件:C2000WARE
您好!
我使用的 F28379D 器件具有 CAN 通信功能、 由于应用程序的需要、我使用的是 bitfield CAN、参考 C2000Ware_5_01_00_00\device_support\f2837xd\examples\cpu1\can_loopback_bitfields\cpu01\示例
示例代码在器件上完美运行。 我注意到, 示例中提供的 setupMessageObject()函数似乎没有为消息过滤设置掩码。 (还随附源文件)
//
// setupMessageObject - Setup message object as Transmit or Receive
//
void setupMessageObject(uint32_t objID, uint32_t msgID, msgObjType msgType)
{
//
// Use Shadow variable for IF1CMD. IF1CMD should be written to in
// single 32-bit write.
//
union CAN_IF1CMD_REG CAN_IF1CMD_SHADOW;
//
// Wait for busy bit to clear.
//
while(CanbRegs.CAN_IF1CMD.bit.Busy)
{
}
//
// Clear and Write out the registers to program the message object.
//
CAN_IF1CMD_SHADOW.all = 0;
CanbRegs.CAN_IF1MSK.all = 0;
CanbRegs.CAN_IF1ARB.all = 0;
CanbRegs.CAN_IF1MCTL.all = 0;
//
// Set the Control, Mask, and Arb bit so that they get transferred to the
// Message object.
//
CAN_IF1CMD_SHADOW.bit.Control = 1;
CAN_IF1CMD_SHADOW.bit.Arb = 1;
CAN_IF1CMD_SHADOW.bit.Mask = 1;
CAN_IF1CMD_SHADOW.bit.DIR = 1;
//
// Set direction to transmit
//
if(msgType == MSG_OBJ_TYPE_TRANSMIT)
{
CanbRegs.CAN_IF1ARB.bit.Dir = 1;
}
//
// Set Message ID (this example assumes 11 bit ID mask)
//
CanbRegs.CAN_IF1ARB.bit.ID = (msgID << CAN_MSG_ID_SHIFT);
CanbRegs.CAN_IF1ARB.bit.MsgVal = 1;
//
// Set the data length since this is set for all transfers. This is
// also a single transfer and not a FIFO transfer so set EOB bit.
//
CanbRegs.CAN_IF1MCTL.bit.DLC = messageSize;
CanbRegs.CAN_IF1MCTL.bit.EoB = 1;
//
// Transfer data to message object RAM
//
CAN_IF1CMD_SHADOW.bit.MSG_NUM = objID;
CanbRegs.CAN_IF1CMD.all = CAN_IF1CMD_SHADOW.all;
}
我想为 RX 消息对象添加屏蔽以供应用使用。 我似乎很难找到有关此器件的 bitfield CAN 示例的更多示例、因此我最好的猜测是如下所示:
//
// Set Message ID (this example assumes 11 bit ID mask)
//
CanbRegs.CAN_IF1ARB.bit.ID = (msgID << CAN_MSG_ID_SHIFT);
CanbRegs.CAN_IF1ARB.bit.MsgVal = 1;
/************************** My adding here /
// Mask setting:
CanbRegs.CAN_IF1MSK.bit.Msk = ((uint32_t)0x7FF << CAN_MSG_ID_SHIFT);
/*************************/
//
// Set the data length since this is set for all transfers. This is
// also a single transfer and not a FIFO transfer so set EOB bit.
//
CanbRegs.CAN_IF1MCTL.bit.DLC = messageSize;
CanbRegs.CAN_IF1MCTL.bit.EoB = 1;
您能否提供建议、这是否正确?
我试图通过调试和在 getCANMessage (uint32_t Objid)函数中设置断点来弄清 这个问题、以便查看我是否通过不需要的 ID 的传入帧来触发它。 但我不知道为什么、无论收到什么帧、不需要或想要、我都无法到达断点。
感谢您分享对上述2个问题的见解。
此致、
魏

