PIC32MZ0512EFF相关的CAN配置(学习记录)
鉴于PIC相关资料较少,我在这记录分享一下自己经过一段时间的学习试验以后对PIC32系列的CAN的理解。记录不仅仅是分享,同样也是整理归纳查漏补缺的过程。在这个过程中大家互相学习,共同进步。
在使用芯片PIC32MZ0512EFF配置CAN初始化的过程中,我遇到了一个问题:这个芯片的CAN部分没有直接供我们使用的发送寄存器和接收寄存器。
下面会描述一下我的解决方法,并说说我的理解。
直接上干货:这里把对CAN2的初始化的全部过程都写出来。每个步骤在后文都会有详细的代码示例。
void CAN2_Init(void)
{
CAN2_GPIOPPSConfig();
//第一步:对CAN2进行引脚分配(PPS映射),以及设置相应的输入输出
C2CONSET = _C2CON_ON_MASK;
//第二步:启用can2模块,也可以写成C2CONbits.ON = 1;
CAN2_ConfigurationMode();
//第三步:顾名思义,就是进入CAN2的配置模式
CAN2_BaudrateInit();
//第四步:配置CAN2的波特率
C2FIFOBA = 0x0000100;
//第五步:设置FIFO起始地址
CAN2_FIFOn();
//第六步:设置FIFO,包括需要用到的FIFO数量以及每个FIFO相应的功能和容量大小
CAN2_FilterMaskInit();
//第七步:设置过滤器和屏蔽器
CAN2_LoopMode();
//第八步:进入CAN2的自检模式(环回模式),当然如果相应引脚与CAN收发器连接了,可以进入正常模式
}
注:后面按顺序分4个部分展示第一步,第三步和第八步,第四步,第五六七步的代码和我的理解
#第一部分
void CAN2_GPIOPPSConfig(void)
{
SYSKEY = 0x00000000;
SYSKEY = 0xAA996655;
SYSKEY = 0x556699AA;
CFGCONbits.IOLOCK = 0;
//解锁序列
//在芯片手册里有说到:正常工作状态下,对PPS管脚映射功能配置失效。要想使用,需要执行一个解锁序列,然后把IOLOCK清零
C2RXR = 4;
//把RD4设为C2RX
RPD5R = 15;
//把RD5设为C2TX
CFGCONbits.IOLOCK = 1;
SYSKEY = 0x00000000;
//设完PPS后把管脚映射锁置1,把序列清零
TRISDSET = _PORTD_RD4_MASK;
//可以写成TRISDbits.TRISD4 = 1;
TRISDCLR = _PORTD_RD5_MASK;
//可以写成TRISDbits.TRISD5 = 0;
}
注:对解锁序列的理解不深,这里就不发表看法了。但还是说一下我实际操作中的现象:
1、我在没有执行解锁序列的情况下也能使用管脚映射功能(这应该和我的配置位设置内容有关联)
2、如果之后要设置为环回模式,请确保所要使用的引脚悬空
#第二部分
void CAN2_ConfigurationMode(void)
{
C2CONbits.REQOP = 4;//配置为配置模式
while(C2CONbits.OPMOD!=4);//等待配置模式配置完毕
}
void CAN2_LoopMode(void)
{
C2CONbits.REQOP = 2;//配置为环回模式
while(C2CONbits.OPMOD!=2);//等待环回模式配置完毕
}