历史上的今天
返回首页

历史上的今天

今天是:2025年01月25日(星期六)

2021年01月25日 | 基于LPC2131嵌入式系统的CAN模块设计与实现

2021-01-25 来源:eefocus

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


现场总线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的模式。

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

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)

{

u

int8 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通讯软件开发,该设计现已在工厂车间中的分布式监控系统中得到了应用,运行可靠、稳定。


推荐阅读

史海拾趣

Broyce Control公司的发展小趣事

随着技术的不断升级和产品线的完善,Broyce Control开始将目光投向国际市场。80年代,公司成功打入欧洲市场,为多家跨国企业提供优质的电气和电子产品。随后,Broyce Control又陆续进入北美和亚洲市场,通过设立分公司和建立销售网络,不断提升品牌影响力和市场份额。在国际市场的竞争中,Broyce Control凭借其卓越的产品质量和专业的服务赢得了客户的广泛赞誉。

集创北方(CHIPONE)公司的发展小趣事

在显示芯片领域,集创北方是国产化替代的积极推动者。公司凭借自身在显示芯片领域的深入研究和创新实力,成功打破了国外厂商的技术垄断,为国内厂商提供了更多选择。同时,集创北方还积极参与行业标准制定,推动了国内显示芯片产业的健康发展。

BUSSMANN公司的发展小趣事

1992年,Bussmann开始了第一款芯片保险丝的开发工作。这款保险丝将可熔性材料沉降到陶瓷基底上,大小只有3mm*1.5mm,可以通过自动装配机安装到印刷电路板上。这一创新不仅大大提高了熔断器的性能和可靠性,还降低了生产成本,为电子行业的发展注入了新的活力。

福斯特(FIRST)公司的发展小趣事
使用专业的诊断仪读取ESP系统的故障码,根据故障码进行针对性的排查和维修。
Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

银河微电自成立之初,便专注于半导体分立器件的研发与生产。面对国内外市场的激烈竞争,公司坚持自主创新,不断投入研发力量,终于在某关键技术上取得了重大突破。这一技术突破不仅提高了产品的性能,还降低了生产成本,使得银河微电的产品在市场上更具竞争力。凭借这一技术优势,银河微电逐渐在行业中树立起了自己的地位。

All Sensors公司的发展小趣事

随着电子行业的快速发展和市场竞争的加剧,All Sensors面临着越来越多的挑战。然而,公司始终保持着敏锐的市场洞察力和创新精神。通过与客户紧密合作,仔细聆听客户需求,All Sensors不断开发出适应市场变化的新产品和技术。同时,公司还注重提升产品质量和服务水平,赢得了客户的广泛认可和信赖。

这些故事只是All Sensors在电子行业发展历程中的一部分缩影。作为一家全球领先的传感器技术领军企业,All Sensors将继续秉承创新精神,不断推动电子行业的发展和进步。

问答坊 | AI 解惑

2009年全国大学生电子设计大赛预测题

如果感觉有用,大家不妨下下来研究一下啊!这是网上流传的,不知道是不是真的,请大家看看在说啊!…

查看全部问答>

start.s文件的问题

我用的是u-boot1.3.2,开发板是s3c2440,所以用的是cpu/arm920t/start.s,如果谁看过这个文件,请帮忙回答下以下几个问题: 1. 127行有如下几句话,请问一下这个0x0是RAM地址还是FLASH地址?    ldr        r0, =_s ...…

查看全部问答>

protel 中如何绘制点阵

最近想做一个PCB板,要用到8*8的点阵,但是protel的库中没有点阵,要自己制一个,但是制成之后与实际的芯片如何一致,如长度,引脚之间的距离等。制成PCB之后如何能实现与实际的点阵大小,长度引脚等特点一致。做了好长时间也没做出来,希望专业人 ...…

查看全部问答>

关于蓝牙传输不稳定

  我用的是CSR的BC6的蓝牙芯片,平台是S3C2440+WIN CE的,上了CSR的驱动。BC6是用串口与主机通信,现在跑文件传输跑300K以下的来是没问题,跑300K以上的就老传到一半就没反应了,会不会是驱动问题,听给我们提供芯片的公司说微软的芯片只支持BC4 ...…

查看全部问答>

教你读懂手机电路图

不少同行反映,一部故障手机该换的元件都换了,但就是修不好机,大多数情况是对手机电路掌握不透彻,不会读和分析手机电路图,\"一吹二洗三代换\",三板斧下去,固然能解决一些问题,但深入下去就束手无策了。 很多人看到电路图就头痛,觉得毫无头 ...…

查看全部问答>

再次请教版主

版主,我现在对FSMC好迷惑啊。不知道有没有什么资料。 现在的问题是:    FSMC在bank1中的那4个片选NE1~4是如何判断接法?比如,为什么LCD液晶的片选要接NE4?     接其它的片选不行吗?那3个都是接什么的啊? https ...…

查看全部问答>

低功耗

低功耗是加进来了,可是需要10ms唤醒一次的,这样的低功耗有意义吗?能降低功耗吗? 总觉得10ms就唤醒太频繁了。…

查看全部问答>

winavr+avrstudio环境,用c语言,编译时要求makefile,该怎样操作?

winavr+avrstudio环境,用c语言,编译时要求makefile。 makefile文件是否只能在winavr中产生,在avrstudio中能否生成? 能否通过设置自动生成? 望高手指点!…

查看全部问答>

PIC16F877的SPI口应用问题

大家好,我是新人。最近我想用PIC16F877读MAX6675的转换数值。MAX6675会一次将转换好的16位数据通过SPI输出给单片机。我想请问这样是不是就不能用单片机自带的SPI引脚了,因为缓冲器只能接收8位二进制数。是不是必须用其他的引脚来模拟SPI的时序呢 ...…

查看全部问答>

spi 驱动74hc595的问题

我用spi方式驱动74hc595, 595接的是共阳数码管 当我使用ckp=1// 空闲时是高电平         cke=1//从低电平到高电平发数据 数码管显示没问题 当我使用ckp=0;//空闲时是低电平       & ...…

查看全部问答>