2

我正在为 CAN 编程一个 dsPIC30F4011。但是我在指定标识符、掩码和过滤器时遇到了问题。

我使用标准标识符和扩展标识符。在第 16-23 位,我将写下收发器的地址。所以,它看起来像 00000 00000001 0000000000000001 空格只是为了显示我设置以下位的收发器部分:

// PRIO
C1TX0SIDbits.SID10_6 = 0x0000; 
// SCR
C1TX0SIDbits.SID5_0 = 0x0000;   
C1TX0EIDbits.EID17 = 0x0000;
C1TX0EIDbits.EID16 = 0x0001;
// DEST
C1TX0EIDbits.EID15 = 0x0000;    
C1TX0EIDbits.EID14 = 0x0000;
C1TX0EIDbits.EID13 = 0x0000;
C1TX0EIDbits.EID12 = 0x0000;
C1TX0EIDbits.EID11 = 0x0000;
C1TX0EIDbits.EID10 = 0x0000;
C1TX0EIDbits.EID9 = 0x0000;
C1TX0EIDbits.EID8 = 0x0000;
// CMD
C1TX0DLCbits.EID5_0 = 0x0001;

现在我的面具和我设置的过滤器有问题

// Mask
C1RXM0SID = 0x00FD;
C1RXM0EIDH = 0x0C00;
C1RXM0EIDL = 0x0000;
// Filter
C1RXF0SID = 0x0000;
C1RXF0EIDH = 0x0400;
C1RXF0EIDL = 0x0000;

现在我什么都没有收到。如果我设置

C1RXM0SID = 0x000FC;

我收到所有消息。我用收发器地址试过了

0b00000000

0b00000001

那么,我是不是做错了什么?(我想是的,但我不知道是什么)

4

1 回答 1

0

现在我的面具和我设置的过滤器有问题

// Mask
C1RXM0SID = 0x00FD;
C1RXM0EIDH = 0x0C00;
C1RXM0EIDL = 0x0000;
// Filter
C1RXF0SID = 0x0000;
C1RXF0EIDH = 0x0400;
C1RXF0EIDL = 0x0000;

现在我什么都没有收到。如果我设置

C1RXM0SID = 0x000FC;

这是因为您正在设置 C1RXM0SID 的位 0。根据参考手册中的寄存器描述,这将仅匹配由过滤器中的 EXIDE 位确定的消息类型(标准或扩展地址)。该寄存器的位 1 未实现。假设你想要的 SID 掩码是 0xFD 那么你想要的这个寄存器是

C1RXM0SID = 0x00FD << 2;
于 2018-08-30T21:22:20.327 回答