学海荡舟手机网

主页 > 实用文摘 > 教育文摘_22 > > 详细内容

P87C591内嵌CAN控制器的应用设计_传感与控制论文

摘要:独立的can控制器芯片需要外接一个微处理器,接受外部cpu的控制才能运行。如果微处理器内部带有can控制器,无疑会大大简化应用系统的硬件设计,系统的可靠性也有很大提高 ,同时还可以大幅度降低生成成本。philips的新产品p87c591内部集成了can控制器。本文主要介绍如何利用p87c591进行can节点的设计和应用。

    关键词:p87c591 can 节点 pelican 应用设计

引言

can属于总线式串行通信网络。由于其独特的设计,与一般的通信总线相比,can总线的数据通信具有突出的可靠性、实时性和灵活性。can总线早已成为国际标准,其应用范围也从最初的汽车电控逐步扩展到工业控制的各个领域,成为最有前途的现场总线之一。can总线上的节点一般采用单片机外加can控制器的设计方法,不利于产品的集成和成本的降低。现在philips公司推出的p87c591集成了can控制器sja1000。本文将详细介绍基于p87c591的can智能节点软硬件设计及其应用。

1 p87c591简介

p87c591有44个引脚,是一个单片8位高性能微控制器,具有片内can控制器。它从mcs-51微控制器家族派生而来,采用了强大的80c51指令集并包括了philips半导体sja1000 can控制器的pelican功能。全静态内核提供了扩展的节点方式。振荡器可停止和恢复而不丢失数据。改进的1:1内部时钟分频器,在12mhz外部时钟速率是实现500ns指令周期。中央处理器cpu使用的操作数来自3个存储空间:16kb内部程序存储器,可扩展到64kb;512b内部数据存储器;最大64kb外部数据存储器。图1为p87c591的功能框图。

有关芯片的引脚定义和更多的扩展功能可参阅p87c591芯片资料,在此不多讲。芯片引脚p3.0和p3.1作为复用脚使用,除了具有普通c1单片机功能外,还可分别复用为can的rxd和txd输入输出脚。

p87c591包括philips半导体公司的独立can控制器sja1000具有的所有功能,并在此基础上扩展了以下功能:①增强的can接收中断,有接收缓冲区级的接收中断;用于接收中断的高优先级验收滤波器。②扩展的验收滤波器,8个滤波器用于标准帧格式,4个滤波器用于扩展帧格式;验收滤波器的“运行中改变”特性。

图1

2 pelican控制器的cpu之间的通信

cpu与can之间的接口功能框图如图2所示。80c51cpu接口将pelican与p87c591微控制器内部总线相连,通过5个特殊功能寄存器canadr、candat、canmod、cansta和cancon对pelican寄存器和ram区进行快捷的访问。由于支持大范围的地址,基于寻址的间接指针允许使用自动增加模式对寄存器进行快速访问,这样就将所需的sfr的数目减少到5个。需要注意的是,cancon和cansta根据访问方向的不同而具有不同的寄存器结构。pelican寄存器可以通过两种不同的访问访问。那些控制can主要功能最重要的几个寄存器,支持软件轮询,可以像单独的sfrs一样直接访问;而pelican模块中的其它部分通过一个间接的指针机制进行访问。为了达到高数据吞吐量,在使用间接寻址时也包含了地址增加的特性。

3 特殊功能寄存器

下面简要介绍5个特殊功能寄存器。

①candar。该读/写寄存器定义通过candat访问的pelican内部寄存器的地址,可以将其解释为对pelican的一个指针。对pelican块寄存器的读/写访问通过candat寄存器执行。通过地址自动增加模式,为can控制寄存器提供了快速的类似栈的读/写。如果canadr内当前定义的地址大于或等于32(十进制),canadr的内容在任意对candat读/写操作后自动增加。例如,将一个信息装入发送缓冲区可通过将发送缓冲区的首地址(112)写入canadr,然后将字节一个接一个写入candat。canadr超过ffh后复位为00h。如果canadr小于32,不会执行自动地址增加。即使candat执行读或写,canadr的值仍保持不变。这允许在pelican控制器的低地址空间进行寄存器轮询。

②candat candat作为一个读/写寄存器。特殊功能寄存器candat看上去是对canadr所选的can控制器内部寄存器的一个端口。对candat寄存器的读写等效于对该内部寄存器的访问。需要注意的是,如果canadr中当前的地址大于等于32,那么任何对candat的访问将使lanadr自动增加。

    ③canmod对pelican模块寄存器canmod是直接进行读写访问的,模式寄存器位于pelican模块中的地址00h。

