主题中讨论的其他器件:C2000WARE
工具/软件:TI C/C++编译器
大家好、
我对 CAN_IF1CMD 寄存器的 MSG_NUM 位行为感到困惑。
当单步执行通过32位访问(MOVL)向寄存 器写入零的代码并在写入后读取寄存器时、读回的值不是0x00000000、而是0x00000020。 我知道 TRM 解释说0是无效的消息编号、但这是一个令人惊讶的结果、因为 C2000Ware_1_00_03_00中的 CAN_loopback 位字段示例 使用类似的代码:
CANaRegs.CAN_IF1CMD.ALL = 0; (...) // //设置 Control、Mask 和 ARB 位,以便将它们传送到 //消息对象。 // CANaRegs.CAN_IF1CMD.bit.Control = 1; CANaRegs.CAN_IF1CMD.bit.ARB = 1; CANaRegs.CAN_IF1CMD.bit.Mask = 1; CANaRegs.CAN_IF1CMD.bit.DIR = 1; (...) // //将数据传输到消息对象 RAM // CanaRegs.CAN_IF1CMD.bit.MSG_NUM = Objid;
因此、在上面的第一条指令之后、从 CanaRegs.CAN_IF1CMD.all 读回的值将为0x00000020。 但是、当执行示例 CanaRegs.CAN_IF1CMD.bit.Control = 1时、实际生成的指令如下所示:
080e11:06C4 MOVL ACC、*+ XAR4[0] 080e12:5110 ORB AH、#0x10 080e13:1EC4 MOVL *+XAR4[0]、ACC
因此、写入 CAN_IF1CMD 的值将为0x00100020、其中一个值的预期值为0x00100000。 我可以告诉大家、结果应该是触发接口寄存器的写入命令、将4行中每行的数据传输到32号报文对象、然后再传输一次、以获得由 Objid 给出的正确报文对象。
我想我缺少一些东西、您能帮我理解吗?
谢谢、
皮埃尔