主题中讨论的其他器件:C2000WARE
您好!
在《技术参考手册》中、我已经了解到接口寄存器中的许多位受忙位写保护。
我已经看到、在 TI 的 CAN driverlib (C2000Ware 1.0.1.0)中、以下序列用于更改邮箱位:
//------------ 序列1 ---
//
//配置邮箱号码
//
mailboxNum = 5;
//
//等待确保此接口不忙。
//
while (((HWREGH (CANB_BASE + CAN_O_IF1CMD)& CAN_IF1CMD_BUSY)== CAN_IF1CMD_BUSY)
{
}
//
//仅通过设置 CAN_IF1CMD_CLRINTPND 位来更改中断挂起状态。
//
HWREG_BP (CANB_BASE + CAN_O_IF1CMD)= CAN_IF1CMD_CLRINTPND;
//
//向 CAN 控制器发送清除挂起中断命令。
//
HWREGH (CANB_BASE + CAN_O_IF1CMD)= mailboxNum & CAN_IF1CMD_MSG_NUM_M;
//
//等待确保此接口不忙。
//
while (((HWREGH (CANB_BASE + CAN_O_IF1CMD)& CAN_IF1CMD_BUSY)== CAN_IF1CMD_BUSY)
{
}
//------------ 序列1的末尾--------------------------------------------------------
我很清楚这个顺序。
现在考虑以下序列:
//------------ 序列2-----
//
//配置邮箱号码
//
mailboxNum = 5;
//临时 RAM 变量
cmdRegisterTmp = CAN_IF2CMD_CONTROL |(mailboxNum & CAN_IF2CMD_MSG_NUM_M);
//
//等待确保接口1不忙。
//
while (((HWREGH (CANB_BASE + CAN_O_IF1CMD)& CAN_IF1CMD_BUSY)== CAN_IF1CMD_BUSY)
{
}
//
//仅通过设置来更改中断挂起状态
// CAN_IF1CMD_CLRINTPND 位。
//
HWREG_BP (CANB_BASE + CAN_O_IF1CMD)= CAN_IF1CMD_CLRINTPND;
//
//向 CAN 控制器发送清除挂起中断命令。
//
HWREGH (CANB_BASE + CAN_O_IF1CMD)= mailboxNum & CAN_IF1CMD_MSG_NUM_M;
//
//!!! 不要等待确保接口1不忙!!!
//
//
//通过接口寄存器2立即访问命令寄存器
//我知道 IF2寄存器不忙,因为我从未使用过它们
//
HWREG_BP (CANB_BASE + CAN_O_IF2CMD)= cmdRegisterTmp;
//------------ 序列2的末尾--------------------------------------------------------
序列2是否正确?
换句话说、如果我通过两个不同的接口寄存器集访问同一邮箱、我可以跳过 BUSY 位检查吗?
谢谢你。
此致、
Demis Biscaro