④cansta根据访问方向的不同,cansta提供对pelican的状态寄存器和中断使能寄存器的直接访问。对cansta的读操作是对pelican的状态寄存器(地址2)进行访问。对cansta的写操作是对中断使能寄存器(地址4)进行访问。

⑤cancon。根据访问方向的不同,cancon提供对pelican的状态寄存器中断使能寄存器的直接访问。对cansta的cansta的读操作是对pelican的状态寄存器(地址2)进行访问。对cansta的写操作是对中断使能寄存器(地址4)进行访问。

4 基于p87c591的can节点接口应用电路

基于87c591的can节点接口应用电路十分简单,只需要附加一些can收发电路就可以进行can总线数据传输。can收发芯片采用philips公司的tja1050收发器。为了增强can总线节点的抗干扰能力 ,sja1000的tx0和rx0并不是直接与tja1050的txd和rxf相连,而是通过高速光电耦合器6n167与tja1050相连。这样,就可以很好地实现总线上的总can节点间的电器隔离。不过,应该特别说明的一点是,光电耦合器采用的是两个独立的电源供电,电源vcc和can_v必须完全隔离,否则光耦也就失去了意义。电源的完全隔离可采用小功率的电源隔离模块或通过带多路5v隔离输出的开关电源模块实现。这样虽然电路复杂些,但却提高了节眯的稳定性和安全性,具体节点电路如图3所示。

图3

5 cpu对pelican的软件访问

除了canmod、cansta、cancon等pelican常用特殊寄存器可以进行直接读/写访问除外,所有其它的can寄存器都需要进行间接寻址。canadr寄存器指向pelican寄存器的地址,在写操作时将要送到被寻址寄存器的数据写入candat;读操作时被寻址寄存器的数据可以从candat中读出。下面的例子说明了对pelican寄存器的直接和间接寻址功能。

/*模式寄存器的直接寻址*/

canmod=0x01;/*位rm置1进入复位模式*/

/*对位定时寄存器0和1的间接寻址*/

canadr=btr0;/*将地址设置到btr0寄存器*/

candat=0x45;/*将数据写入btr0寄存器*/

canadr=btr1;/*将地址设置到btr1寄存器*/

candat=0x2b;/*将数据写入btr1*/

下面给出上述节点电路的can初始化部分的程序。该程序可以直接应用到其它的系统程序之中。初始化部分的源程序如下:

#include<reg591.h>

void ini_can_controller(void)

{

canmod=0x01;/*进入复位模式,启动can初始化*/

p1m2=p1m2 i 0x02;/*引脚txdc设置为推挽模式*/

cansta=0x03;/*使能接收和发送中断*/

canadr=btr0;/*btr0和btr1编程为125kb/s,在12mhz条件下*/

candat=0x45;

canadr=btr1;/*tseg1=12,tseg2=3,sjw=2*/

candat=0x2b;/*用户可根据具体的can网络来调整btr0、brt1的参数*/

canadr=amr10;/*设定接收屏蔽寄存器的址*/

candat=0xff;/*bank1:与接收屏蔽寄存器1无关,允许任何数据通过滤波器*/

candat=0xff;/*bank1:与接收屏蔽寄存器无关,允许任何数据通过滤波器*/

candat=0xff;/*bank1:与接收屏蔽寄存器3无关,允许任何数据通过滤波器*/

candat=0xff;/*bank1:与接收屏蔽寄存4无关,允许任何数据通过滤波器*/

canadr=acfmode;/*设定接收滤波器模式寄存器的地址*/

candat=0x01;/*设定bank1为单滤波模式,标准帧*/

canadr=acfena;/*设定接收滤波器使能寄存器的地址*/

candat=0x01;/*使能bank1的滤波器*/

canmod=0x00;/*请求进入can的激活模式*/

while(cansta & 0x80);/*等待总线激活*/

}

结语

在can网络节点的设计中,使用集成的can控制器是大势所趋。本文从硬件和软件的角度对内嵌can控制器(sja1000)的p87c591进行了详细的介绍。不仅给出了p87c591 can应用的外围电路接法,还给出了应用的初始化程序,这为以后的系开发提供了一个很好的基础。