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.

28075 can通信例程选择问题

Other Parts Discussed in Thread: C2000WARE

问题1:C2000Ware_3_02_00_00_setup 安装后。C:\ti\c2000\C2000Ware_3_02_00_00\device_support\f2807x\examples\cpu1\can_loopback\cpu01 路径下的can信息发送接收的驱动函数

CANMessageSet(uint32_t ui32Base, uint32_t ui32ObjID, tCANMsgObject *pMsgObject,
tMsgObjType eMsgType)

。和 C:\ti\c2000\C2000Ware_3_02_00_00\driverlib\f2807x\examples\cpu1\can 驱动函数不一样。

CAN_setupMessageObject(uint32_t base, uint32_t objID, uint32_t msgID,
CAN_MsgFrameType frame, CAN_MsgObjType msgType,
uint32_t msgIDMask, uint32_t flags, uint16_t msgLen);

CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen,
const uint16_t *msgData);

前者在邮箱发送时会配置寄存器,而后者先配置邮箱寄存器,然后发送can通信时无需再次配置寄存器。缩短发送函数的运行时间。请问这两种方式该如何选择?

  • 在较早的C2000ware(C2000Ware_1_00_05_00已不建议使用 )内使用的是CANMessageSet,后面的话是已经更新为CAN_setupMessageObject和CAN_sendMessage。

    C2000Ware的bitfield和driverlib文件夹中的示例在功能上是相同的。这些是用于访问内存映射外设寄存器的硬件抽象层方法。

    请查看此链接,以获取位域和driverlib及其实现之间的更多信息:

    www.ti.com/.../spraa85e.pdf
  • //
    // Enable CAN test mode with external loopback
    //
    CAN_enableTestMode(CANA_BASE, CAN_TEST_EXL);
    //
    can通信按照例程配置为外部循环模式。
    // Initialize the transmit message object used for sending CAN messages.
    // Message Object Parameters:
    // Message Object ID Number: 1
    // Message ID: 0x3FF (STDID should be from 0x1 through 0x7FF only)
    // Message Frame: Standard
    // Message Type: Transmit
    // Message ID Mask: 0x0
    // Message Object Flags: None
    // Message Data Length: 2 Bytes
    //
    CAN_setupMessageObject(CANA_BASE, 1, 0x3FFF, CAN_MSG_FRAME_EXT,
    CAN_MSG_OBJ_TYPE_TX, 0xFFFF, CAN_MSG_OBJ_NO_FLAGS,
    2);

    CAN_setupMessageObject(CANA_BASE, 3, 0x3F01, CAN_MSG_FRAME_EXT,
    CAN_MSG_OBJ_TYPE_TX, 0xFFFF, CAN_MSG_OBJ_NO_FLAGS,
    2);

    //
    // Initialize the receive message object used for receiving CAN messages.
    // Message Object Parameters:
    // Message Object ID Number: 2
    // Message ID: 0x3FF (STDID should be from 0x1 through 0x7FF only)
    // Message Frame: Standard
    // Message Type: Receive
    // Message ID Mask: 0x0
    // Message Object Flags: None
    // Message Data Length: 2 Bytes (Note that DLC field is a "don't care"
    // for a Receive mailbox
    //
    CAN_setupMessageObject(CANA_BASE, 2, 0x3FFF, CAN_MSG_FRAME_EXT,
    CAN_MSG_OBJ_TYPE_RX, 0xFFFF, (CAN_MSG_OBJ_USE_EXT_FILTER | CAN_MSG_OBJ_USE_ID_FILTER | CAN_MSG_OBJ_NO_FLAGS),
    2);
    CAN_setupMessageObject(CANA_BASE, 10, 0x3F01, CAN_MSG_FRAME_EXT,
    CAN_MSG_OBJ_TYPE_RX, 0xFFFF, (CAN_MSG_OBJ_USE_EXT_FILTER | CAN_MSG_OBJ_USE_ID_FILTER | CAN_MSG_OBJ_NO_FLAGS),
    2);
    配置了邮箱1 和3 是发送邮箱,邮箱1 的 Message ID 是 0x3FFF 。邮箱3 的 Message ID 是0x3F01。
    邮箱2和邮箱10是接收邮箱。把邮箱2 的 Message ID 配置为 0x3FFF 。邮箱10 的 Message ID 配置为0x3F01。
    以上可以正常接收,邮箱2 接受的是邮箱1 的数据。邮箱10 接收的是邮箱3的数据。
    但是把邮箱2 和邮箱10 的 Message ID 对调,就无法接收到数据。想问下是什么逻辑导致的呢?
  • 应该是Message ID Mask的设置问题,请将第6个参数0xFFFF改为0xFF00试一下
  • 谢谢。我再找下原因。刚替换Message ID 的目的是想测试,多帧can数据,能不能通过Message ID 和 Message ID Mask 实现指定的邮箱接收数据。比如:配置了发送邮箱1 和接收邮箱3 。接收邮箱2 和接收邮箱10 。想看下能不能实现邮箱1的数据邮箱10接收。邮箱3的数据邮箱2接收。
  • 对调接收邮箱的 Message ID是可以的。之前是我的应用程序有异常。可以实现指定的邮箱接收can信息。谢谢!
  • 很高兴您能解决问题!