“简简单单DSP”系列学习活动—CAN学习及使用
[复制链接]
CAN控制器改变工作模式之前,要检测总线空闲序列(=11接受位)如果产生占用总线错误,CAN控制器将不能检测到总线空闲状态,也就不能完成模式切换。这段话的意思就是它的工作模式改变是要条件的,不是在运行的过程中随便就改变的,下面说一下和这个相关的寄存器配置: 主控制器:CANMC 的CANMC.12位CCR是改变配置位,受EALLOW保护 A、CANMC.12=1,CPU请求向标准模式的配置寄存器CANBTC和接受屏蔽寄存器CANGAM、LAM[0]、和LAM[3]写配置信息。该位置1后,CPU必须等到CANES寄存器的CCE标志为1后,才能对CANBTC寄存器进行操作。 B、CANMC.12=0,CPU请求正常操作,只有在配置寄存器CANBTC设置为允许的值后才可以实现该操作。这段话的意思就是说,在配置完CANBTC后,需要使CANMC.12=0,这样的话CPU就可以申请正常工作了,以区别请求改变工作模式,即CANMC.12=1
在标准CAN模式(SCC)下,为了能调整全局接收屏蔽寄存器(CANGAM)及两个局部接收屏蔽寄存器LAM(0)和LAM(3),CAN模块也需要工作在初始化模式,即CANMC.12=1。通过将CCR清零,可以使CAN模块处于工作模式。如果CANBTC寄存器的值为0或者为初始值,CAN模块将一直工作在初始化模式,也就是当清除CCR位时,CCE位保持为1. 这段话的意思就是说如果设置不当,CAN就会一直工作在初始化模式,所以要检测CCR和CCE的状态,直到初始化完成为止, 具体操作是在初始化CAN的时候: ECanaRegs.CANMC.bit.CCR = 1; while(ECanaRegs.CANES.bit.CCE != 1){} 以下是改变寄存器CANBTC ECanaRegs.CANMC.bit.CCR = 0; while(ECanaRegs.CANES.bit.CCE != 0){} 二、CAN模块的初始化步骤 1、在CAN模块正常工作和初始化之前要使能CAN时钟,在DSP281x_SysCtrl.c中完成 2、GPIO设置 CAN是GPIO的复用功能,用到的是GPIOF6,GPIOF7因此要设置GPIO /* Configure eCAN pins using GPIO regs*/ GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; 3、设置CANTX和CANRX作为CAN通信引脚 设置完GPIO后还要配置CANTX和CANRX作为CAN通信引脚,用到的寄存器是功能控制寄存器TXIO RXIO中的 TXIO.3位TXFUNC和RXIO.3位RXFUNC。 TXIO.TXFUNC=1,作为CAN的发送引脚 TXIO.TXFUNC=0,保留 RXIO.RXFUNC=1,作为CAN的接收引脚 RXIO.RXFUNC=0,保留 /* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/ ECanaRegs.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANRIOC.bit.RXFUNC = 1; 4、选择是增强型还是标准型 用到的是主控制寄存器CANMC中的SCB位,ECanaRegs.CANMC.bit.SCB = 1; 增强型 ECanaRegs.CANMC.bit.SCB = 0; 标准型 5、相关寄存器清零 ECanbMboxes.MBOX0~31.MSGCTRL.all=0x00000000ECanbRegs.CANTA.all = 0xFFFFFFFF; /* Clear all TAn bits */
ECanbRegs.CANRMP.all = 0xFFFFFFFF; /* Clear all RMPn bits */
ECanbRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits */ ECanbRegs.CANGIF1.all = 0xFFFFFFFF; 6、复位后CCR和CCE位置1,允许用户配置位时间配置寄存器(CANBTC),这个就是上面说的初始化要等待 CCR和CCE位的状态。 7、配置CANBTC,确认TSEG1和TSEG2不等于0,如果这两个同时为0,则CAN模块不能退出初始化模式。TSEG1>TSEG2 TSEG1>6 TSEG2<8 CANBTC主要是配置波特率的 波特率=SYSCLK/BRP*BT BRP=BRPreg+1 BT =TSEG1+1+TSEG2+1+1 例如SYSCLK=150M系统时钟 CANBTC.BRP(7:0)=9; CANBTC.TSEG1=10; CANBTC.TSEG2=2; 则BRP=9+1=10; BT =TSEG1+1+TSEG2+1+1=10+1+2+1+1=15 波特率=SYSCLK/BRP*BT=150/10*15=1M ECanaRegs.CANBTC.bit.BRP = 9; ECanaRegs.CANBTC.bit.TSEG2 = 2; ECanaRegs.CANBTC.bit.TSEG1 = 10; 8、禁止所有邮箱 ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs 9初始化C代码 struct ECAN_REGS ECanaShadow;
EALLOW; // EALLOW enables access to protected bits
/* Configure eCAN RX and TX pins for CAN operation using eCAN regs*/
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all; ECanaShadow.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all; ECanaShadow.CANRIOC.bit.RXFUNC = 1; ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */ // HECC mode also enables time-stamping feature
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; ECanaShadow.CANMC.bit.SCB = 1; ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
|