理论教育 eCAN配置步骤详解

eCAN配置步骤详解

时间:2023-06-15 理论教育 版权反馈
【摘要】:操作eCAN前必须进行配置,以下步骤必须在解除EALLOW保护情况下进行:1)使能CAN模块时钟。3)复位以后,CCR位和CCE位置为1。4)用适当的时间值编写CANBTC寄存器。8)验证CCE位已清除,表示CAN模块已经完成配置。CAN模块开始处理CAN信息发送的整个过程。成功发送之后,CAN模块置位该标志位。4)设置邮箱方向寄存器中对应标志位,把邮箱配置为一个接收邮箱。如果CANRMP位置为1,则数据可能已经损坏。

eCAN配置步骤详解

操作eCAN前必须进行配置,以下步骤必须在解除EALLOW保护情况下进行:

1)使能CAN模块时钟。

2)设置CANTX和CANRX引脚来实现CAN功能:

●写CANTIOC.3~0=0x08。

●写CANRIOC.3~0=0x08。

3)复位以后,CCR位(CANMC.12)和CCE位(CANES.4)置为1。这允许用户配置位定时配置寄存器(CANBTC)。

如果CCE位置位,则执行下一步;否则,将CCR位置位并且等待直到CCE位置位。

4)用适当的时间值编写CANBTC寄存器。确保TSEG1和TSEG2的值不为0。如果它们是0,模块就不能脱离初始化模式。

5)对于标准模式,此时编写接收屏蔽。例如:写LAM(3)=0x3C0000。

6)编写主控寄存器(CANMC)如下:

CCR(CANMC.12)=0。

PDR(CANMC.11)=0。

DBO(CANMC.10)=0。

WUBA(CANMC.9)=0。

CDR(CANMC.8)=0。

ABO(CANMC.7)=0。

STM(CANMC.6)=0。

SRES(CANMC.5)=0。

MBNR(CANMC.4~0)=0。

7)将MSGCTRLn寄存器的所有位全部初始化为0。

8)验证CCE位已清除(CANES.4=0),表示CAN模块已经完成配置。

以上步骤完成了CAN模块基本功能的配置。

1.配置发送邮箱

要发送信息,需要执行以下步骤以配置邮箱(以邮箱1为例):

1)将CANTRS寄存器中对应的位清零:清CANTRS.1=0(由于向CANTRS写入0无效,所以应该置位CANTRR.1并且等待直到CANTRS寄存器的位1清零)。如果置位RTR位,则CANTRS位可以发送远程帧。一旦发送远程帧,CAN模块将清零邮箱的CANTRS位。同一个节点可以用来向其他节点请求数据帧。

2)通过清除邮箱使能寄存器(CANME)对应的位来禁止邮箱:CANME.1=0。

3)装载邮箱的信息标识符寄存器(MSGID):对于正常发送邮箱应清除AME位(MS⁃GID.30=0)和AAM位(MSGID.29=0)。在正常运行过程中一般不修改该寄存器。它仅在邮箱禁止时才可以修改。例如:写MSGID(1)=0x15AC0000。

将数据长度写入信息控制域寄存器(MSGCTRL.3~0)的DLC区。通常,RTR标志(MSGCTRL.4=0)清零。在正常运行过程中一般不修改MSGCTRL寄存器,它仅在邮箱禁止时才可以修改。(www.daowen.com)

清除CANMD寄存器中对应的位来设置邮箱方向:CANMD.1=0。

4)设置CANME寄存器中对应的位,从而使能邮箱:CANME.1=1。

以上为配置邮箱1为发送模式的过程。

发送一条信息的具体步骤如下(以邮箱1为例):

1)写信息数据到邮箱数据区域。由于配置时将DBO(CANMC.10)设置为0,MSGC⁃TRL(1)设置为2,所以数据被存放在CANMDL(1)的2个最高有效字节,写CANMDL(1)=xxxx0000h。

2)将发送请求寄存器的对应标志位置1(CANTRS.1=1),从而启动信息的发送。CAN模块开始处理CAN信息发送的整个过程。

