需要指出的几点可以解决一些问题:首先,对于BSEL0的设置既不匹配您的注释(注释看起来是0xA0=0b10100000而不是0b11111000),也不匹配您的意图(BSEL=0xA0将缓冲区0-2设置为接收FIFO的一部分,将缓冲区3和5设置为传输缓冲器和未使用缓冲区4(因为FIFO只使用一个连续的缓冲器串)。对于使用B0B4作为接收缓冲器,BSEL应该设置为0x80。第二,我对你的第一个问题有一些想法。我在您的代码中注意到,您正在清除缓冲区满位之前的中断标志,而最佳实践是应该按照相反的顺序(清除缓冲区满位,然后是中断标志,否则标志只能重新设置)。此外,在FIFO模式下,您应该检查FP<3:0>(CANCON寄存器的位3-0)以确定FIFO当前指向哪个缓冲区,并在读取其数据之后清除该缓冲区的全位。这就回答了你的第二个问题。在FIFO模式下,滤波器不与特定的缓冲器相关。相反,任何过滤器都可以触发一个接受的消息,并且该消息被写入FIFO中的第一个可用缓冲区。因此,如果只发送一条消息并且它匹配一个过滤器,那么无论过滤器与数据匹配的缓冲区是什么,都会出现在RXB0中,因为这是FIFO中的第一个缓冲区。FIFO操作的进一步细节位于PIC18F66 K80数据表的27.7.3节中。
需要指出的几点可以解决一些问题:首先,对于BSEL0的设置既不匹配您的注释(注释看起来是0xA0=0b10100000而不是0b11111000),也不匹配您的意图(BSEL=0xA0将缓冲区0-2设置为接收FIFO的一部分,将缓冲区3和5设置为传输缓冲器和未使用缓冲区4(因为FIFO只使用一个连续的缓冲器串)。对于使用B0B4作为接收缓冲器,BSEL应该设置为0x80。第二,我对你的第一个问题有一些想法。我在您的代码中注意到,您正在清除缓冲区满位之前的中断标志,而最佳实践是应该按照相反的顺序(清除缓冲区满位,然后是中断标志,否则标志只能重新设置)。此外,在FIFO模式下,您应该检查FP<3:0>(CANCON寄存器的位3-0)以确定FIFO当前指向哪个缓冲区,并在读取其数据之后清除该缓冲区的全位。这就回答了你的第二个问题。在FIFO模式下,滤波器不与特定的缓冲器相关。相反,任何过滤器都可以触发一个接受的消息,并且该消息被写入FIFO中的第一个可用缓冲区。因此,如果只发送一条消息并且它匹配一个过滤器,那么无论过滤器与数据匹配的缓冲区是什么,都会出现在RXB0中,因为这是FIFO中的第一个缓冲区。FIFO操作的进一步细节位于PIC18F66 K80数据表的27.7.3节中。
举报