LPC2131
Philips LPC2131是基于ARM7TDMI-S的高性能32位RISC微控制器,它一方面具有ARM处理器的所有优点:低功耗、高性能;同时又具有较为丰富的片上资源,非常适合嵌入式产品的开发。其特点如下:
·集成了Thumb扩展指令集。
·32KB可在系统中编程(ISP)的片内Flash和可在应用中编程(IAP)的8KB RAM,具有向量中断控制器。
·2个UART,2个I2C串行接口,2个SPI串行接口,2个定时器(7个捕获/比较通道),PWM单元可提供多达6个PWM输出,8通道10位ADC,实时时钟RTC,看门狗定时器WDT,48个通用I/O引脚。
·CPU时钟高达60MHz,具有片内晶体振荡器和片内PLL。
LPC2131内部没有集成CAN控制器,而无法利用CAN总线来进行通讯。为了使得LPC2131能够利用CAN总线进行通讯,可以通过外部扩展来拓展其功能。
硬件电路设计
由于LPC2131是由3.3V供电的ARM7TDMI-S微处理器,其各个IO引脚是3.3V的TTL电平,而且可以承受5V的电压。而独立CAN控制器SJA1000是5V供电,其各个IO口的电平是5V的TTL电平,所以二者兼容,其IO可以直接相连。
LPC2131与CAN控制器接口
LPC2131与CAN控制器接口如图1所示,LPC2131的P0.8~P0.15与SJA1000的AD0~AD7直接相连实现数据交互,P0.22,P0.25,P0.31,P0.23分别与SJA1000的ALE/AS,RD/E,WR,CS相连实现读写和片选,P0.30,P0.27分别与SJA1000的INT,RST相连实现中断和复位。LPC2131访问SJA1000时,可通过软件模拟SJA1000中所规定的读写时序来进行,SJA1000的模式引脚MODE通过VCC而置为高电平,使得SJA1000工作在Intel的模式。
图1 LPC2131与CAN控制器接口电路
CAN收发器与CAN总线接口
CAN收发器与CAN总线的接口如图2所示,其中SJA1000的TX0,RX0分别与CAN收发器的TXD,RXD相连,为提高CAN收发器82C250与CAN总线的接口部分的抗干扰能力,特在82C250 的CANH 和CANL 引脚串接一个共模扼流圈,以消除一定的共模干扰,而使得总线差分信号能够顺利通过。并且CANH和CANL分别通过一个磁珠与总线相连,以起到消除一定的高频干扰。同时CANH 和CANL与地之间并联了两个30pf 的小电容,可以起到滤除总线上的高频干扰和一定的防电磁辐射的能力。另外在两根CAN总线接入端与地之间分别接了一个TVS,当CAN 总线有较高的电压时通过TVS的击穿而接地,可起到一定的过压保护作用。82C250 的Rs引脚上接有一个斜率电阻以降低CAN总线的向外辐射。
图2 CAN收发器与总线接口电路
对于其他无内置CAN控制器的能够承受5V的TTL电平的处理器来说,只需改变与SJA1000的数据端口ALE/AS,RD/E,WR,CS,INT,RST相连接的引脚即可完成外扩CAN接口的硬件设计工作,否则在两者之间加一个逻辑电平转换的器件即可。
软件设计
对SJA1000的读写访问
由于LPC2131的48个引脚全是IO,所以首先需要通过软件模拟读写SJA1000的时序,来对SJA1000进行操作,进而完成CAN通讯功能。
依据SJA1000在Intel模式下的读写时序[4],可编写LPC2131通过CAN控制器SJA1000发送数据的写函数void WriteCan(uint8 Addr,uint8 Data)和接受CAN控制器所接受的数据的读函数uint8 ReadCan(uint8 Addr),其中Addr为SJA1000相应的寄存器的地址,Data为LPC2131所发送的数据,读函数ReadCan可返回所接受的数据。
CAN通讯的实现
要实现一个CAN通讯需要实现3个功能模块:对SJA1000的初始化模块;数据发送模块;数据接受模块。
·对SJA1000的初始化模块
在开始通讯之前,首先要在SJA1000的各个功能寄存器进行设置,包括模式寄存器,波特率,时钟分频器,中断使能寄存器,,滤波寄存器,输出控制寄存器。
uint8 IniSJA1000(uint8 BTR0,uint8 BTR1)
{
IO0CLR=CS;//片选SJA1000
WriteCan(0,0x09); //进入复位模式
WriteCan(31,0xe8); //设置时钟分频器
WriteCan(4,0xfd); //设置中断使能寄存器
WriteCan(16,AcceptCode1);//设置验收代码1
WriteCan(17,AcceptCode2);//设置验收代码2
WriteCan(18,AcceptCode3);//设置验收代码3
WriteCan(19,AcceptCode4);//设置验收代码4
WriteCan(20,MaskCode1); //设置验收屏蔽1
WriteCan(21,MaskCode2); //设置验收屏蔽2
WriteCan(22,MaskCode3); //设置验收屏蔽3
WriteCan(23,MaskCode4); //设置验收屏蔽4
WriteCan(6,BTR0); //设置总线时序寄存器1
WriteCan(7,BTR1); //设置总线时序寄存器2
WriteCan(8,0xfa); //设置输出控制积存器
WriteCan(0,0x08); //进入操作模式
OSCANMbox=OSMboxCreate(0);/建立CAN通
讯邮箱
if (OSCANMbox==NULL)
{
return FALSE;
}
return TRUE;
}
·数据发送模块
假设要发送的数据的ID存储在数组ID[4]中,数据存储在数组SendData[8]中,其发送模块程序如下所示,其中参数DLC为发送的字节数,FF为帧类型,即0为数据帧,1为远程帧。
void Tx(uint8 DLC,uint8 FF)
{
uint8 i;
OS_ENTER_CRITICAL();
If (FF==0x01)
{
WriteCan(16,DLC+0x80); //数据帧
}
else
{
?WriteCan(16,DLC+0xd0);//远程帧
}
WriteCan(17,ID[0]);
WriteCan(18,ID[1]);
WriteCan(19,ID[2]);
WriteCan(20,ID[3]);//TX标识码
for (i=0;i
WriteCan(1,0x01);//设置发送寄存器发送
OS_EXIT_CRITICAL();
}
·数据接受模块
根据电路图1,采用中断接受的方式来接受数据,LPC2131的P0.30设置为外部中断3,整个数据接受模块由数据接受函数void ReceiveData(uint8 *Rt)、中断处理函数Can_Exception(void)构成。当SJA1000接受到CAN总线数据,通过接收中断使得LPC2131产生外部中断3而使其进入中断处理函数,进而对接受到的数据进行处理。其中数据接受函数和中断处理函数如下:
void ReceiveData (void)
{
uint8 i, err,*Rt;
OS_ENTER_CRITICAL();
Rt=(uint8 *)OSMboxPend(OSCANMbox,0,&err);
//通过邮箱接受数据
for (i=0;i<13;i++)
ReceiveData[i]=*Rt++;//将接受到的数据存在
全局变量中供后续处理
OS_EXIT_CRITICAL();
}
void Can_Exception(void)
{
uint8 temp[13],i;
OS_ENTER_CRITICAL();
for (i=0;i<13;i++)
temp[i]=ReadCan(16+i);//读取CAN数据
OSMboxPost(OSCANMbox,(void *)temp); //将
CAN数据以邮箱发送到接受函数
EXTINT=0x08;//清楚ENT3
VICVectAddr=0;//中断返回
OS_EXIT_CRITICAL();
}
结语
以ARM芯片作为主控制器,CAN总线作为数据传输方式来进行通讯的嵌入式系统得到了越来越广泛的应用。同时CAN通讯的可靠性也成为影响系统性能的关键部分之一。本文以LPC2131为例,给出了一类微处理器与CAN控制器SJA1000之间的较为通用的硬件连接方法,对CAN总线进行了可靠性设计,并基于嵌入式实时操作系统μCOS-II进行了CAN通讯软件开发,该设计现已在工厂车间中的分布式监控系统中得到了应用,运行可靠、稳定。
参考文献:
1.Jean J.Labrosse 著,MicroC/OS-II The Teal-Time Kernel(SecondEdition) 邵贝贝等译.“嵌入式实时操作系统uC/OS-II(第二版)”,北京航空航天大学出版社,2003年5月
2.杜春雷,“ARM 体系结构与编程”,清华大学出版社,2003
3.LPC2131/LPC2132/2138 Product data,Philips Semiconductors.2004
4.SJA1000 Datasheet,Philips Semiconducto-rs. 1999
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』