Microchip
直播中

康伟

7年用户 244经验值
私信 关注
[问答]

PIC18F45K80中的ECAN接收问题

我使用的工具:IDE:MPLAB X,编译器:XC8(免费版),控制器:PIC18F45k80尝试在模式2中配置ECAN,将B0、B1、B2、B3和B4配置为接收缓冲区。尝试对所有这些缓冲区保持MAsk和Filter值相同,以便每个b只传递一条消息BSEL0=0xA0;//1111 10--//1111 10--//*掩膜0*/RXM0SIDL=0xff;RXM0SIDH=0xff;RXMM0EIDL=0xFF;RXM0XM0EIDDL=0xFF;RXM0XM0EIDH=0EIDH=0XFF;RXMMMM0EIDH=0EIDH=0XMDH=0XFF;RXMM0XM0EIDH=0FF;0XMXM0EIDH=0FF;使过滤器RXM0XM0EIDH=0FF;使能过滤器RXFCON0=0XFCON0=0XFCON0=将过滤器0分配给RXB0,将过滤器1分配给RXB1 RXFBCON0=0x10;//分配过滤器2到B0,过滤器3到B1 RXFBCON1=0x32;//分配过滤器4到B2,过滤器5到B3 RXFBCON2=0XFBCON2=0X54;//分配过滤器6到B4,过滤器7到B5 RXFFFBCON3=0XFBCON3=0XFBCON3=B4,过滤器7到B5RXFFFFFBCON3=0XFBCON2=0X54;//分配过滤器6到B4,过滤器7到B5过滤器7到B5RXFFFFFFBCON3=0XFFBCON3=0XFBCON3=0XFBCON3=0X76;RXFFFFFFFFBCON3=0X76;RXFRXF0SIDL=//分配实际的混乱年龄ID RXF0SIDH=//分配实际消息ID RXF0EIDL=//分配实际消息ID RXF0EIDH=//分配实际消息ID RXF0EIDH=//分配实际消息ID RXB1CON=0x00;//分配过滤器1RXF1SIDL=//分配实际消息ID RXF1SIDH=//分配实际消息ID RXF1EIDH=//分配实际消息ID RXF1EIDL=//分配实际消息ID RXF1EIDL=//分配实际消息IDe ID B0CON=0x00;//filter 2 RXF2SIDL=//Assign实际消息ID RXF2SIDH=//Assign实际消息ID RXF2EIDH=//Assign实际消息ID RXF2EIDH=//Assign实际消息ID RXF2EIDL=//Assign实际消息IDRXF3SIDCON=0x00;//filter 3 RXF3SIDH=//Assign实际消息ID RXF3EIDH=//Assign实际消息ID签名实际消息ID RXF3EIDL=//分配实际消息ID RXF3EIDL=//分配实际消息ID B2CON=0x00;//过滤器4RXF3SIDL=//分配实际消息ID RXF3SIDH=//分配实际消息IDRXFRXF3SIDH=(CAN_RXF3SIDH[4],Id>;>;21;RXF3EIDH=(CAN_RxMessage[4]];Id>;>;21;21;RXF3EIDH=(CAN_RxMessage[4]]]];Id>;>;8)>;8)&;0xFF;0xFF;B3CON=0x00;//过滤器5RXF4SIDL=//分配实际消息ID RXF4SIDH=(CAN_RxMessage[5][5],Id>;21;Id>;21;RXF4F4EIDH=(CAN_RxMessage[5]]/分配实际消息IDRXXXF4SIDH=(CAN_RXXXXXXXXXXXF4SIDDDH[5]]//分配实际消息IDRXF4IDRXF4SIDDH=(CAN_RXXXXXRxMessage[5][5],Id>;8;>[5]]/Id&;0xMessage[5]]Id&XXXXXXXXXMessage[5][5]]]]=//分配实际消息ID RXF5EIDH=//Assig实际消息ID RXF5EIDL=//As签名实际消息ID读消息ID读消息的实际消息ID读消息在轮询方法asif(RXB0FUL)//检查RXXBXBXBXBBB0{XBXBXBXBXBBXBXBXBXBBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBBXBXBXBXBBXBBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB实际消息IDDL=//在轮询方法探询方法如果(RXB1FUL)//检查RXB1{从缓冲区读取数据RXB1IF=0;RXB1FUL=0;RXB1FUL=0;}情况2://0x0732A605L2://0x0732A605L2://0x0X0732A605L如果(B0RRRXFUL)//0x0x0XXXXXXXXF2(B0XXXXXFUL)//检查B0XXXXX0X0X0X0X0X0XXXXXXXXXXXX2726605L如果(B2)///BXBXBXBXBXBXBXXBFUL)//检查BBBXBB0BBBBBBBB面临的问题是:1.在执行“RXB0FUL=0;”时,接收缓冲区ful位没有清除,为了清除该位,我必须清除所有缓冲区ful位(RXB1FUL、B0FUL等)。接收B0缓冲器正在获得值,而不是其他缓冲区,配置有问题吗?三。我已经看到控制器数据表“FIFO读指针位”应该用来读取缓冲区,但不能保证任何人帮助我。提前感谢…!!!

回帖(2)

李翰肃

2019-8-22 14:35:37
我正在使用ICD3。
举报

丛聪

2019-8-22 14:51:04
需要指出的几点可以解决一些问题:首先,对于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节中。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分