| 
 
| “简简单单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;
 | 
 |