5726|0

180

帖子

0

TA的资源

五彩晶圆(中级)

楼主
 

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

   

 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表