打印

“简简单单DSP”系列学习活动—CAN学习及使用

[复制链接]
3763|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lilihua0721|  楼主 | 2011-10-4 23:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
“简简单单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;

相关帖子

沙发
耶稣欠筹了| | 2014-1-25 19:13 | 只看该作者
这只是初始化,发送和接收呢、???

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

470

帖子

2

粉丝