微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > 基于LPC2131嵌入式系统的CAN模块设计与实现

基于LPC2131嵌入式系统的CAN模块设计与实现

时间:04-07 来源:电子产品世界 点击:

  随着信息技术技术的飞速发展, ARM技术方案架构作为一种具备低功耗、高性能、以及小体积等特性的32位嵌入式微处理器,得到了众多的知识产权授权用户,其中包括世界顶级的半导体和系统公司。目前已被广泛的用于各类电子产品,汽车、消费娱乐、影像、工业控制、海量存储、网络、安保和无线等领域。被业界人士认为,基于ARM的技术方案是最具市场前景和市场优势的解决方案。

  现场总线CAN|0">现场总线CAN是为解决现代汽车中众多的电控模块之间的数据交换而开发的一种串行通信协议。由于其具有多主站依据优先权进行总线访问,采用非破坏性总线仲裁,可完成对通信数据的错误检验和优先级判别,数据长度最多为8个字节,传输时间短,受干扰的概率低,抗干扰能力较强,通信速率最高可达1Mbit/s等特点,它被广泛应用在汽车,工业,消费类电子等领域,而被公认为是最有前途的现场总线之一。

  基于ARM在嵌入式系统方面优势和CAN总线的广泛应用,目前越来越多的ARM处理器内部都自带了CAN控制器,极大的方便了开发人员对CAN总线的开发。但目前仍有些产品中的ARM处理器没有内置CAN控制器,为了能够适应节点间对数据传输所提出的实时性,可靠性的要求,同时又不改变原来的硬件结构,通过外扩CAN接口模块来实现CAN通信成了一个较为合适的选择。

  本文基于ARM7TDMI-S处理器LPC2131,对内部没有集成CAN控制器的处理器,设计了较为通用的CAN接口模块的硬件电路,并对CAN总线进行了可靠性设计,而且对基于嵌入式实时操作系统μCOS-II实现CAN通信,进行了嵌入式软件的设计,最终在实践中对CAN总线通讯的可靠性和可行性进行了验证。

  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的模式。

  软件设计

  对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的初始化模块

  在开始通讯之前,首先要在SJA 1000的各个功能寄存器进行设置,包括模式寄存器,波特率,时钟分频器,中断使能寄存器,滤波寄存器,输出控制寄存器。

  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(21+i,sentdata[i]); //TX数据

  WriteCan(1,0x01);//设置发送寄存器发送

  OS_EXIT_CRITICAL();

  }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top