您好!
我对 CAN B 模块的 IF3寄存器进行了一些测试、我对此有一些疑问。
我将报文对象2配置为接收邮箱、并在 IF3UPD 寄存器中启用了 IF3自动更新。
此外、我启用了连接到 INT0线路上邮箱2的接收中断。
1) CAN_INT 寄存器= 0
当一条消息已经被存储在接收邮箱2中时、中断例程被调用、但是寄存器具有以下值:
CAN_ES = 0x00000010 -> RxOk:预期值
CAN_INT = 0 ->无中断挂起:不是预期的!
CAN_IPEN_X = 0 ->无中断挂起:不是预期的!
CAN_IPEN_21 = 0 ->无中断挂起:不是预期的!
因此、在中断例程内、我无法识别中断原因。
我假设 CAN_INT、CAN_IPEN_X 和 h CAN_IPEN_21具有0值、因为自动数据从邮箱2传输到 IF3寄存器复位位位 IntPnd (另请参阅 e2e.ti.com/.../2140585)
是否有任何方法可以知道中断的原因?
2) 2) IF3传输完成
当接收中断例程被发出时、从邮箱到 IF3寄存器的自动数据传输是否已经完成?
如果没有、我如何知道何时完成了转让?
3) IF3重复读数
考虑以下情况:
1:消息1已存储在接收邮箱2中;
2、报文1自动传递给 IF3寄存器;
3.中断例程被发出并开始被处理(IF3寄存器直到现在还未被读取、所以 IF3Upd 位= 1);
在 IF3寄存器被读取之前、消息2已经被存储在接收邮箱2中、所以消息2不会被传输到 IF3寄存器;
5.在中断例程期间,IF3寄存器被读取,因此 IF3Uptd 位变为0;
6、现在消息2从邮箱2传输到 IF3寄存器、所以 IF3Uptd 位再次变为1;
7.由于 IF3Upd 位= 1、因此 IF3寄存器被读取、因此 IF3Upd 位变为(并保持) 0;
8.中断例程结束。
在步骤7中、测试 IF3Uptd 位以检查是否有另一条消息要读取。 然而、IF3寄存器组没有像 IF1/2寄存器那样的忙位、所以我不知道从邮箱到 IF3寄存器的传输是否正在进行中。
在我的测试过程中、我注意到了这些致命问题:
-如果我读取 IF3寄存器并且在我测试 IF3Upd 位之后不久,我将发现它等于0,即使邮箱中有另外一条消息,因为传输正在进行中;
-如果我读取 IF3寄存器、并且在我测试 IF3Upd 位3-4次(经验)后不久、如果邮箱中有另外一条消息、我将发现它等于1、因为在重复测试期间、到 IF3寄存器的传输已经完成。
哪个是测试 IF3Upd 位的正确顺序?
读取 IF3寄存器后、应该对其进行多少次测试?
或者更好的是、在读取 IF3寄存器后、在测试 IF3Upd 位之前、我应该等待多长时间?
谢谢你。
此致、
演示