主题中讨论的其他器件:TMS320F28335、 C2000WARE
工具/软件: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 这样做、 都 将省去位域方法。
谢谢!