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.

[参考译文] CCS/TMS320F280049M:当我们使用 CAN 消息对象传输消息时、如何了解 CAN_IF1CMD 寄存器中控制位的功能

Guru**** 2540720 points
Other Parts Discussed in Thread: TMS320F28335, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/596763/ccs-tms320f280049m-how-to-understand-the-function-of-control-bit-in-the-can_if1cmd-register-when-we-use-the-can-message-object-to-transfer-message

器件型号:TMS320F280049M
主题中讨论的其他器件:TMS320F28335C2000WARE

工具/软件:Code Composer Studio

当我开始在 TMS320F280049M 中编写 CAN 模块程序,一个问题  让我感到困惑。 TI 提供了一个如何使用 软件驱动程序模式对 CAN 消息传输和接收进行编程的示例。  CAN 消息的程序如下:

CAN_sendMessage (uint32_t base、uint32_t Objid、uint16_t msgLen、
const uint16_t * msgData)

uint32_t msgCtrl = 0U;
uint32_t cmdMaskReg;

//设置 if 命令以读取消息对象控制值
//
cmdMaskReg = CAN_IF1CMD_CONTROL;

//设置来自消息对象的数据请求。
//
HWREG_BP (base + CAN_O_IF1CMD)= cmdMaskReg;

//
//将报文对象传输到 IF 寄存器。
//
HWREGH (base + CAN_O_IF1CMD)= Objid & CAN_IF1CMD_MSG_NUM_M;

//
//等待忙位清零
//
while ((HWREGH (base + CAN_O_IF1CMD)& CAN_IF1CMD_BUSY)== CAN_IF1CMD_BUSY)

msgCtrl = HWREGH (base + CAN_O_IF1MCTL);

assert (((msgCtrl & CAN_IF1MCTL_DLC_M)== msgLen);

CAN_writeDataReg (msgData、(Int16_t *)(base + CAN_O_IF1DATA)、
(msgCtrl & CAN_IF1MCTL_DLC_M);

if (msgLen >0U)

msgCtrl = CAN_IF1CMD_DATA_B | CAN_IF1CMD_DATA_A;

其他

msgCtrl = 0U;

HWREG_BP (base + CAN_O_IF1CMD)= CAN_IF1CMD_DIR | msgCtrl;


HWREG_BP (base + CAN_O_IF1CMD)|= CAN_IF1CMD_TXRQST;


HWREGH (base + CAN_O_IF1CMD)= Objid & CAN_IF1CMD_MSG_NUM_M;

在我的项目中,我要编写的程序仍然是位字段(structure and union),)的形式,所以 我想知道为什么这个函数中首先设置 Control 位以及 CAN_IF1CMD resgiser 中 Control 位的作用, 尽管我已经阅读了数据表、但我仍然感到困惑。  请帮我解释一下。

另一项请求是 、TI 能否给出一些  具有位域模式的外设模块 Init 功能的示例、例如 TMS320F28335程序参考设计。  这种新的编程方法使我们进行了不同的调整。  无论以下所有控制器编程方法都将使用  软件驱动程序模式、 还是 强烈建议 TI 这样做、 都 将省去位域方法。

谢谢!

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

    为了将报文对象 RAM 中的报文控制值(IF1MCTL)传输到 IF 寄存器、IF1CMD 中的 CONTROL 位被置位。 请参阅技术参考手册、更好地了解 IF 寄存器的工作原理。

    驱动程序 API 方法是未来的首选方法。 位字段标头将继续包含在内、但示例和源代码配套资料将受到限制。 有一个位字段可以示例用于 F2837xD、它们可能会提供帮助(~\C2000Ware_1_00_00_00\device_support\f2837xd\examples\CPU1\CAN_loopback_bitfield)。

    此致
    Chris