您好 Champ、
客户遇到 CAN 传输问题、CAN 传输在主循环中执行、如果不禁用中断(通过 DINT)、CAN 邮箱传输消息 ID 和数据有时将不匹配。 如果按如下方式禁用中断 ,CAN 发送将始终正确。
您能帮助告知原因吗?
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.
您好 Champ、
客户遇到 CAN 传输问题、CAN 传输在主循环中执行、如果不禁用中断(通过 DINT)、CAN 邮箱传输消息 ID 和数据有时将不匹配。 如果按如下方式禁用中断 ,CAN 发送将始终正确。
您能帮助告知原因吗?
您好、Joseph、
随附的是客户可以传输代码。
您能 不能帮助告知可能的原因。
您好、Joseph、
客户系统具有 CPUTIMER 中断和 PWM 中断。
CAN 发送使用 IF1、但未启用 CANTX 中断。
可以使用 IF2接收 并使能中断、接收处理方式为 attached.e2e.ti.com/.../CAN-receive.txt
我的问题是 、如果以下代码被 CPUTIMER 或 PWM 中断等其他中断中断中断中断中断中断、 将会发生什么情况?
显然,只需通过 DINT 执行以下代码来禁用中断,问题就会得到解决。
函数下面使用的是16位访问、是否可能存在与此问题相关的16位访问?
CAN_ADDR16 (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16;//写出寄存器以编程报文对象。
CAN_ADDR16 (ui32Base + CAN_O_IF1MSK)= ui32MaskReg 和 CAN_REG_WORD_MASK;
CAN_ADDR16 (ui32Base + CAN_O_IF1MSK + 2)= ui32MaskReg >> 16;
CAN_ADDR16 (ui32Base + CAN_O_IF1ARB)= ui32ArbReg 和 CAN_REG_WORD_MASK;
CAN_ADDR16 (ui32Base + CAN_O_IF1ARB + 2)= ui32ArbReg >> 16;
CAN_ADDR16 (ui32Base + CAN_O_IF1MCTL)= ui32MsgCtrl & CAN_REG_WORD_MASK;
CAN_ADDR16 (ui32Base + CAN_O_IF1CMD)= ui32ObjID 和 CAN_IF1CMD_MSG_NUM_M;
尊敬的 Johnson:
我没有适用于 CAN_ADDR16的宏、因此无法评论写入的发生方式。 我们在 driverlib 中针对 CAN 寄存器写入的内容是 HWREGH 和 HWREG_BP、但为了确保在 IF1寄存器上正确执行写入(在本例中为传输)、您可能可以单步执行代码、并查看在 CCS 中使用寄存器视图时是否发生写入。 最好在查看具有和不具有 DINT 的寄存器视图的同时单步执行代码。 当前 ISR 中的内容可能会覆盖 IF1内容或阻止其更新。
此致、
Joseph
尊敬的 Johnson:
如果不知道计时器和 PWM ISR 中包含哪些代码、我只能提出以下建议:
-在 ISR 内部创建一个标志,并仅在 CAN 数据有效且准备更新时才将其设置为 true
-在 更新 IFX 寄存器(CMD、MSK、ARB 和 MCTL)的主程序中,仅在标志设置为 true 时执行。 例如
if (flag=true) { CAN_ADDR16 (ui32Base + CAN_O_IF1CMD + 2)= ui32CmdMaskReg >> 16; CAN_ADDR16 (ui32Base + CAN_O_IF1ARB)… : : flag = false; }
查看这是否可以在不禁用中断的情况下工作。
此致、
Joseph