3)等待对应邮箱的发送应答标志位置位(CANTA.1=1)。成功发送之后,CAN模块置位该标志位。

4)在成功发送或发送终止后,模块复位CANTRS标志位为0(CANTRS.1=0)。

5)为了进行下一次发送,必须将发送应答位清零。置CANTA.1=1,等待,直到读到的CANTA.1为0。

6)要用同一个邮箱发送其他信息,必须更新邮箱RAM数据。置CANTRS.1标志位来启动下一次发送。写入邮箱RAM的数据可以为半字(16位)或全字(32位),但模块总是从偶数边界地址处返回32位值。CPU要接受所有32位或它的一部分。

2.配置接收邮箱

要配置邮箱接收信息,需要执行以下步骤(以邮箱3为例):

1)通过清除邮箱使能寄存器(CANME)对应的位来禁止邮箱:CANME.3=0。

2)将选定的标识符写到对应的信息标识符寄存器(MSGID)。标识符扩展位必须适合期望的标识符。如果使用接收屏蔽寄存器,接收屏蔽使能位AME必须置1(即MSGID.30=1)。例如:MSGID(3)=0x4F780000。

3)如果AME位已设置为1,则必须对对应的接收屏蔽寄存器编程:LAM(3)=0x03C00000。

4)设置邮箱方向寄存器中对应标志位(CANMD.3=1),把邮箱配置为一个接收邮箱。确保该操作不会影响此寄存器中的其他位。

5)如果邮箱中的数据被保护,则需对过写保护寄存器(CANOPC)进行编程,如果不允许信息丢失,则该保护非常有用。如果置位CANOPC,则需用软件确保配置一个附加邮箱(缓存邮箱)来存放“溢出”的信息;否则,信息可能在没有告知的情况下丢失,置CANO⁃PC.3=1。

6)通过设置邮箱使能寄存器(CANME)中对应的标志位来使能邮箱:应该通过读CANME并回写(CANME=0x0008)来确保没有其他标志位被意外改变。

该对象现在被设置为接收模式,任何针对该对象的输入信息将被自动处理。

接收一条信息步骤如下(以邮箱3为例):

当接收到一条信息时,接收信息悬挂寄存器(CANRMP)的对应标志位将置为1,并且启动一个中断。届时,CPU将从邮箱RAM读取信息。在CPU从邮箱读取信息之前,应该先清零CANRMP位(写CANRMP.3=1来清零)。CPU也应该检测接收信息丢失标志位(CANRML.3=1)。根据应用程序的要求,CPU决定如何处理这种情况。

在读数据之后,CPU需要检测CANRMP位是否被模块重新置位。如果CANRMP位置为1,则数据可能已经损坏。CPU需要重新读数据,因为在CPU读旧数据的时候接收到了一条新数据。

过载情况的处理:

如果CPU不能及时处理重要信息,则为多个邮箱配置同一标识符是明智的。以下是对象3、4及5具有相同标识符并且分享相同屏蔽寄存器的例子。对于标准模式,屏蔽寄存器是LAM(3)。对于eCAN,每一个对象都有自己的LAM:LAM(3)、LAM(4)和LAM(5),它们每一个都需要编程为同一值。

为了确保信息不丢失,对象4和5置位CANOPC标志位将防止覆盖未读的信息。如果CAN模块需要存储一条接收到的信息,将首先检测邮箱5。如果该信箱为空,信息将存储在那里。如果对象5的CANRMP标志位置位(即邮箱已占用),CAN模块将检查邮箱4的情况。如果那个邮箱也忙,则模块将检查邮箱3,由于邮箱3的CANOPC标志位未置位,信息将存储在其中。在此之前,如果没有读出邮箱3的内容,则将会置位邮箱3的CANRML标志位,而这可能启动一个中断。

一个好的方法是让对象4产生一个中断告诉CPU立即读邮箱4和5。该技术对多于8B的数据信息也很有用。在这种情况下,信息所需要的所有数据都可以收集到邮箱中,并且立刻读取。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